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.
BAS-Zeilensignal (Quelle: Wikipedia)
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
SparrowTV Würfel App
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: