www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 9-Bit Wert addieren


Autor: cyberlink (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
in    XL, PinC   ;get start address
com   XL
clr   XH
sbis  PinE, PE2  ;9th bit
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

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: cyberlink (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, mal schauen ob ich das richtig verstanden habe...
clc
add XL, 8
adc XH, 0

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

Autor: cyberlink (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ups... in tischkante beiss Zahl erst in ein Register laden wäre 
sinnvoll...
ldi   tempL, 8
ldi   tempH, 0
clc
add   XL, tempL
adc   XH, tempH

jetzt sollte es doch eigentlich laufen...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>add XL, 8
>adc XH, 0

Diese Befehle funktionieren aber nicht mit Konstanten.

MfG Spess

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: cyberlink (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Harald M. (mare_crisium)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Spess

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

mare_crisium

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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)

subi XL, low(-8)
sbci XH, high(-8)


Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.