Forum: Mikrocontroller und Digitale Elektronik Grundlegender Programmaufbau


von Felix (Gast)


Lesenswert?

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

von thkaiser (Gast)


Lesenswert?

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

von Mario (Gast)


Lesenswert?

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