Forum: Mikrocontroller und Digitale Elektronik Hilfe zu AVR-Tutorial ADC


von Roderrich (Gast)


Lesenswert?

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]]

von Herr M. (herrmueller)


Lesenswert?

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.

von Roderrich (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.