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.