Hallo erst einmal, bin dabei mich in Assambler einzuarbeiten.Und gehe
das AVR Tutorial durch. Nun habe ich ein Verständnisproblem, mit
folgendem Code, nach *Int_to_ASCII_schleife:* folgt* ldi temp6, -1+'0'*
was ist das für eine Konstante _-1+'0'_?
MFG Roderrich
Int_to_ASCII:
push ZL ; Register sichern
push ZH
push temp5
push temp6
ldi ZL,low(Tabelle*2) ; Zeiger auf Tabelle
ldi ZH,high(Tabelle*2)
ldi temp5, 10 ; Schleifenzähler
*Int_to_ASCII_schleife:*
*ldi temp6, -1+'0' * ; Ziffernzähler zählt direkt im
ASCII Code
lpm z0,Z+ ; Nächste Zahl laden
lpm z1,Z+
lpm z2,Z+
lpm z3,Z+
Int_to_ASCII_ziffer:
inc temp6 ; Ziffer erhöhen
sub temp1, z0 ; Zahl subrahieren
sbc temp2, z1 ; 32 Bit
sbc temp3, z2
sbc temp4, z3
brge Int_to_ASCII_ziffer ; noch kein Unterlauf, nochmal
add temp1, z0 ; Unterlauf, eimal wieder addieren
adc temp2, z1 ; 32 Bit
adc temp3, z2
adc temp4, z3
st X+,temp6 ; Ziffer speichern
dec temp5
brne Int_to_ASCII_schleife ; noch eine Ziffer?
[avrasm]Int_to_ASCII:
Code:Auszug aus AVR Tutorial ADC
[[http://www.mikrocontroller.net/articles/AVR-Tutorial:_ADC]]
Der Assembler kann Ausdruecke auswerten, bzw ausrechenn. Die '0' ist der
ASCII Code fuer das Zeichen '0' = $30 und -1 = -1 dh. zusammen $2F. Die
minus 1 deswegen, weil in der Schleife 'Int_to_ASCII_ziffer' als erstes
temp6 um 1 erhoeht wird - ergibt also wieder den ASCII Code von der
Ziffer 0, um dann bei jedem Schleifendurchlauf weiterhin um 1 erhoeht zu
werden, bis das Ergebnis der Subtr. <0 ist. Dann hat man direkt den
ASCII Code der Ziffer zum Anzeigen.
Wenn man den Assembler rechnen laesst, spart man sich Zeit und es wird
uebersichtlicher, weil man den Sinn der Konstanten einfacher erkennen
kann. Wenn da nur $2F steht, ist das schwerer nachzuvollziehen.
andere Beispiele:
subi LcdChar,-$14 ;
Addiere $14 - weil es keinen ADDI Befehl gibt, muss man den
negativen Wert subtrahieren. Den errechnet mir der Assembler mit dem
Minuszeichen.
ldi YL,$40+$80 ; $40 und Bit7 gesetzt
ldi Befbyte,1<<3
;Flag für Komma drucken / 3 Nachkommastellen
1<<3 schiebt eine 1 3 mal nach links, dh. Bit 3 ist gesetzt.
ADC_Init0:
ldi temp, (1<<REFS1) | (1<<REFS0) | (0<<MUX3) |(0<<MUX2) | (0<<MUX1) |
(0<<MUX0) ; Kanal 0 int. ref Spannung 2,56V
out ADMUX, temp
ldi temp, (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)
out ADCSRA, temp
Die Namen REFS1 usw. beinhalten die Bitnummern, die dann mit '|'
ver-odert werden und die jeweiligen Bits somit gesetzt werden.
Bei 0<<MUX1 wird eine 0 geschoben und kein Bit gesetzt. Das ist so
natuerlich unnoetig. Man kann allerdings so einfacher Aenderungen machen
und sieht eher, dass zB oben der ADC Kanal auf 0 0 0 steht.
Wenn man damit arbeitet, vereinfacht sich vieles und es wird vor allem
uebersichtlicher.
Ok Danke, Die Information das, in Hochkomma geschrieben ASCII Code ist fehlte mir. Jetzt konnte ich den ganzen Assembler Code nachvollziehen. Vielen dank für die Ausführliche Antwort. MFG Roderrich Ps. ganz schön verzwickt das Ganze.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.