SparrowTV (BAS-Signal mit dem ATtiny13)

Vor einiger Zeit bin ich beim Stöbern durchs Netz auf einen schönen Artikel von Arne Rossius gestoßen. Auf seiner Seite präsentiert er eine Lösung zur Generierung eines BAS-Signals auf dem ATtiny11 der mit einem externen 8 MHz Quarz betrieben wird. Projekte den AVR Controller am TV zu betreiben gibt es bereits viele. Das Spannende an diesem Aufbau ist jedoch, dass der gesamte Code zur Signalgenerierung zusammen mit der Bildinformation in einen 1K µController passen. Zudem ist die Beschaltung sehr minimalistisch.
Aus meiner Zeit als Radio- und Fernsehtechniker weiß ich noch wie zeitkritisch das BAS-Signal aufgebaut ist. Ich habe daraufhin den Gedanken das Ganze auf den ATtiny13 zu portieren verworfen, denn dieser bietet im Vergleich zum ATtiny11 keine Möglichkeit zum Anschluss eines externen Quarzes.
Mit dem Projekt "Sparrow" kam jedoch die Idee wieder auf. Irgendwie muss das doch zu machen sein. Wäre doch eine schöne Möglichkeit für den Sparrow mit der Außenwelt in Verbindung zu treten, sollten die 2 LEDs mal nicht ausreichen. Das war dann auch Antrieb genug um wenigstens herauszufinden was der Tiny13 mit seinen ungenauen 9,6 Mhz aus dem Signal macht. Die Umstellung des Codes von Arne Rossius auf den Sparrow war die einfachste Sache. Neben ein paar Namensänderungen beim Ansprechen des Timers musste der Code nur ein wenig an die Syntax des gavrasm (mein Lieblingsassembler) angepasst werden.
Zeit für eine erste Messung
Nach erfolgreichem Übersetzen und Aufspielen ging es dann an den SCART-Anschluss. Kein Bild. Nur ein kleines Zucken am Bildschirmrand. War auch irgendwie klar. Das Signal ist bei einer Taktfrequenz von 9,6 MHz meilenweit von den geforderten 8MHz entfernt. Da muss nun das Oszi ran.
Sparrow/ATtiny13a generiert BAS-Signal
Erstaunlicherweise war das Signal bei der Messung sehr stabil. Ich ging bisher immer davon aus, dass der interne RC-Oszillator für zeitkritische Dinge nicht zu gebrauchen sei. Eine klare Fehleinschätzung. Die Frequenz ist zwar ungenau aber relativ stabil. Damit war die Sache klar. Das Ganze kann funktionieren, es muss nur der gesamte Code auf 9,6 Mhz umgeschrieben und mit dem OSCCAL Register (Clock Kalibrierung) ein wenig nachjustiert werden.
Der Code muss neu geschrieben werden
Alles neu schreiben erschien mir als viel zu viel Arbeit. Im ersten Schritt versuchte ich daher den gegebenen Code zeitlich anzupassen. Beim Umrechnen der einzelnen Zeitabstände in Prozessortakte fiel jedoch schnell auf, dass das nicht genau wird. Ständig kamen halbe Takte für bestimmte Signalteile heraus. Da verliert man schnell die Lust und macht lieber etwas anderes. Erst mal überprüfen wie gut man überhaupt mit dem OSCCAL Register die Frequenz einstellen kann.

Nächste Überraschung
Beim Spielen mit dem Register war die Überraschung groß. Mit den 7Bit lässt sich der Oszillator schön über einen recht großen Bereich verschieben. Von 9,6 Mhz auf 8 Mhz. Vielleicht reicht es ja! Also Frequenz soweit runter drehen wie es geht. Nochmal an den Fernseher angeklemmt. Genial. Bild ist schon mal da. Allerdings lief es ständig weg. Leider fehlten ein paar Hz um auf die vorgegebenen 8 Mhz zu kommen. Schade, wäre auch zu schön gewesen. Doch dann kam die rettende Idee!
Statt langsamer jetzt schneller
Wenn man sich von oben nicht an die richtige Frequenz annähern kann dann doch vielleicht von unten. Also Taktteiler auf 2 gestellt und mit der Kalibrierung die Frequenz erhöht. Große Erleichterung. Endlich... es läuft!
SparrowTV Versuchsaufbau
Beim genaueren Hinschauen fallen noch ein paar unschöne Timingprobleme auf, die es noch gilt zu beseitigen. Zudem muss noch eine Lösung her, die auf allen Sparrows funktioniert bzw. einstellbar ist.
SparrowTV 80x72 Pixel
Wer vorab schon damit spielen möchte hier der Quellcode von Arne Rossius angepasst an den ATtiny13.
Einfach ein wenig mit dem OSCCAL Register testen bzw. den Taktteiler zurück auf 0b00000000 stellen. Im Folgenden ein Auszug aus dem Quellcode sowie die Außenbeschaltung zum Anschluss an den Video-Eingang.
reset:
    ldi     r16, 0b10000000
    out     CLKPR, r16
    ldi     r16, 0b00000001
    out     CLKPR, r16
    
    ldi     r16, 0x5d
    out     OSCCAL, r16

---------------------------------------------------------------

;          ___
;  PB1 ---|___|---o-----> Composite Output (load with 75 ohms)
;          1k     |
;          ___    |
;  PB0 ---|___|---'
;          390

Eine API für den Sparrow
Im nächsten Schritt soll nun eine kleine API für den Sparrow entstehen.
Links und Referenzen: