Forum: Mikrocontroller und Digitale Elektronik 9 Bit in 8 Bit-Register laden mit Studio 4.12


von Jürgen (Gast)


Lesenswert?

Hallo,

ich möchte ein ASM-File von der Codesammlung mit AVR-Studio 4.12 
assemblieren
und erhalte folgende Fehlermeldungen:

>C:\src\Timer_test\Timer_test.asm(41): error: Operand(s) out of range in 'ldi 
>r18,0x100'
>C:\src\Timer_test\Timer_test.asm(71): error: Operand(s) out of range in 'ldi 
>r18,0x100'

Die Fehler bezieht sich auf folgende Zeile im Quelltext:

>  ldi  prescaler, debounce

wobei Prescaler oben mit r18 und debounce mit 256 Definiert wird.

Frage:

Nutzt jemand einen Assembler der es zulässt 16Bit Werte in 8Bit-Register 
zu schreiben und wenn ja, welches Byte wird dann tatsächlich übertragen,
High oder Low-Byte ?

Übrigens handelt es sich um
Beitrag "Die genaue Sekunde / RTC"

Gruss Jürgen

von Marc G. (marc_gauger)


Lesenswert?

Hi,
also zunächst kannst du nicht 9 bit in ein 8 bit-Register speichern, da 
es nur 8 bit hat.

Du kannst aber 9 bit in zwei 8 bit-Register speichern dazu musst du die 
Zahl zerlegen.
debounce hat bei deinem Beispiel den Wert 256 = 0b100000000

Wenn du nun die unteren 8 bits in das Register R18 speichern willst:
ldi R18, LOW(debounce); R18 = 0b00000000

Und so speicherst du die oberen bits (also in deisem Falle die 0b1) nind 
Regsiter R19:
ldi R19,HIGH(debounce); R19 = 0b00000001

Ich hoffe ich habe dir damit geholfen. Somit kannst du also Konstante 
Zahlen bis 16 bit in zwei Register speichern.

Gruß Marc

von Jürgen (Gast)


Lesenswert?

Das ist mir alles vollkommen klar ;-)

Mir geht es nicht um die Aufteilung von 16Bit Zahlen in 2 Register, 
sondern um die Syntax.

Nochmal:
Da es anscheinend Assembler gibt die den Befehl
"ldi r16,$100" zulassen, möchte ich wissen was in R16 landet, $00 oder 
$01

von Benedikt K. (benedikt)


Lesenswert?

Es landet 0 im Register. Es landet immer Modulo 256 in einem 8bit 
Register.

von Jürgen (Gast)


Lesenswert?

Vielen Dank,

genau das wollte ich wissen :-)

von Peter D. (peda)


Lesenswert?

Diese Fehlermeldung wurde erst sehr spät in den AVR Assembler 
aufgenommen.

Für den neuen Assembler muß daher die korrekte Syntax lauten:
1
ldi  prescaler, low(debounce)


Peter

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.