mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu Z-Register


Autor: Stevko (Gast)
Datum:

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

Autor: Sebastian Wille (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

adiw  ZL,1

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

Sebastian

Autor: crazy horse (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.