Du kannst keine Register als "16 Bit" nutzen alle Register sind 8 Bit breit.
X,Y,Z Register sind für die Adressierung von Ram und Flash gedacht, nicht um 16 Bit zu rechnen.
Mann kann sie zwar auch als "normale" Register nutzen, aber man sollte sie schon für die oben genannte Aufgaben belassen.
Ich habe schon keine ahnung wie ich 1000 (2 register) mit einer zahl die auch
in 2 registern steht vergleichen, geschweige denn abziehen kann
Code:
.equ eine_grosse_Zahl = 1000
ldi R16,HIGH(eine_grosse_Zahl)
ldi R17,LOW(eine_grosse_Zahl)
Hiermit hast Du die Zahl 1000 auf zwei Register aufgeteilt.
Es geht auch direkt:
Code:
ldi R16,HIGH(1000)
ldi R17,LOW(1000)
Jetzt mal angenommen in R2 und R3 steht eine Zahl drin, die Du z.B. beim AD Wandlung eingelesen hast in R2 ADCL in R3 ADCH.
Beide Zahlen vergleichen:
Code:
cp R2,R17 ; Zuerst beide Low Bytes vergleichen
cpc R3,R16 ; Jetzt beide Highs UND den Carry dazu!!!
Wenn Jetzt Carry gesetzt ist ist R2,R3 kleiner als R17,R16, sonst Größer oder gleich.
Subtraktion geht genauso nur nicht mit cp,cpc sondern mit sub,sbc.
Ich mußte früher, wo ich noch in der Schule war ohne Taschenrechner arbeiten
und mußte alles per Hand rechnen, es ging auch etwa in der Art.
Beispiel:
Hier geht mal genauso vor:
Letzte Zahl:
3 - 6 geht nicht weil 3 kleiner als 6 also eine 1 vor die 3 und "Carry" Setzen
13 - 6 -> 7
Nächste Zahl:
6-5 -> 1 aber da "Carry" gesetzt war nochmal 1 ergibt 0; hier kein Carry da Ergebnis nicht negativ war.
Nächste Zahl:
1-0 -> 1 kein "Carry" bleibt also 1
Hiermit haben wir 107 erhalten.
Genauso geht es mit Rechnen über mehrere Register, es ist egal ob Du nur 2 Register hast 3,5 oder 10
Ich hoffe das war jetzt klarer.
Gruß Sebastian
Lesezeichen