Hallo zusammen! Ich möchte in Assembler einen String im Flash abspeichern (ATMega8). Der soll aber 'ne länge von ca 200 Zeichen haben. Ich hab das versucht mit ".db" und das ganze in den Z-Pointer laden, aber bei ca. 128 Zeichen hörts auf. Ich schätze mal, dass R31 nicht benutzt wird. Kann man das irgendwie aktivieren? Gruß Steven
Steven W. wrote: > Hallo zusammen! > > Ich möchte in Assembler einen String im Flash abspeichern (ATMega8). Der > soll aber 'ne länge von ca 200 Zeichen haben. > > Ich hab das versucht mit ".db" und das ganze in den Z-Pointer laden, > aber bei ca. 128 Zeichen hörts auf. Ich schätze mal, dass R31 nicht > benutzt wird. Kann man das irgendwie aktivieren? > > > Gruß Steven Wie hast du das denn geladen? So hier? ldi ZL, low(pointer) ldi zH, high(pointer) ?
Steven W. wrote: > ldi ZL, low(text*2) > ldi zH, high(text*2) > > ja Das sollte dann eigentlich funktionieren. Poste doch mal den ganzen Code!? Brauchst du das für ne LCD-Ausgabe? wie liest du das denn aus? mit lpm r, z+? Oder inkementierst du selber?
Also ich poste jetzt mal nur ein paar Zeilen, also das was damit zu tun hat. Sonst wirds unübersichtlich Ein LCD ist es keins.Es ist ein Dotmatrix LED-Modul...
Hast du da mal Debug drüberlaufen lassen? Eventl. eine '0' durch einen Zeilenumbruch o. Ä. im string? Der Sprung zu TextOut1 funktioniert nicht, da TextOut1 nicht vorhanden ist. Und warum lädst du den Pointer schon so zeitig? Nicht, dass dir irgendein Befehl davor R30/31 überschreibt. Du machst "push Stelle". Wo ist das zugehörige POP? Stacküberlauf??? Und wo ist der Rücksprung aus TextOut2? Gibts auch ne Main-Loop?
Hab jetzt Textout mit eingefügt (Habs vergessen...) nach 127 Zeichen ist zu Ende. Eine Null oder ein Zeilenumbruch hab ich nicht im String Ach Gott!!! ich habe IN geschrieben innerhalb des Strings an dem liegt es, denn es wird vom Compiler als Befehl erkannt (blau markiert). Wie kann ich das umgehen? Mir fällt gerade ein, dass ich folgendes machen könnte db. "ein haus i","n Deutschland",0 gibts da noch was anderes?
Fehlalarm!!! Das mit dem IN geht nicht. Ich kann nicht Debuggen auf'm ATmega8, oder? Main Loop gibts ja pop stelle ist im TextOut1, sorry!
Steven W. wrote: > Fehlalarm!!! > > Das mit dem IN geht nicht. > > Ich kann nicht Debuggen auf'm ATmega8, oder? > > Main Loop gibts ja > > pop stelle ist im TextOut1, sorry! Liegts an dem IN? Weiß ja nicht, was für nen Assembler du verwendest. Probier mal .DB @"Dein String mit IN", 0 bzw. das ganze mal mit einfachen Anführungszeichen. Debuggen geht höchstens über deine Entwicklungsumgebung.
>Debuggen geht höchstens über deine Entwicklungsumgebung.
Soweit ich weiß, kann mann den ATMega8 nicht debuggen.
Ich probiers mal aus, ich poste dann morgen weiter.
Danke schonmal!
Gruß Steven
> als Befehl erkannt (blau markiert).
also dem compiler ist die Farbe ziemlich egal, das ist bloss eine
Eigenart der IDE - ich denke der compiler versteht schon was du von ihm
willst auch wenn es blau ist.
Steven W. wrote: >>Debuggen geht höchstens über deine Entwicklungsumgebung. > Soweit ich weiß, kann mann den ATMega8 nicht debuggen. > > Ich probiers mal aus, ich poste dann morgen weiter. > > Danke schonmal! > > Gruß Steven Das ist korrekt. Ich meinte eher ein offline-Debuggen. Also ich mach sowas über VMLAB. Da wird quasi der Controller simuliert.
Morgen allerseits! @Micha Simulieren, sags doch gleich... Laut AVR-Studio werden die 200 Zeichen im Flash komplett abgelegt. (Memory Window) Am "in" liegts definitiv nicht, das wird warscheinlich wirklich nur ne Stringerkennung vom AVR-Studio sein. Mein Problem: Es werden nur 127 Zeichen ausgegeben nach dem 128sten ist schluss, obwohl es laut AVR-S. im Flash steht. Kann man überhaupt mehr als 127 Zeichen (auf einmal) Speichern? Sollte doch gehen oder? Gruß Steven
Schreib mal spaßenshalber nicht lpm.. z+ sondern nur lpm reg und anschließend adiw r31:r30,1
Steven W. wrote: > Genau das gleiche Problem! > > noch ne Idee? Was ist denn das? cp FDigit, A Was ist FDigit und was ist A? Bzw. wo zeigen die hin.
Und wieso beendest du die TextOut-Funktion nach 8 Ausgaben??? Ich habs jetzt mal ohne die Zeilen ; rcall Aout ; inc r16 ; cpi r16, 8 ; breq TextOutx simuliert. Da werden exakt alle Zeichen ausgegeben. Also müsstest du in diesen Zeilen mal nach dem Fehler suchen.
Ich hab jetzt mal den Quellcode auskommentiert und komplett hochgeladen. Eine kurze Erklährung steht am Ende Mach ich das nächste mal gleich.
änder mal das BRGE nach BRSH. Das BRGE ist eine Signed-Instruktion - könnte also mit der 128 zusammenhängen.
Ha super, Danke!!! Es funktioniert... Mir ist das noch gar nicht aufgefallen, dass es Signed und Unsigned vergleiche gibt... Danke nochmal! Gruß Steven
Steven W. wrote: > Ha super, Danke!!! > Es funktioniert... > > Mir ist das noch gar nicht aufgefallen, dass es Signed und Unsigned > vergleiche gibt... > > Danke nochmal! > > Gruß Steven Büdde büdde, schau mal hier: http://www.atmel.com/dyn/resources/prod_documents/DOC0856.PDF Das ist eine ganz übersichtliche Auflistung find ich.
Vieleicht find ich das nächste mal den Fehler selbst... Danke für das ISet! Gruß Steven
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.