Hallo Leute Ich habe da eine Frage zum grundlegenden Programmaufbau in Assembler, wenn man das Problem mit Tabellen hat. Und zwar gestaltet sich mein Problem wie folgt. Ich habe zum Beispiel ein Programm geschrieben, welches ein Register hochzählt dieses dann in Dezimalzahlen wandelt und die Dezimalzahlen dann an ein LED-Display ausgibt. Mein Problem bei der Sache ist, den jeweiligen Binärzahlen (0 bis 9, die Binärzahl ist nach dem dekodieren auf drei register verteilt, 1er, 10er und 100er) dann das entsprechende Muster für das LED-Display zuzuordnen. Bis jetzt habe ich das ganze eigentlich immer nach folgendem Muster gelöst: ldi temp1, 1 cp einer, temp1 brne naechste_zahl ldi temp1, 12 (muster für eine eins) out portb, temp1 naechste_zahl: ...usw. wie man leicht erkennen kann habe ich das Problem mit einer Vergleichsfunktion gelöst. D.h. daß ich 10 Vergleiche hintereinander abklappern muss, um der jeweiligen Zahl dann das entsprechende Muster zuzuweisen. Ich finde, dass das nich besonders sinnvoll gelöst ist. Bei den Dezimalzahlen 0-9 mag das ja noch gehen, aber wie sieht das ganze dann bei komplettem ASCII-Code aus! Soll ich dann 256 Vergleiche hintereinander machen? Und wo soll ich da den ganzen Programmspeicher dafür hernehmen? Ich hatte schon die Idee, die Zahl, der ein Muster zugewiesen werden soll, als eine Art Vektor zu nutzen, der dann in entsprechende Abschnitte eines Programms zeigt (damit mein ich, dass ich mir die vergleiche sparen kann) wo dann die entsprechenden Muster als Wörter abgelegt sind, die ich mit .db bzw .dw (so ungefähr, hab mich mit den beiden noch nicht beschäftigt) gekennzeichnet sind. Ich glaube, dass diese Möglichkeit wesentlich besser wäre. Könnt ihr mir sagen, ob man das so machen kann, und wenn ja wie? Bin auch für andere Möglichkeit dankbar, aber bitte nur in Assembler, von C und Pascal hab ich keine Ahnung. Dann erstmal im Vorraus vielen Dank, und ich freu mich auf die hoffentlich zahlreichen Vorschläge. Gruß Felix
Eine Tabelle wird mit den kleineren Atmels (2313 o.ä.) mit dem "LPM" - Befehl angesprochen. Hierbei wird automatisch das Z-Register (R30/R31) und das Register R0 verwendet. Das Z-Register beeinhaltet die Adresse, mit dem LPM - Befehl wird der Inhalt der Adresse in R0 geladen. Initialisierung ldi r30,low(tabelle*2); *2 weil das Flash 16-Bit-weise ldi r31,high(tabelle*2); organisiert ist Zugriff: (z.B. Addieren eines Offset für ein Zeichen:) ldi r17,0 add r30,r16 ;Offset (z.B. für Darstellung eines Zeichens) adc r31,r17 ;Übertrag berücksichtigen lpm in R0 ist nun das entsprechende Datenbyte Definition der Tabelle: tabelle: .DB $11,$12,$34,$18,$FA,$BC
Atmel hat auf sener Homepage auch ein Paar interessante Sachen, siehe Aplikation AVR242. Da machen die das über eine Tabelle im EEProm. Als Anregung sollte das funtionieren. Mfg Mario
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.