Forum: Mikrocontroller und Digitale Elektronik 7 Segment-Anzeige AVR-Assembler


von Quiddi Q. (quiddi)


Lesenswert?

Hallo zusammen,

ich habe mir mal das AVR-Tutorial für Assembler angesehen. Es geht genau 
um diesen Artikel:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige

Ich verstehe wie die 7-S-A funktioniert, wie die Codetabelle zustande 
kommt. Was ich aber nicht verstehe ist, wie sage ich dem AVR, wann 
welche Zeile von der Codetabelle kommt. Also wie lege ich fest, dass 
wenn Dezimal eine 1 im Register ist die 2. Zeile rausgeschoben wird, 
bzw. Dezimal 0 --> Zeile 1...

Ich hoffe ich schreibe den Artikel nicht zum zweiten mal, aber in der 
SUFU habe ich nichts gefunden.

von spess53 (Gast)


Lesenswert?

Hi

>wie sage ich dem AVR, wann welche Zeile von der Codetabelle kommt.
>Also wie lege ich fest, dass wenn Dezimal eine 1 im Register ist
>die 2. Zeile rausgeschoben wird,bzw. Dezimal 0 --> Zeile 1...

Hier mal der relevante Codeabschnitt:
1
     ldi     ZL, low(2*Codes)     
2
     ldi     ZH, high(2*Codes)
3
     add     ZL, temp2
4
     lpm

Du lädst Z mit der Adresse des Tabellenanfangs, addierst deine Ziffer 
(0...9) zu Z. Damit ist in Z die Adresse des zugehörigen Codes. Mit 
'lpm' wird das Byte von der Adresse in Z nach r0 geladen.
Du musst aber folgendes beachten: 'Codes' repräsentiert eine 
Word-Adresse, zeigt also auf 2 Bytes. Für 'lpm' wird aber eine Adresse 
erwartet, die auf ein Byte zeigt. Deshalb wird bei 'ldi     ZL, 
low(2*Codes)' mit '2*Codes' die Adresse verdoppelt. Aus dem gleichen 
Grund müssen auch 2 Codes der Tabelle in einer Zeile stehen. Sonst fügt 
der Assembler nach jeder .db-Anweisung ein $00 ein und bringt die 
Tabelle durcheinander.

MfG Spess

von Quiddi Q. (quiddi)


Lesenswert?

Hallo nochmal,

Danke für deine Antwort.

So ganz habe ich es noch nicht verstanden.
Angenommen es steht folgendes in meinem Quellcode.
Codes:
           .db     0b11000000
           .db     0b11111001
           .db     0b10100100


Wenn ich jetzt die Befehle

     ldi     ZL, low(2*Codes)
     ldi     ZH, high(2*Codes)

ausführe. Was steht dann im Z Register, wegen dem *2? Steht da 11000000 
und im H noch mal 11000000 oder hat das 16bit und es steht 
1100000011000000 drin.

Wenn ich den Befehl add  ZL, temp2 ausführe mein Z-Register in der 
ersten Zeile ist und temp2 einer 1 entspricht. Steht dann jetzt im 
Z-Register die 2. Zeile also 11111001 drin?

Den Befehl lpm glaube ich verstanden zu haben, ich muss dann halt r0 
noch an meinen Ausgangsport, wo meine 7-S-A dranhängt, ausgeben.

Mfg
quiddi

von Ich (Gast)


Lesenswert?

Ins Z-REgister lädt er die Adresse, nicht den Inhalt.

von Ich (Gast)


Lesenswert?

z.B. Deine Daten stehen an Adresse Wort Nr. 42 (Byte 84 im 
Flash-Speicher)
=> Überall wo du jetzt "Codes" hinschreibst, ersetzt es der Assembeler 
durch die 42. DIe Multiplizierst du mit 2 => 84.
Jetzt kann der lpm-Befehl die Daten bei Byte Nr. 84 laden.

von Ich (Gast)


Lesenswert?

Du kannst zu den 84 noch was dazuzählen, z.B. 7, dann lädt er die Daten 
bei Byte Nr. 91, was der Code für eine Sieben ist.

von Quiddi Q. (quiddi)


Lesenswert?

Hat mir einer von euch einen guten Link, wo erklärt wird wie die 
Wort-Nr. zustande kommt?

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.