Forum: Mikrocontroller und Digitale Elektronik Frage zu AVR/Assembler 16-Bit Zahlen aus Flash lesen


von Holger (Gast)


Lesenswert?

Hallo,

ich habe eine Frage zum AVR(ATMEGA32)/Assembler und dem Einlesen von 
Zahlenwerten.

Ich möchte im Flashspeicher 16-Bit Zahlenwerte ablegen, die jeweils eine 
zeitdauer in Milisekunden darstellen.

pausen:    .dw 1000,10000,2000,0


Wenn der Wert 0 eingelesen wird, soll das Programm ersteinmal in einer 
Endlosschleife bleiben.

Die Zahlenwerte sollen eingelesen werden und das Lowbyte soll in R24 und 
das Highbyte in r25 gespeichert werden.


Mit

LDI ZL,LOW(pausen*2)
LDI ZH,HIGH(pausen*2)

setze zeige ich mit Z auf pausen.

Wie kann ich aber nun die Zahlen einlesen und in R24/R25 speichern?

Ich verstehe die Anwendung des LPM register,Z+ bzw LMP register bei 
16-Bit-Zahlen nicht.



Holger

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

1
LPM Z+, R24 // Erstes Byte in R24
2
LPM Z+, R25 // Zweite Byte in R25
Z+ gibt dem AVR den Befehl die Adresse danach automatisch um 1 zu 
erhöhen, dann liest du das nächste Byte und hast die ersten 16bit.

von spess53 (Gast)


Lesenswert?

Hi

Wenn schon, dann 'lpm r25,Z+'....
Und nicht vergessen:  'ldi ZL,Low(pausen<<1)'
                      'ldi ZH,High(pausen<<1)'

MfG Spess

von Holger (Gast)


Lesenswert?

>>Und nicht vergessen:  'ldi ZL,Low(pausen<<1)'
>>                      'ldi ZH,High(pausen<<1)'

Moin,

was machen diese beiden Befehle genau?


Holger

von spess53 (Gast)


Lesenswert?

Hi

Du solltest dich erst mal etwas mit den Assemblerbefehlen beschäftigen. 
Ansonsten im AVR-Studio den Cursor auf den Befehl setzen und F1 drücken. 
Die Assmblerdirektiven und Expressions sollte man natürlich man 
natürlich auch kennen.

>was machen diese beiden Befehle genau?

Der lädt das Z-Register mit der Adresse des (ersten) 16-Bit-Wertes.

MfG Spess

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Das gleiche wie
1
LDI ZL,LOW(pausen*2)
2
LDI ZH,HIGH(pausen*2)

von Hannes Lux (Gast)


Lesenswert?

> was machen diese beiden Befehle genau?

Dasselbe wie:

LDI ZL,LOW(pausen*2)
LDI ZH,HIGH(pausen*2)

Ob nun mit zwei multiplizieren oder um eine Bitposition nach links 
verschieben, das ist in diesem Fall gehupft wie gesprungen, denn das 
rechnet nicht der AVR, sondern der Präprozessor des Assemblers. ;-)

...

von Holger (Gast)


Lesenswert?

Hallo,

danke. Wieder was gelernt ;-)


mfg
Holger

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
Noch kein Account? Hier anmelden.