mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Grundlegender Programmaufbau


Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mario (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.