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.
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
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.
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.
Danke für die vielen Hinweise, ich werde es nachher nochmal probieren und dann berichten..
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.