Das Thema gab es hier schon oft, aber dank der fehlenden Suche finde ich
es nichtmehr:
Es gab doch irgendwo mal ein simples Terminal Programm, mit dem man
einen Text über den UART auf einem TV darstellen kann.
Weiß jemand was ich meine, und wo ich das finden kann ?
So ähnlich.
Gab es nicht mal was, wo man zur Laufzeit den Text ändern konnte ?
Es war glaube ich ein einzelner mega8 der 35x28 oder so Textzeichen
anzeigen konnte.
Danke, die letzen drei Links waren genau das was ich gesucht habe !
Ich habe mal (nur so zum Spaß) angefangen meine eigene Software zu
schreiben:
Die erste Version läuft mit 45x35 Zeichen auf einem TV, aber leider hat
der mega8 nur 1kB RAM, daher werde ich 28x35 verwenden.
Mein Programm ist ohne Interlace,
es kommt immer des "erste" Halbbild.
Geht halt einfacher, weil ich so die Zeilen
mit einem konstanten 64us Timerinterrupt erzeugen kann.
Gruß Jan
Meines auch:
H und VSync werden getrennt erzeugt und mit XOR verknüpft. Das ergebit
ein BAS ähnliches Timing und wird von allen TVs akzeptiert die ich
ausprobiert habe.
okay, ich habe nämlich überlegungen für eine ähnliche software. die soll
auf dem pc laufen und aus .bmp eeprom images erstellen. an den eeproms
soll für jede farbe ein d/a wandler hängen. sync etc ist in den images
schon drin...
wenn das dann ordentlich läuft werd ich versuchen gleiches mit nem
avr,sd und ein bisschen sram zu bauen.
Ich hätte da ein fertiges QBasic Programm das aus einem BMP ein
komplettes FBAS Signal erzeugt, komplett mit Halbbilder, Farbburst
usw.
Allerdings benötigt man mindestens 17,7MHz Samplerate um ein Farbbild
zu erzeugen. Ich verwende 13,1072MHz (512kB an Daten), damit kann man
nur ein sehr gutes SW Bild erzeugen.
Ein 512kB 70nS Flash wird von einem Synchronzähler angesteuert und
liefer ein sauberes (F)BAS Signal.
achso 17,7mhz war konjungtiv.
mmhh ich dachte daran evtl mehrere flash/eeprom zu benutzen und mit nem
rgb/pal encoder dann ein fbas signal draus zu bauen.
@alle
Ich bin bald am verzweifeln.
Kann mir mal bitte jemand genau erklären, wie die
vertikale Austastlücke aufgebaut sein muss?
Nach jedem Halbbild wird ein vertikale Synchronimpuls erzeugt.
Lt. Wikipedia
http://de.wikipedia.org/wiki/FBAS
mit 5 Vortrabanten 5 Hauptimpulse 5 Nachtrabanten
Hier fand ich auch noch einige Ansätze:
http://www.rickard.gunee.com/projects/video/pic/howto.php
Irgendwie stehe ich auf dem Schlauch und mein erstes Testbild sieht
ziemlich verzerrt aus :(
Danke
Bernhard
Den VSync Impuls kann man stark vereinfachen (auch wenn es nicht
Normgerecht ist, lief es bisher bei allen TVs wundebar die ich
ausprobiert habe, egal ob 10cm Mini TV, 100Hz TV oder TV Karte).
Dazu erzeugt man einfach den komplett Sync Impuls dauerhaft (ca. 5
Zeilen Länge), der von den HSync Impulsen abgeschaltet wird.
Oder einfach Ausgedrückt: CSync = HSync EXOR VSync.
Dadurch wird nicht zwischen den beiden Halbbildern unterschieden, dafür
ist das ganze sehr viel einfacher.
Wichtig ist auch, dass das Signal DC mäßig eingespeist wird. Viele TVs
haben mit einer AC Kopplung Probleme.
hier habe ich was gefunden, allerdings für NTSC, aber als Grundlage
sicher brauchbar:
TV-Oscilloscope mit Mega32
http://www.dtweed.com/circuitcellar/caj00161.htm#2833
google nach
TV circuitcellar
oder suche bei circuitcellar.com
ich meine, dort noch mehr ähnliches gefunden zu haben.
@alle
ich danke Euch für die Links, sie haben mir sehr weiter geholfen.
Prinzipell kann ich schon einen s/w Balken darstellen,
aber die beiden Halbbilder passen noch nicht richtig übereinander.
Das Bild "flimmert" bzw. flackert.
Ein leichter Knick ist auch noch im Balken.
Da heißt es Takte zählen ;)
Was mir noch unklar ist, an welcher Flanke synchronisiert ein TV seine
Zeile? Von 0,3V auf 0V (abfallende) oder 0V auf 0,3V (steigende).
Bernhard
Hallo Paul,
>Mit der Vorderflanke synchronisiert er auf Zeile
Aber auf Seite 9 Deines Links steht folgendes:
Zitat:
"Zu Horizontalsynchronisation wird nach jeder Zeile ein
Rechtecksignal von 4,7m s Dauer in der Horizontalaustastlücke
positioniert. Dieser H-Synchonimpuls liegt eingebettet ..."
Heißt das, dass zuerst das Bild gesendet wird und anschließend der
Synchron-Impuls?
Irgendwie passt der Text_ nicht zu den _Grafiken, oder sehe ich da
etwas verkehrt?
Mein Programmcode habe ich so konzipiert, dass vor Beginn einer Zeile
das horizontale Synchronsignal gesendet wird. Und siehe da, das Bild
steht exakt.
Habe ich einen Denkfehler?
Gruß
Bernhard
"Vor dem Spiel ist nach dem Spiel"!
Es ist doch (außer für die Zeilenzählung) völlig egal, ob Du den HSYNC
zur vorausgehenden oder zur nachfolgenden Zeile zählst. Aber es stimmt
schon: Bild und Text passen da nicht ganz (stört aber längst nicht so,
wie die kaputten 'µ' im Text ...
@Philipp
@alle
>Es ist doch (außer für die Zeilenzählung) völlig egal, ob Du den>HSYNC zur vorausgehenden oder zur nachfolgenden Zeile zählst.
Naja, aber wenn man sich an die Grafiken hält, dann müssen zuerst die
V bzw. H-Synchronimulse bereitgestellt werden.
Programmtechnisch habe ich es vom Prinzip her so gelöst:
Ein Timer sorgt dafür, dass alle 64 µs folgendes passiert:
- Zeilen zählen(1...625)
- die entsprechenden H-V-Synchronimpulse generieren
- die Bilddaten senden (momentan nur ein Balken)
Ich lege Euch mal meinen Assembler-Code mit bei, er erzeugt einen sehr
schmalen Balken mit einem ATmega8 (16Mhz) und zwei Widerständen auf
einem TV.
In der Loop Schleife habe ich eine Ganze Menge "nop's" eingebaut,
den seitlich an dem Balken waren sehr kleine "Läuse" zu sehen.
Dieses Jitter ensteht anscheind,wenn ein Sprungbefehl gemeinsam mit
einem Interrupt auftritt.
Bernhard
@Bernhard
Ja, der Text ist etwas mißverständlich an der Stelle. "Nach der 1.
Zeile" soll wohl heißen : "vor der 2. Zeile". Und nach der 625. vor
der 1.
Soll der Strahl nach oben asten,
muß man den Rücklauf dunkel tasten.
(Alte Volksweisheit) :-)))
MfG Paul
@Paul
>Ja, der Text ist etwas mißverständlich an der Stelle.
Da bin ich ersteinmal beruhigt, es war nämlich etwas unlogisch und
passte nicht zusammen.
Hoffetlich habe ich das Programm an dieser Stelle richtig geschrieben.
Beispiel für Zeile 100.
Zuerst wird synchronisiert, damit der Zeilenanfang exakt ist und
anschließend das Bild gesendet.
; SYNCHRONISATION vordere SCHWARZSCHULTER
; 0,3 Volt / 1,5µs
out PORTB,SCHWARZ
rcall WAIT_1_5us
; 0 Volt / 4,7µs SYNCHRON-IMPULS
out PORTB,NULL
rcall WAIT_4_7us
; 0,3 Volt 5,8µs hintere SCHWARZ-SCHULTER
out PORTB,SCHWARZ
rcall WAIT_5_8us
; Bild-Information BALKEN (senkrecht)
rcall wait_10us
; 1 Volt (weiss)
out PORTB,WEISS
nop
; 0,3 Volt (SCHWARZ)
out PORTB,SCHWARZ
Aber eins verstehe ich noch nicht. Wenn der Timer alle 64µs seinen
Interrupt auslöst, kommt es trotzdem zu einem ganz kleinen Jitter.
Denn der Timer-Interrupt wird manchmal erst nach 64µs + 1 Takt
abgearbeitet.
Ich dachte, dass durch den Synchronimpuls diesr eine Takt kompensiert
wird?
Gruß
Bernhard
PS:
Wer Hochfrequenz misst, misst Mist.
(Alte Volksweisheit) :-)))
Ja, das ganze läuft wunderbar. Ich hatte es spontan begonnen, da mir die
meisten fertigen Sachen nicht gefallen haben. Die erste Version hat etwa
1 Stunde gedauert, bis das ABC auf dem TV stand.
Jetzt unterstützt das ganze viele Befehle, kann den Standard ASCII
Zeichensatz oder auch einen anderen (umschaltbar usw.)
Da die UART Daten während des Horizontalinterrups empfangen werden,
kann ich so 15625 Befehle/s, also 156,250kBaud empangen.
Das schwierigste war, den Interrupt immer gleich lange zu bekommen, so
dass alle Zeilen egal bei welchem Befehl an der gleichen stellen
beginnen.
Möglich sind so 40x25 Zeichen (eigentlich mehr, aber der mega8 hat nur
1kByte SRAM)
@Benedikt,
das klingt ja richtig gut ;)
Interessiert mich sehr.
Hast Du Dein Projekt irgendwo veröffentlicht?
Ich taste mich gerade an 1x16 Zeichen heran.
Zur Ausgabe der Bildinformation nutze ich diese Schleife.
Damt ist ein Pixel ca.3mm breit bei einem s/w Kofferfernseher
(17cm breiter Bildschirm)
ZEILE_VOLLBILD_DATEN:
LD temp,Y+ ; laden und Zeiger+1
out PORTB,temp
dec temp1
brne ZEILE_VOLLBILD_DATEN
Sicherlich sollte man die Datenausgabe ohne Schleife gestalten, also
ziemlich oft
LD temp,Y+ ; laden und Zeiger+1
out PORTB,temp
LD temp,Y+ ; laden und Zeiger+1
out PORTB,temp
...
diese Zeilen verwenden?
Wie hast Du das Problem gelöst?
Bernhard
Das Programm läuft zu gut, das möchte ich nicht komplett
veröffentlichen. Falls du aber nicht weiterkommst, kann ich dir gerne
einzelne Ausschnitte aus dem Programm schicken.
Ich verwende das SPI Interface mit 8MHz Schiebtakt(=Pixeltakt). Damit
sind rund 420 Pixel pro Zeile möglich. Der Vorteil ist, man muss nur
alle 16 Takte ein Byte laden und ins SPDR schreiben. Die restliche Zeit
kann man nutzen um das Datenbyte noch zu verarbeiten.
Ich speichere z.B. nur den Text im SRAM und lade die Bilder der
einzelnen Buchstaben während der Ausgabe aus dem Flash.
Einen Nachteil hat das SPI Interface aber: Nachdem ein Byte übertragen
wurde, muss man einen Takt warten ehe man die nächsten Daten übertragen
kann, hier entsteht also eine kleine Lücke. Weiterhin ist der Ausgang
vom SPI während dieser Lücke auf 1, was also einen hellen Punkt
erzeugt. Daher invertiere ich das Signal.
Mit ein paar Tricks kann man das auch umgehen, aber sowas mache ich
immer erst wenn der Rest fehlerfrei läuft, da hier das Timing sehr
genau stimmen muss: Man schaltet das SPI Interface zum passenden
Zeitpunkt ab wodurch der Pin den eigentlichen Zustand annimmt, der im
PORT Register steht.
Das ganze mache ich in einer Schleife, da ich genügend Zeit übrig
habe.
Ich habe das ganze von innen nach außen aufgebaut:
Eine Schleife die genau 1 Zeile ausgibt, und anschließend auf den HSync
wartet (im Interrupt wird ein Bit gesetzt)
Da außenrum eine Schleife die einen Buchstaben ausgibt (8 Zeilen + 2
Leerzeilen für bessere Lesbarkeit)
Und um diese wiederum eine Schleife die die 25 Textzeilen ausgibt. Und
anschließend noch Leerzeilen, dann der Vsync Impuls und wieder einige
Leerzeilen. Dann beginnt das ganze wieder von vorne.
Ich muss schon sagen:
Ganz schön raffiniert!!!
Du gehst den Weg über das Hardware-SPI um den µC zu entlasten,
gut gelöst.
Da muss ich auch nochmal darüber nachdenken.
Hallo Benedikt,
könntest Du mir mal bitte Deinen ASCII-Zeichensatz (Tabelle) zur
Verfügung stellen, vielleicht passt sie bei mir?
Und Du ersparst mir eine ganze Menge Fleiß-Arbeit?
Danke
Bernhard
Ein Byte beinhaltet 8 nebeneinanderliegende Pixel eines Buchstabens.
Die ersten 256Bytes sind die oberste Zeile der 256 ASCII Zeichen, die
nächsten 256Bytes die zweite Zeile usw.
Das ganze ist also für die TV Darstellung optimiert.
Schade, dass ich Deine ASCII-Tabelle nicht nutzen kann :(
Meine Zeichen sind so wie bei einem LCD-Display aufgebaut (5x8 Pixel)
Trotzdem Danke
Gruß
Bernhard
@Philipp
>Wenn Du einen Linksshift durch Rechtsshift ersetzt....
Mit diesem Assembler-Befehl lese ich ich den ASCII-Zeichensatz aus der
Tabelle:
lpm temp, Z+ ; WERT aus Tabelle laden und Z+1
Wie könnte man nun shiften?
Bernhard
Da jetzt wieder was passiert ist ist mein projekt auch wieder munter
geworden, grins. werde mal versuchen ein bild auf den screen zu
bringen, so wie es benedikt schon gemacht hat...
@benedikt: Hast du die sync signale mit nem µcom erzeugt, oder lasst du
die von dem cpld baustein erzeugen? bei nem pixeltakt von .1µsec
auflösung ist das syncronisieren ganz schön verschenkter platz...
du hast weiter oben gescrieben
"Ich hätte da ein fertiges QBasic Programm das aus einem BMP ein
komplettes FBAS Signal erzeugt, komplett mit Halbbilder, Farbburst
usw...."
Ich hab mich auf dieses bezogen.
@Bernhard:
Ach, Du warst der mit dem Datensenden über SPI ... klar, dann muß das
Byte schon richtigherum sein. Normalerweise schiebt man ja Bit um Bit
aus dem Bit und setzt den Pin entsprechend. Dann hätte man nur die
Schieberichtung ändern müssen.
Jetzt mußt Du wohl doch fünf Minuten für ein PC-Programm investieren,
daß Dir die Bits umdreht.
@Philipp
>Ach, Du warst der mit dem Datensenden über SPI
Nein, das war Benedikt, ich nutze nur den langsameren "OUT" -Befehl
>Jetzt mußt Du wohl doch fünf Minuten für ein PC-Programm investieren,>daß Dir die Bits umdreht.
genau, oder ich verwende einach einen anderen Daten-Tabelle ;)
Hallo Sebba,
ich werde sie mal testen,
muss nur erst mal herausfinden, wo welches Zeichen in Deiner Tabelle
plaziert ist.
Wo befindet sich die "0" bzw das "A" ?
Kanns's aber erst aus zeitlichen Gründen frühstens am Sonntag testen.
Danke
Bernhard
@Victor
>vsync -> 1.Zeile (Hsync vorne weg) -> 2.Zeile (hysnc vorne weg)-> ...> -> 240. Zeile -> vsync
Die 240. Zeile ist eine "normale" Bildzeile und beginnt immer mit
einem H-Synchronimpuls
@Victor
>wieviele der zeilen werden nicht sichtbar sein?
Schau Dir mal bitte diesen Link an, ist dort sehr gut beschrieben:
http://kabelwalter.de/DasFernsehen/videosignal.htm#1
Zeile 1..3 ==> Hauptimpulse
Zeile 3...5 ==> Vortrabanten
Zeile 6..23 ==> Dummy (nix)
Zeile 23...310=> Bild
usw
Hallo Benedikt,
Bist schon gut vorann gekommen. Ich sehe es gibt scheinbar nur diesen
Weg. Den Trick mit dem abschlten der SPI hat dir auch den Inverter
erspart. Hast du es auch schon geschaft die Lücke wenn nötig zwischen
den "Zeichen zu schließen" ? Ich konnte Bit7 des Zeichens einfach
duplizieren und in der Lücke ausgeben. Zur Zeit arbeite ich noch an
einem Setup Bildschirm Für die Bildlage und Uhrzeiteinstellung über
IR-Fernbedinung. Mir fehlt aber noch komplet die Schnitstellen
implemenierung nach außen. dafür möchte ich die Zweidrahtschnitstelle
der Mega8 verwenden, da gehen 400kBit, das reicht für ein kompletes
Bild in einem Halbbild. Den Interlace habe ich über Synctabellen
realisirt. Zur Erinnerung:
http://www.mikrocontroller.net/forum/read-1-379469.html#new
Gruß Christof
Ich habe mich für den UART entschiden, da diese doppelt gepuffert ist.
Wenn man I2C mit voller Geschwindigkeit nutzt, also wirklich 400kHz
überträgt (das sind immerhin rund 40kByte/s, bzw. fast 3 Bytes/Zeile),
dann gehen davon 2 Stück verloren (wenn die Schnittstelle den Takt
nicht blockiert), da der mega8 diese nicht abfragen kann, da er die
Bilddaten ausgeben muss.
Beim UART ist das dagegen kein Problem: Das empfangene Byte landet im
Puffer, das nächste kann bereits empfangen werten. Im HSync Interrupt
wird dann ein Byte abgefragt und verarbeitet. Das ermöglicht 15kByte/s,
was auch schnell genug ist.
Mein Version habe ich in diesem Status abgeschlossen, da mache ich
nichts mehr dran, da diese stabil läuft. Das mit dem 7bit könnte ich
machen, da ich aber hauptsächlich Text darstelle ist das nicht
unbedingt notwendig.
Ich versuche das demnächst auf einem ARM, da dieser billiger ist als
ein AVR mit viel SRAM und da dieser ein 16bit SPI Interface mit 8 Word
FIFO hat, was erlaubt 128Pixel auf einmal zu schreiben (nennt sich SSP
Interface). Pro Zeile muss der uC also nur 4x Werte nachliefern für ein
komplettes 512x288 Bild (64x32 Buchstaben). Außerdem erlaubt dieses
lückenlos mehrere Transfers aneinander zu hängen.
@ Läubi - genau
Habe in der Zeilendarstellung noch ein Paar Nops da geht bestimmt noch
was.
ARM klingt interesannt, habe mich damit noch nicht beschäftigt sind die
billiger als 1,65
IMO ein großer Vorteil von TWI. Auch wenn die Leute immer schreiben
"wenn ich TW mit 400khz mache schaf ich XYZ an Daten"... der Maser
als auch der Slave dürfen den Bus nahezu beliebig! lange sperren wenn
sie die Daten nicht so schnell liefern/verarbeiten können.
Ist besonders nützlich wenn man int. Osc benuzt da wirken sich
gangungenauigkeiten nicht aus.
@Läubi
Das sagte ich doch...
Das kann aber auch eine dumme Fehlerquelle sein, wenn der Slave uC sich
aufhängt und so den Bus blockiert. Das hat mich mal einen Tag gekostet,
den ich mit Fehlersuche verbracht habe.
Mein TV-Projekt läuft auch,
realisieren konnte ich zusätzlich:
- 4 x 14 Zeichen-Anzeige
- 1 x Internen Frequenzzähler (bis ca. 5,5MHz)
- 4 x ADC
- 1 x RXD
- 1 x UHR
- 4-Tasten MENUE-Steuerung
(Bsp: Referenz-Auswahl,Messzeit, Baud-Rate, Kommastellen usw)
Ich lege mal ein Bild mit bei.
An SPI habe ich mich noch nicht herangetraut,
desshalb auch nur die wenigen Zeichen pro Zeile.
Dafür sind die ASCII-Zeichen sie etwas größer ;)
Bernhard
@Jan
>Gratuliere, sie doch Klasse aus !
danke
>Womit ist das realisiert ? C ? ASM ?
in Assembler, ich glaube in C wäre es nicht so ohne weiteres möglich,
das es teilweise auf jeden einzelnen 16-MHz-Takt ankommt.
Bernhard
Hallo Paul,
>Läuft es mit Atmega8....
Ja, ein 16MHz getakteter ATmega8 reicht für diese kleine "Spielerei"
vollkommen aus.
Zum Bildaufbau nutze ich nur 4 x 14Byte aus dem SRAM.
In den letzten Tagen hatte ich noch ein paar Ideen zur Verbesserung des
Assembler-Programmcodes.
Hab' mir mal in aller Ruhe die Befehlsliste des ATmegas angeschaut,
mit erstaunen stellte ich fest, dass es viele taktsparende Befehle
gibt Bsp: movw
Man(n) lernt eben nie aus ;)
Bernhard
Hallo Bernhard,
Schönes Projekt ! Das bringt mich auf einige Ideen.
Ich habe auch eine Weiterentwicklung meines AVR Videoterminals
in der Codesammlung eingestellt.
An der vorletzten Zeile des Bildschirmphotos kannst du evtl.
erkennen, was ich noch damit vorhabe. :-)
Gruß Jan
Hallo Jan,
Habe Dein Projekt gefunden.
Respekt!!!
http://www.mikrocontroller.net/forum/list-4-1.html?filter=VIDEO&x=15&y=8>An der vorletzten Zeile des Bildschirmphotos kannst du evtl.>erkennen, was ich noch damit vorhabe. :-)
Digital-Oszi?? o.ä.??
@Benedikt
Ich hoffe, Du bist uns nicht sauer, da wir Deinen Thread nochmal
aktiviert haben, aber das Thema ist zu interessant, als dass es in der
Versenkung brach liegt.
Bernhard
Was mir aufgefallen ist:
Die H-Synchronisation einer Bildzeile beginnt mit der Flanke der
hinteren Schwarzschulter, also von 0V auf 0,3V.
Bis jetzt dachte ich immer Flanke Ende der Vorderen Schwarzschulter,
also von 0,3V auf 0V.
Oder habt Ihr andere Erfahrungen gemacht?
Bernhard
>>Die H-Synchronisation einer Bildzeile beginnt mit
Woran merkst du das ?
Ich habe keine Ahnung, wo mein Fernseher syncronisiert.
Wie kann ich das erkennen ?
Gruß Jan
@Jan
>>Die H-Synchronisation einer Bildzeile beginnt mit>>Woran merkst du das ?
Ich bin durch Zufall beim programmieren darauf gestoßen.
Anfangs hatte ich der vorderen Schwarzschulter Flanke 0,3 ==> 0V sehr
viel Aufmerksamkeit geschenkt.
Taktreinheit durch zweiten, parallellaufenden Timer und Takte
ausgleichen durch nop's usw..
Stellte aber plötzlich fest, dass die hintere Schwarzschuler 0==>0,3V
für die Bilddarstellung genauso kritisch ist.
Meine Zeichen waren plötzlich nicht gerade, sondern leicht schief, wie
Scheibschrift, da leere Zeilen für die Zwischenräume anders erzeugt
wurden als Datenzeilen.
Bernhard
In meinem Programm werden die empfangenen UART Daten während des HSync
Impuls verarbeitet, die Impulsdauert varriert also je nach Befehl. Das
Bild ist aber stabil.
Die Triggerung erfolgt also über die fallende Flanke des Sync
Impulses.
Ich habe eine Vermutung, warum dein Bild so ausgefranzt ist (das
Problem hatte ich auch):
Kann es sein, dass sich der Bildbeginn verschiebt, oder der
Timerinterrupt nicht sofort angesprungen wird, da der AVR z.B. einen 2
Cycle Befehl (z.B. einen Sprung) ausführt ?
>Kann es sein, dass sich der Bildbeginn verschiebt, oder der>Timerinterrupt nicht sofort angesprungen wird, da der AVR z.B. einen>2Cycle Befehl (z.B. einen Sprung) ausführt ?
Der Timerinterrupt wurde taktgenau abgearbeitet (durch einen 2.Timer
kontrolliert), so dass die fallende Flanke exakt zeitgleich erzeugt
wurde.
Aber nach meiner Meinung ist die Steigende Flanke verantwortlich für
die H-Synchronisation. ?
Ich werde es morgen mal ausprobieren, welche Flanke es wirklich ist.
Wie funktioniert die Kontrolle durch den 2. Timer genau ?
Ich gebe zu, ich habe mir dein Programm angeschaut, versteh aber nicht
wirklich wo was genau abläuft.
Der Spung mit IJMP ist ja echt genial, um das ganze Taktgenau
hinzubekommen. Respekt !
Würde aber nicht 1 Timer ausreichen ? Dieser ist ja auch Taktgenau wenn
dieser im Compare Mode läuft.
Ich habe die Taktflanke ausprobiert: Du hattest recht, der TV triggert
wirklich auf die steigende Flanke, was das ganze sogar noch
vereinfacht, da die Low-High Flanke direkt vor Beginn der Pixelausgabe
erfolgen kann, und so die Latenzzeit des Interrupts in gewissen Grenzen
kompensiert wird.
Hallo Benedikt
>Der Spung mit IJMP ist ja echt genial, um das ganze Taktgenau>hinzubekommen
Ich muss aber gestehen, ich hatte bis jetzt auch noch nie mit diesem
Befehl gearbeitet. Aber er hat einige Vorteile, er braucht immer
exakt die gleiche Anzahl von Takten und dauert nur wenige Takte ;)
Manchmal besser als eine "CPI-BREQ" Konstruktion, die mehre
Kompensations NOPs benötigt, damit sie Taktgleich arbeitet.
>Würde aber nicht 1 Timer ausreichen ? Dieser ist ja auch Taktgenau>wenn dieser im Compare Mode läuft.
Ein Timer würde auch ausreichen, aber nur Bei Vorteiler 1:1, aber:
Das Grundproblem ist anderes. Bei einer Interrupt-Auslösung kann
manchmal der µC nicht sofort den Interrupt abarbeiten.
Warum nicht?
Stell Dir vor, der µC arbeitet gerade den 4-Takt-andauernen "RET" ab.
Die Interrupt-Abarbeitung muss so lange warten, bis RET ausgeführt
ist, erst dann kann er verspätet seine Interrupt Tätigkeit freudig
beginnen.
>der TV triggert wirklich auf die steigende Flanke, was das ganze>sogar noch vereinfacht
Gut, dass Du diesen Aspekt bestätigen konntest ;)
Ich vermute, die Ursache ist bei den HF-Demodulatorschaltungen zu
suchen.
Denn es ist in der HF-Technik schwieriger nachzuweisen, dass kein
Signal vorhanden ist, als andersrum. (ausschwingen von Schwingkreisen)
Doch wie kritisch ist die HIGH==>LOW Flanke ?
(V/H Synchronimpuls und vordere Schwarzschulter)
Zitat Paul:
Soll der Strahl nach oben asten,
muß man den Rücklauf dunkel tasten.
(Alte Volksweisheit) :-)))
Bernhard
Sagen wir mal man nimmt den 16bit Timer im Compare Modus und verwendet
den Compare Interrupt. Somit wird schonmal alle 1024 Takte ein
Interrupt ausgelöst, egal was dazwischen kommt.
Zu Beginn des Interrupts erzeugt man das Sync Signal, liest den Timer
aus und gleicht das ganze mittels IJMP an, so dass der Sync Impuls
immer genau z.B. 5us also 320 Takte nach dem Timer Compare beendet
wird.
Das ganze kann man sogar automatisch machen lassen, indem man die
weiteren OCR Register verwendet:
Man verbindet diese mit dem OCR Pin. Nun stellt man alles so ein, dass
der Pin beim Rest des Timers auf 0 und bei einem Zählerstand von etwa
300 wieder auf 1 gesetzt wird.
Der Sync Impuls wird also automatisch ohne einen weiteren
Softwarebefehl erzeugt.
Man braucht also theoretisch garkeinen Interrupt mehr.
Das ganze ist nur eine spontane Idee, die ich noch nicht ausprobiert
habe, es müsste aber funktionieren. Ich nutze die Timer aber gerne um
solche Signale zu erzeugen (z.B. zwei Impulse, von denen einer zeitlich
leicht versetzt ist usw.)
Ich denke nicht, dass diese Flanke sehr kritisch ist, genauso wie auch
die ganzen Vor und Nachtrabanten bei VSync.
Heutige TVs besitzen alle gute PLLs, wenn nicht sogar eine komplett
digitale Verarbeitung. Um auch schlechte Sender empfangen zu können
sind diese also sehr tolerant.
>Man verbindet diese mit dem OCR Pin. Nun stellt man alles so ein,>dass der Pin beim Rest des Timers auf 0 und bei einem Zählerstand>von etwa 300 wieder auf 1 gesetzt wird.
klingt interessant, teste es doch mal ?
So, die erste Version mit Sync in Harware über die Timer läuft.
Das gesamte Programm kommt mit einem 16bit Timer aus, und benötigt nur
rund 70 Zeilen (außer der einmaligen Initialisierung).
Es läuft komplett über den Interrupt, im Hauptprogramm kann man also
einen beliebigen Code laufen lassen, solange er nicht mehr als 20Byte
RAM benötigt, mit der Hälfte der Register auskommt und die Interrupts
nicht abschaltet. Die Latenzzeit von bis zu 10 Takten wird automatisch
kompensiert.
Die IJMP Routine war aufwendig zu berechnen, und hat mich einen TV
gekostet. Irgenwas hat mit den Sync Signalen nicht gepasst, da der
Sprung falsch war, es hat kurz geknackt und der TV war hinüber...
Naja, ich habe noch genügend rumstehen, aber das war mein bester,
eigentlich ein PC Monitor, super scharfes Bild, schade.
> und hat mich einen TV gekostet ... da der Sprung falsch war
deshalb stirbt nach meinem Elektronik-Verständnis nicht gleich ein TV.
Sicherlich hatte er vorher schon ein internes Problem (Alternung von
Kondensatoren/Elkos)
>Das gesamte Programm kommt mit einem 16bit Timer aus....
genau, denn damit kannst Du die "Taktreinheit" gut überwachen und
anschließend den gewohnten Weg per SPI, oder hast Du noch andere Kniffs
eingebaut?
Der TV/Monitor war schon alt, die 70Hz waren dem wohl doch etwas
zuviel.
Anscheinend zieht irgendwas zuviel Strom, denn das Schaltnetzteil
pfeift und kann nicht mehr eine stabile Spannung liefern.
Horizontal und Vertikalendstufe scheinen aber zu laufen.
Ich habe in die Software alles eingebaut was andere und ich an Tricks
entwickelt haben:
- Die Korrektur der Latenzzeit mittels IJMP (kann bis 0-10 Takte
auskorrigieren, wenn es mehr wird hängt sich alles auf.)
- Das Hauptprogramm ist eine leere Endlosschleife, hier kann man also
beliebige Software einbauen.
- Die Datenausgabe läuft im Interrupt.
- Die Sync Impulse werden per Hardware erzeugt und sind absolut
stabil.
- Die Zeit während des Zeilen und Bildrücklaufs stehen also komplett
der Software im Hauptprogramm zur Verfügung.
Der VSync Impuls ist einfach eine Invertierung der PWM Einstellungen,
die vom AVR synchron übernommen werden. Das macht das Softwaretiming
unkritisch und die Impulse genauer.
Wenn das ganze stabil läuft, poste ich den Code in der Codesammlung.
Das ganze hat noch einige wenige Fehler, im Moment läuft das ganze zum
Testen und emuliert ein serielles LCD mit rund 20fps in denen jeweils
das komplette Bild refreshed wird (250kbit/s Baudrate)
Hat sich jemand von Euch schon mal mit dem FBAS- Signal, also mit der
Farbe beschäftigt?
Bis jetzt habe ich nur regagieren können, dass ca. 10 Schwingungen mit
einer Frequenz X auf die hintere Schwarzschulter mopduliert werden
muss,
um den Farbdecoder zu synchronisieren.
Aber wie geht's dann weiter?
Ja, ich habe sogar schonmal einen Encoder geschrieben, der ein BMP in
ein ROM Image umwandelt, dass man mit etwa 20MS/s aufwärts abspielen
muss um in farbiges TV Bild zu erhalten.
Im Anhang das Bild zeigt ein echtes FBAS Signal. Die Burst (unten klein
um den VSync herum, oben vergrößert um den HSync herum) dienen zur
Syncronisation, die kleinen Schwingungen auf der Bildinformation sind
der Farbträger + Farbinformation.
Theroetisch lässt sich das ganze leicht erzeugen:
Sinus und Cosinus mit 4,433MHz erzeugen, R-Y und B-Y erzeugen und mit
dem Sin und Cos multiplizieren und das zu dem Y Signal mischen.
Y=Schwarzweissignal, also 0,3*R+0,59*G+0,11*B
Mit einem AVR gibt es ein paar Schaltungen die mit 4*4,433 also 17,7MHz
laufen. Aber die erzeugen nur ein festes Farbbild.
tolle Grafik!
Wenn ich das jetzt richtig gedeutet habe, dann wird der Farb-Träger nur
im Burst für 10 Schwingungen zur Verfügung gestellt und anschließend
komplett abgeschaltet.
Aber wie geht es dann konkret weiter, wenn z.B. eine komplett rote
Zeile geschrieben werden soll?
>...Sinus und Cosinus mit 4,433MHz erzeugen, R-Y und B-Y erzeugen...
demnach wäre eine Rote Zeile kein konstante Amplitude, sondern das
Ergebnis der sin + cos Berechnung?
Bernhard
>...und anschließend komplett abgeschaltet.
Nicht ganz:
Die Farbinformationen werden Quadraturamplitudenmoduliert den
Bildinformationen überlagert. In dem Bild sieht man ja die Schwingungen
mit der selber Frequenz wie die Bursts über dem Bildsignal.
Um also jetzt ein komplett rotes Bild zu übertragen, würde man den
Spannungspegel als Schwarzweis Bild berechnen:
Y=0,3*R+0,59*G+0,11*B
Man hätte also 0,3V für ein komplett helles rotbild (Videopegel 1Vss).
R-Y wäre dann also 0,7V und G-Y wäre -0,3V
Die letzen beiden Spannungswerten würde man jetzt mit dem Sin und Cos
multiplizieren. Wenn man diese beiden dann addiert erhält einen Sinus
mit einer bestimmten Phase (die irgendwo zwischen dem von dem
urpsrünglichen sin und cos liegt) und einer Amplitude die aus der
Überlagerung der beiden sinusförmigen Kurven entsteht.
Die Farbinformation steckt also in der Phase der 4,433MHz Schwingung
(bzw. genauer: In der Phasenverschiebung zwischen Burstschwingung und
dem Wert während der Bilddaten). Daher wird diese in jeder zweiten
Zeile invertiert, damit sich Phasenfehler auslöschen.
Ein wirklich brauchbares Bild lässt sich mit einem AVR aber nicht so
recht erzeugen.
Man müsste zumindest die sin/cos Modulation extern machen, so dass der
AVR nur noch die Y und R-Y und G-Y Signale erzeugen müsste.
Irgendwo hatte das mal jemand in einen FPGA gepackt, der aus RGB Daten
ein (digitales) FBAS Signal erzeugt hat.