Experimente mit SparrowTV
Die Bereitstellung einer fertigen Videoengine auf Basis von SparrowTV
ist ein Projekt für das ich mich sehr begeistere. Es hat sich jedoch herausgestellt, dass dafür eine Reihe von Hürden zu bezwingen sind.
Das Ziel ist schonmal klar: Einfache Videospiele für den Sparrow bzw. den Fernseher als externes Display nutzen.
Erste Hürde: Frequenzanpassung
Der Benutzerfreundlichkeit wegen muss die Taktfrequenz für den Bildabgleich einstellbar sein. Man will die
SparrowApp ja später nutzen können ohne
ständig den Code zu ändern. Fürs erste reicht dazu eine simple Abgleichmethode.
loop: in r29, PINB andi r29, 0b00000100 brne loop in r28, OSCCAL inc r28 out OSCCAL, r28 rjmp loop
In einer Endlosschleife wird einfach die Taste 2 abgfragt. Mit jedem Betätigen der Taste wird der Inhalt des OSCCAL-Register
ausgelesen und um eins erhöht. Nicht sonderlich elegant aber vorerst ausreichend für unsere Tests.
Einbau in das SparrowTV Demo
Mit der App SparrowTV Demo kann das gleich getestet
werden. Ein besonderer Dank an Burkhard Kainka, der seine Testsession mit der Kamera festgehalten hat.
Woher kommt dieses Flimmern?
Auch diese Frage konnte Burkhard mit seinem Testlauf beantworten: "Habe Sparrow-TV mit Quarzoszillator getestet, 16 MHz.
Das Zittern ist weg. Liegt also nicht an der Software sondern am Oszillator."
Der Oszillator ist zwar ausreichend genau für die Generierung des Fernsehsignals, die Schwankungen des Oszillators bleiben
jedoch gut sichtbar. Besonders schön ist das nicht aber man kann für die eine oder andere Anwendung damit leben.
Konzept für die Videoengine
Die Schwierigkeit bei der Entwicklung besteht darin, dass die Signalerzeugung fast die gesamte CPU-Zeit für sich einnimmt.
Lediglich in den Zeilenrückläufen sowie innerhalb der vertikalen Austastlücke (Bildrücklauf) ist etwas Zeit übrig. Innerhalb der
Zeilenrückläufe soll später mal die Soundgenerierung erledigt werden. Der Bildrücklauf (25 Zeilen lang) muss für alles andere wie
Spielelogik, Bildaufbau und Steuerung ausreichen.
Zum besseren Verständis für das Thema Signalgenerierung (BAS-Signal) und der
Unterbringung des eigenen Codes in den Zwischenzeiten sollte zunächst ein einfaches Programm entstehen.
Für den Anfang soll es ein elektronischer Würfel sein.
Konzept für den elektronischen Würfel
Für das Beispiel soll echter Zufall vorerst keine Rolle spielen. Gewürfelt wird indem wir den Würfel bei seinem
endlosen Durchlauf von 1-6 mit dem Loslassen des Tasters S1 stoppen. Bei der Auflösung fangen wir klein an. 16 mal 12 Pixel
verschaffen uns auch innerhalb des Zeilensignals genug Rechenzeit für unseren Test. Synchronisation soll erstmal kein Thema sein.
Die Bildinformationen für die einzelnen Zeilen können wir auf Grund der zeilenweisen Orientierung noch ohne zusätzliche Tools
ermitteln. Ein Bild besteht aus 2 mal 12 Byte. Die Erweiterung des BMP2Hex Konverter
Mosaic für horizontale Organisation ist in Arbeit.
Wir brauchen den 2. Taster
Die Vorlage von Arne Rossius belegt den Port B0. An diesem Port hängt allerdings unser Taster S1, den wir jetzt brauchen.
Ich musste deshalb Teile der Zeilengenerierung umschreiben. Wer sich mit dem Code beschäftigt wird merken, dass durch die Änderung
die maximale Auflösung nicht mehr erreicht werden kann. Für den Würfel zwar unrelevant aber für unsere spätere API ein wichtiger Punkt.
Die Anwendung
Im Folgenden ein Ausschnitt der Anwendung mit Spielelogik und Grafikinformationen.
Den kompletten Quellcode gibts weiter unten im Downloadbereich.
loop: in r29, PINB andi r29, 0b00000001 brne next add r26, r3 adc r27, zero dec r28 brne loop ldi r28, 6 ldi r26, LOW(image*2) ldi r27, HIGH(image*2) rjmp loop next: in r29, PINB andi r29, 0b00000100 brne loop in r29, OSCCAL inc r29 out OSCCAL, r29 rjmp loop image: .db 0xE0, 0x07, 0xDF, 0xFB, 0xD3, 0xCB, 0xD3, 0xCB .db 0xDF, 0xFB, 0xD3, 0xCB, 0xD3, 0xCB, 0xDF, 0xFB .db 0xD3, 0xCB, 0xD3, 0xCB, 0xDF, 0xFB, 0xE0, 0x07 .db 0xE0, 0x07, 0xDF, 0xFB, 0xD3, 0xCB, 0xD3, 0xCB .db 0xDF, 0xFB, 0xDE, 0x7B, 0xDE, 0x7B, 0xDF, 0xFB .db 0xD3, 0xCB, 0xD3, 0xCB, 0xDF, 0xFB, 0xE0, 0x07 .db 0xE0, 0x07, 0xDF, 0xFB, 0xD3, 0xCB, 0xD3, 0xCB .db 0xDF, 0xFB, 0xDF, 0xFB, 0xDF, 0xFB, 0xDF, 0xFB .db 0xD3, 0xCB, 0xD3, 0xCB, 0xDF, 0xFB, 0xE0, 0x07 .db 0xE0, 0x07, 0xDF, 0xFB, 0xDF, 0xCB, 0xDF, 0xCB .db 0xDF, 0xFB, 0xDE, 0x7B, 0xDE, 0x7B, 0xDF, 0xFB .db 0xD3, 0xFB, 0xD3, 0xFB, 0xDF, 0xFB, 0xE0, 0x07 .db 0xE0, 0x07, 0xDF, 0xFB, 0xDF, 0xCB, 0xDF, 0xCB .db 0xDF, 0xFB, 0xDF, 0xFB, 0xDF, 0xFB, 0xDF, 0xFB .db 0xD3, 0xFB, 0xD3, 0xFB, 0xDF, 0xFB, 0xE0, 0x07 .db 0xE0, 0x07, 0xDF, 0xFB, 0xDF, 0xFB, 0xDF, 0xFB .db 0xDF, 0xFB, 0xDE, 0x7B, 0xDE, 0x7B, 0xDF, 0xFB .db 0xDF, 0xFB, 0xDF, 0xFB, 0xDF, 0xFB, 0xE0, 0x07
Download
Sparrow Apps zum direkt aufspielen
Links und Referenzen: