Forum: Mikrocontroller und Digitale Elektronik 9-Bit Wert addieren


von cyberlink (Gast)


Lesenswert?

Hallo,

Stehe hier vor einem (ziemlich blöden) Problem... Addition in Assembler, 
8-Bit werte sind ja einfach mit ADD und ADC zu berechnen.

Aaaber....
Problem: Ich lese von einem DIP-Schalter einen Wert ein
1
in    XL, PinC   ;get start address
2
com   XL
3
clr   XH
4
sbis  PinE, PE2  ;9th bit
5
inc   XH

Zuerst die ersten 8 Bytes, dann das neunte Byte hinterher. Wert von 
0-512.
Und jetzt will ich diesen Wert um die Zahl 8 erhöhen, also wenn vom 
Eingang z.B. 20 gelesen werden, soll der Wert dann 28 sein usw...

Irgendwie blick ich da nicht ganz durch, vor allem XL und XH sind mir 
nicht ganz klar... bis jetzt sind meine Assemblerkenntnisse noch nicht 
so weit, komme eher aus der C-Welt.

Hintergrund des ganzen: den DMX-Demultiplexer (Quellcode ist auch daher) 
von hier http://www.hoelscher-hi.de/hendrik/light/demux.htm so 
modifizieren, dass die eingestellte Adresse für den Startkanal um 8 
verschoben ist.

Hoffe ihr könnt mir mit diesem vermutlich doch recht simplen Problem 
helfen!

cyberLink

von Floh (Gast)


Lesenswert?

du kannst recht simpel eine 16 bit-Addition vornehmen:

clc
add operand_1_low, operand_2_low
adc operand_1_high, operand_2_high

was du jetzt davor in die jeweiligen Operanden gespeichert hast, ist ja 
deine Sache :-)

von cyberlink (Gast)


Lesenswert?

Ok, mal schauen ob ich das richtig verstanden habe...
1
clc
2
add XL, 8
3
adc XH, 0

Läuft das so? Die Zahl 8 ist ja Low 8 und High 0, müsste also von daher 
stimmen oder?

von cyberlink (Gast)


Lesenswert?

ups... in tischkante beiss Zahl erst in ein Register laden wäre 
sinnvoll...
1
ldi   tempL, 8
2
ldi   tempH, 0
3
clc
4
add   XL, tempL
5
adc   XH, tempH

jetzt sollte es doch eigentlich laufen...

von Karl H. (kbuchegg)


Lesenswert?

Den clc kannst du dir normalerweise sparen.
Der ADD berücksichtigt es sowieso nicht, wenn Carry gesetzt wäre. Drum 
gibts ja auch einen ADD und einen ADC

von Spess53 (Gast)


Lesenswert?

Hi

>add XL, 8
>adc XH, 0

Diese Befehle funktionieren aber nicht mit Konstanten.

MfG Spess

von Uwe .. (uwegw)


Lesenswert?

Genau, der AVR kann mit add/adc nur Register addieren.
Ansonsten gäbe es noch ADIW. Das macht genua das was du willst 
(Konstante zu 16bit-Zahl addieren), allerdings mit der Einschränkung auf 
die letzten vier Registerpaare (R25:R24, X,Y,Z)...
(Wenn eins dieser Registerpaare noch frei ist, kannst du ADIW nehmen. 
Wenn nicht, dann bleib ruhig bei der add/adc-Variante. Das ist bloß ein 
Befehl mehr im Flash. Schneller ist es nicht, ADIW braucht auch zwei 
Takte.)

von cyberlink (Gast)


Lesenswert?

Wie schon gesagt:

cyberlink schrieb:
> Zahl erst in ein Register laden wäre
> sinnvoll...
> ldi   tempL, 8
> ldi   tempH, 0
> clc
> add   XL, tempL
> adc   XH, tempH

Habs schon selbst gemerkt dass Konstanten + ADD is nix gut ;-)

Danke nochmal für die schnelle Hilfe!

cyberLink

von Spess53 (Gast)


Lesenswert?

Hi

Für einige Registerpaare (r25:24...r31:r30) gibt es auch noch 'adiw' um 
einem 16-Bit-Wert eine Konstante zu addieren.

MfG Spess

von Harald M. (mare_crisium)


Lesenswert?

@Spess

Genau! Der kürzeste Weg ist
...
in xl,..
clr xh
adiw xh:xl,0x0008
...
fertig.

mare_crisium

von Peter D. (peda)


Lesenswert?

Spess53 schrieb:
>>add XL, 8
>>adc XH, 0
>
> Diese Befehle funktionieren aber nicht mit Konstanten.

Dann nimmt man eben etwas Mathematik: A + B = A - (-B)
1
subi XL, low(-8)
2
sbci XH, high(-8)


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.