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