Forum: Mikrocontroller und Digitale Elektronik Fragen zu AVR ASseMbler Z-Pointer


von Info (Gast)


Lesenswert?

Ich möchte tvtext_v2.asm aus 
Beitrag "Re: AVR Videogenerator, 40x25 Zeichen, nur 60% CPU Auslastung !" so modifizieren, dass 
ein Zähler laufend ausgegeben wird.
Das Programm hat eine Textmode-Demo, wo ich eigene Zeichenketten 
untergebracht habe (anstelle des ASCII-Generators).

Leider habe ich keine Ahnung von ASM (avr asm).

Nach meinem Verständnis gibt es jedoch einen Speicherbereich im RAM, der 
für die Zeichen auf dem Display genutzt wird (aus diesen Daten wird in 
Interrupts das Video-Signal erzeugt). In diesen Speicherbereich wird 
über eine print-Funktion mittels Z-Pointer geschrieben. Das passiert 
einmal bei der Initialisierung des Programms.

In der main-loop möchte ich nun stets an eine bestimmte Stelle im 
"Textspeicher" die Ziffern des Zählers schreiben.

Dazu habe ich versucht, den Z-Pointer bei der Initialisierung zu 
kopieren, um eine einfache Positionierung im sonst statischen Text zu 
ermöglichen.

Für die Zeichenausgabe der Zahl (=Ziffernausgabe) hatte ich gedacht, man 
könnte die aus Z gesicherte Adresse wieder laden, und dann die drei 
Zeichen erzeugen.

Leider funktioniert dann die Ausgabe gar nicht mehr, der Versuch, das 
Programm zu simulieren schlug fehl (AVR Studio 4.x hat nicht mehr 
reagiert).

Ich sehe drei mögliche Fehlerquellen:

- Z-Pointer funktionert anders, ich benutze es falsch
- Z-Pointer wird zwischenzeitlich verändert, bzw. durch meine 
Veränderung bringe ich das Programm durcheinander (push/pop 
erforderlich/möglich?)
- Die Zahlenausgabe bringt das Timing durcheinander

Ich würde mich freuen, wenn jemand zwei Minuten einen Blick drauf werfen 
könnte. Meine Änderungen sind im o.g. Thread zu sehen.

von Karl H. (kbuchegg)


Lesenswert?

Info schrieb:

> Nach meinem Verständnis gibt es jedoch einen Speicherbereich im RAM, der
> für die Zeichen auf dem Display genutzt wird (aus diesen Daten wird in
> Interrupts das Video-Signal erzeugt). In diesen Speicherbereich wird
> über eine print-Funktion mittels Z-Pointer geschrieben. Das passiert
> einmal bei der Initialisierung des Programms.

Ja.
Der springende Punkt ist aber "bei der Initialisierung".
Die print Funktion kann benutzt werden, solange die Interrupts noch 
nicht scharf geschaltet sind. In diesem Demoprogramm ist das in Ordnung. 
Bei dir aber nicht. Wenn du im laufenden Betrieb ausgeben willst, dann 
gilt die Devise: du kannst dich auf den Z-Pointer nicht verlassen. Der 
wird in der ISR verändert ohne dort gesichert und wieder hergestellt zu 
werden. D.h. der Z-Pointer ist für dich damit tabu. Genauso wie der 
X-Pointer. Lediglich mit dem Y-Pointer kannst du arbeiten.

> In der main-loop möchte ich nun stets an eine bestimmte Stelle im
> "Textspeicher" die Ziffern des Zählers schreiben.

Dann setze den Y-Pointer an die betreffende Stelle, lade dein 
auszugendes Zeichen über ein Zwischenregister und den Y-Pointer in 
dieses Display RAM. Genauso wie es die print Funktion in ihrem Kern auch 
macht.

Und nein. Der Z Pointer enthält für dich keinerlei verwertbare 
Information.
Du musst schon den Y Pointer mit dem Start des Bildschirm-Speichers 
laden, wenn du links oben mit schreiben anfangen willst.
Bzw. dann eben mit einem entsprechenden Offset zu dieser 
Speicheradresse, wenn die Ausgabe entsprechend woanders landen soll.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Das hier
1
rxuart: ;UART Daten verarbeiten
2
  in    RX, UDR
3
  st    Y+, RX ;Daten
4
  ldi   temp, high(XSize*YSize+DDRAM)
5
  cpi   YL, low(XSize*YSize+DDRAM)
6
  cpc   YH, temp
7
  brlo  skipwpreset
8
9
  ldi   YL, low(DDRAM)
10
  ldi   YH, high(DDRAM)
11
skipwpreset:
12
  ret
ist im Grunde in diesem Programm dein bester Ausgangspunkt.
Das gibt ein Zeichen aus, welches in UDR steht.
Anstatt UDR benutzt du dann eben deine Methode um das nächste Zeichen zu 
bestimmen.
Beachte auch den Teil hier
1
  ldi   YL, low(DDRAM)
2
  ldi   YH, high(DDRAM)
der ist im Prinzip einfach nur ein 'Cursor home'.


> Leider habe ich keine Ahnung von ASM (avr asm).
Das ist schlecht. Denn als problemlos zu benutzender Baukasten ist die 
Vorlage eher nicht geeignet. Die Vorlage gibt einfach alles was über die 
UART reinkommt auf den Bildschirm aus. Allerdings fehlen da für ein 
Terminal noch essentiell wichtige 'Befehle', wie zb Cursor 
positionieren. Kann man natürlich alles nachrüsten. Aber dazu muss man 
AVR-Assembler schon so weit sprechen, dass man sich aus dem Code die 
notwendigen Informationen rauslesen kann.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz schrieb:


> gilt die Devise: du kannst dich auf den Z-Pointer nicht verlassen. Der
> wird in der ISR verändert ohne dort gesichert und wieder hergestellt zu
> werden. D.h. der Z-Pointer ist für dich damit tabu. Genauso wie der
> X-Pointer. Lediglich mit dem Y-Pointer kannst du arbeiten.

Muss mich korrigiern.
Die ISR beginnt damit, den Z-Pointer in Shadow-Speicher zu schreiben 
(hatte nur nach Push und Pop ausschau gehalten). So weit ist das also in 
Ordnung. Du kannst den Z-Pointer für deine Zwecke benutzen, wie du 
möchtest.

von Info (Gast)


Lesenswert?

Danke für die vielen Hinweise, ich werde es nachher nochmal probieren 
und dann berichten..

von Info (Gast)


Lesenswert?


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.