Forum: Mikrocontroller und Digitale Elektronik Frage zu Z-Register


von Stevko (Gast)


Lesenswert?

Hallo

habe wieder mal eine Frage. Das Menü für meinen Sternprojekt ist fertig
und funktioniert eigentlich ganz gut.

menu_main_table:
.db "Time      ","Anzeigen  ","§§§§§§§§§§","§§§§§§§§§§"
.db "Teleposi  ","Anzeigen  ","§§§§§§§§§§","§§§§§§§§§§"
.db "Datenbank ","Blättern  ","akt. Posi ","§§§§§§§§§§"
.db "§§§§§§§§§§","suchen    ","akt. Posi ","§§§§§§§§§§"
.db "Setup     ",laber laber laber

Jeder Menüpunkt ist 10 Zeichen lang, so das die Berechnung des
Z-Pinters relativ leicht ist; adiw ZH:ZL,10 (in einer Schleife).
Menüpunkte mit "§" werden nicht angezeigt und im 16x2 Display steht
oben der Haupt-Menüpunkt = linke Spalte und darunter der jeweilige
Untermenüpunkt.
Jetzt habe ich aber auch noch mehrere Standardtexte von
unterschiedlicher Länge. Diese sollten ebenfalls in eine Tabelle
untergebracht werden, und über eine Routine auf Dipsplay gezaubert
werden. Ich stelle mir das so vor.

text_table:
.db "Sternzeit",0 ;(0)
.db "Rektaszension",0 ;(10)
.db "Sternzeit",0 ;(24)
.db laber,laber,laber

Die Zahl in der Klammer ist das Offset vom Anfang der "text_table".
Dieses wollte ich im SRAM speichern High/Low Register und dann in der
Routine verwenden.
Das Offset wird aber in den Bereich von über 255 kommen. Wie addiere
ich jetzt richtig denn add / adc kümmert sich ja nur um ZL.
Muß ich da eine 16-Bit-Additionsroutine verwenden oder gibt es einen
Trick? Es kann ja auch sein das ZL schon den Wert 250 hat, so das ich
mit dem 2. Eintrag in's Schleudern komme. Ich möchte nämlich nicht mit
dem Zeiger ins ungewisse stürzen, deshalb die Frage.
Und noch eine hinterher:
Ist es besser die Texte in eine Tabelle zu nageln oder in der Routine
separat anzugeben.
zB. ldi R16,'S'
    rcall lcd_print
    ldi R16, 'e'
    rcall lcd_print usw.

Welches verbraucht weniger Programmspeicher?

Gruß
  Stevko

von Sebastian Wille (Gast)


Lesenswert?

Hi,

adiw  ZL,1

sollte gehen. Läuft ZL über, wird ZH um eins erhöht.

Sebastian

von crazy horse (Gast)


Lesenswert?

könntest auch jedem Text ein eigenes label spendieren und damit dem
Assembler das berechnen der Adressen überlassen.
Ansonsten kannst du natürlich ganz normal mit dem Z-Register rechnen:
add ZL, rx
adc ZH, ry
damit wird der evtl. Übertrag berücksichtigt.

Am wenigsten Programmspeicher brauchst du, wenn du eine Ausgaberoutine
hast, der du den Anfang des auszugebenden Textes übergibst, dort dann
Zeichen lesen, prüfen ob 0, wenn nicht ausgeben, Zeiger erhöhen usw.

von Peter D. (peda)


Lesenswert?

Du könntest auch Zeiger auf einen Zeiger verwenden.

Die einzelnen Zeiger sind dann immer 16 Bit, d.h. 2 Byte voneinander
entfernt und können aber auf Texte von beliebiger Länge zeigen:

zeigers:
.db text0 * 2, text1 * 2, text2 * 2, text3 * 2 ;usw.


text0:
.db "laber laber 0", 0
text1:
.db "laber laber 1", 0
text2:
.db "laber laber 2", 0
text3:
.db "laber laber 3", 0
;usw.

Willst Du also text 3 ausgeben, holst Du dir zuerst dessen adresse:

Z = 2 * zeigers + 2 * 3

Dann holst Du dir die nächsten beiden Bytes von dieser Adresse und
lädst sie in ZH,ZL.
Und schon zeigt Z auf den Text und den gibst Du dann solange aus, bis
das Byte = 0 ist.


Peter

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.