Forum: Mikrocontroller und Digitale Elektronik TV Bild mit AVR


von Benedikt (Gast)


Lesenswert?

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 ?

von Dominik (Gast)


Lesenswert?

Hey!

Ich schätz mal hier findest des was du suchst!!

http://www.ulrichradig.de

Gruß

PS: Ich hass die neue Suche!!!

von Rahul (Gast)


Lesenswert?


von Benedikt (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

Mehr Performance gibts auch fertig im DIL-28 Gehäuse ab 4,99 Euro:
http://cgi.ebay.de/TVT-MD-11T-IC-fuer-Textausgabe-auf-TV-mit-9600-Baud_W0QQitemZ5852894039QQcategoryZ12949QQssPageNameZWDVWQQrdZ1QQcmdZViewItem

Es existiert auch eine Version mit PC-Tastaturkonverter
und Echtzeit-Balkengrafik (TVT-MBKD-11), gibts auch bei eBay (ab
8,45).

Dürfte sich wohl um einen ATMEGA8/88/168 handeln.

MfG

Wolfgang

von Thomas K (Gast)


Lesenswert?

Also langsam könnte ich verstehen wenn sich jemand das ganze Forum
herunterladen will. Schließlich könnte man dann richtig suchen :/

von Andreas W. (Gast)


Lesenswert?


von Jan (Gast)


Lesenswert?

Hallo,
in diesem Thread findest du mein
RS232-Videoterminal mit BAS-Video-Out für AVR Mega-8
Vielleicht hilft dir das.

http://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=5880&postdays=0&postorder=asc&start=198

Gruß Jan

von Benedikt (Gast)


Lesenswert?

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.

von Sebastian Heyn (Gast)


Lesenswert?

mal ne dumme frage interlaced ihr die bas signale oder einfach zeilen
durchgehend?

von Jan (Gast)


Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

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.

von Sebastian Heyn (Gast)


Lesenswert?

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.

von Benedikt (Gast)


Lesenswert?

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.

von Sebastian Heyn (Gast)


Lesenswert?

Also du hast 17,7Mhz takt (4xPAL) und erzeugst damit ein fbas signal?
Kann man sich das mal anschauen? das wäre verdammt interessant.

von Sebastian Heyn (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

@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

von Benedikt (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

Danke Benedikt,

das sind sehr interessante Hinweise,

ich werde es mal testen ;)

Gruß

Bernhard

von Jan (Gast)


Lesenswert?

Hallo,
Hier wird der Aufbau des TV-Signales recht gut beschrieben,
inkl. Vertikale Austastlücke mit Vor- und Nachtrabanten. (Bild 13)
Auch auf das Timing und die Pegel wird eingegegangen.

http://info.electronicwerkstatt.de/bereiche/fernsehtechnik/tvsignale/tv_4.html

Gruß Jan

von Profi (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

@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

von Paul Baumann (Gast)


Lesenswert?

@Bernhard
Mit der Vorderflanke synchronisiert er auf Zeile. Hier ist auch eine
gute Beschreibung:
http://www.2cool4u.ch/tv_signal_measurement/tv_signale_grundlagen/tv_signale_grundlagen.pdf#search=%22bas%20signal%22

MfG Paul

von Bernhard S. (bernhard)


Lesenswert?

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

von Philipp (Gast)


Lesenswert?

"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 ...

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

@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

von Paul Baumann (Gast)


Lesenswert?

@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

von Bernhard S. (bernhard)


Lesenswert?

@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) :-)))

von Bernhard S. (bernhard)


Lesenswert?

@Benedikt

Was ist eigentlich aus Deinem TV-PROJEKT geworden?

Konntest Du es realisieren?

von Benedikt (Gast)


Lesenswert?

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)

von Bernhard S. (bernhard)


Lesenswert?

@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

von Benedikt (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

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

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

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

von Sebastian Heyn (Gast)


Lesenswert?

was für einen zeichensatz benötigst du denn?

von Bernhard S. (bernhard)


Lesenswert?

@Sebastian Heyn

>was für einen zeichensatz benötigst du denn?

Ein Zeichen ist aus 5x8, eigentlich 5x7 Zeichen aufgebaut.

Beispiele für die Zahlen 0..9:

.db 14,17,25,21,19,17,14,0   ;0(48)
.db 4,6,4,4,4,4,14,0     ;1(49)
.db 14,17,16,8,4,2,31,0    ;2(50)
.db 31,8,4,8,16,16,15,0    ;3(51)
.db 8,12,10,9,31,8,8,0    ;4(52)
.db 31,1,15,16,16,16,15,0   ;5(53)
.db 24,4,2,15,17,17,14,0  ;6(54)
.db 31,16,8,4,4,4,4,0    ;7(55)
.db 14,17,17,14,17,17,14,0  ;8(56)
.db 14,17,17,30,16,8,6,0  ;9(57)

von Sebastian Heyn (Gast)


Lesenswert?

Data &H00 , &H00 , &H0E , &H01 , &H0F , &H11 , &H0F , &H00  'a
Data &H10 , &H10 , &H1E , &H11 , &H11 , &H11 , &H1E , &H00  'b
Data &H00 , &H00 , &H0E , &H11 , &H10 , &H11 , &H0E , &H00  'c
Data &H01 , &H01 , &H0F , &H11 , &H11 , &H11 , &H0F , &H00  'd
Data &H00 , &H00 , &H0E , &H11 , &H1F , &H10 , &H0E , &H00  'e
Data &H06 , &H08 , &H08 , &H1E , &H08 , &H08 , &H08 , &H00  'f
Data &H00 , &H00 , &H0F , &H11 , &H11 , &H0F , &H01 , &H0E  'g
Data &H10 , &H10 , &H1C , &H12 , &H12 , &H12 , &H12 , &H00  'h
Data &H04 , &H00 , &H04 , &H04 , &H04 , &H04 , &H04 , &H00  'i
Data &H02 , &H00 , &H06 , &H02 , &H02 , &H02 , &H12 , &H0C  'j
Data &H10 , &H10 , &H12 , &H14 , &H18 , &H14 , &H12 , &H00  'k
Data &H04 , &H04 , &H04 , &H04 , &H04 , &H04 , &H06 , &H00  'l
Data &H00 , &H00 , &H1A , &H15 , &H15 , &H11 , &H11 , &H00  'm
Data &H00 , &H00 , &H1C , &H12 , &H12 , &H12 , &H12 , &H00  'n
Data &H00 , &H00 , &H0E , &H11 , &H11 , &H11 , &H0E , &H00  'o
Data &H00 , &H00 , &H1E , &H11 , &H11 , &H11 , &H1E , &H10  'p
Data &H00 , &H00 , &H0F , &H11 , &H11 , &H11 , &H0F , &H01  'q
Data &H00 , &H00 , &H16 , &H09 , &H08 , &H08 , &H1C , &H00  'r
Data &H00 , &H00 , &H0E , &H10 , &H0E , &H01 , &H0E , &H00  's
Data &H00 , &H08 , &H1E , &H08 , &H08 , &H0A , &H04 , &H00  't
Data &H00 , &H00 , &H12 , &H12 , &H12 , &H16 , &H0A , &H00  'u
Data &H00 , &H00 , &H11 , &H11 , &H11 , &H0A , &H04 , &H00  'v
Data &H00 , &H00 , &H11 , &H11 , &H15 , &H1F , &H0A , &H00  'w
Data &H00 , &H00 , &H12 , &H12 , &H0C , &H12 , &H12 , &H00  'x
Data &H00 , &H00 , &H12 , &H12 , &H12 , &H0E , &H04 , &H18  'y
Data &H00 , &H00 , &H1E , &H02 , &H0C , &H10 , &H1E , &H00  'z

Data &H0E , &H11 , &H11 , &H1F , &H11 , &H11 , &H11 , &H00  'A
Data &H1E , &H11 , &H11 , &H1E , &H11 , &H11 , &H1E , &H00  'B
Data &H0E , &H11 , &H10 , &H10 , &H10 , &H11 , &H0E , &H00  'C
Data &H1E , &H11 , &H11 , &H11 , &H11 , &H11 , &H1E , &H00  'D
Data &H1F , &H10 , &H10 , &H1E , &H10 , &H10 , &H1F , &H00  'E
Data &H1F , &H10 , &H10 , &H1E , &H10 , &H10 , &H10 , &H00  'F
Data &H0E , &H11 , &H10 , &H17 , &H11 , &H11 , &H0F , &H00  'G
Data &H11 , &H11 , &H11 , &H1F , &H11 , &H11 , &H11 , &H00  'H
Data &H0E , &H04 , &H04 , &H04 , &H04 , &H04 , &H0E , &H00  'I
Data &H01 , &H01 , &H01 , &H01 , &H11 , &H11 , &H0E , &H00  'J
Data &H11 , &H12 , &H14 , &H18 , &H14 , &H12 , &H11 , &H00  'K
Data &H10 , &H10 , &H10 , &H10 , &H10 , &H10 , &H1F , &H00  'L
Data &H11 , &H1B , &H15 , &H11 , &H11 , &H11 , &H11 , &H00  'M
Data &H11 , &H19 , &H15 , &H13 , &H11 , &H11 , &H11 , &H00  'N
Data &H0E , &H11 , &H11 , &H11 , &H11 , &H11 , &H0E , &H00  'O
Data &H1E , &H11 , &H11 , &H1E , &H10 , &H10 , &H10 , &H00  'P
Data &H0E , &H11 , &H11 , &H11 , &H15 , &H12 , &H0D , &H00  'Q
Data &H1E , &H11 , &H11 , &H1E , &H12 , &H11 , &H11 , &H00  'R
Data &H0E , &H11 , &H10 , &H0E , &H01 , &H11 , &H0E , &H00  'S
Data &H1F , &H04 , &H04 , &H04 , &H04 , &H04 , &H04 , &H00  'T
Data &H11 , &H11 , &H11 , &H11 , &H11 , &H11 , &H0E , &H00  'U
Data &H11 , &H11 , &H11 , &H11 , &H11 , &H0A , &H04 , &H00  'V
Data &H11 , &H11 , &H15 , &H15 , &H15 , &H15 , &H0A , &H00  'W
Data &H11 , &H11 , &H0A , &H04 , &H0A , &H11 , &H11 , &H00  'X
Data &H11 , &H11 , &H11 , &H0A , &H04 , &H04 , &H04 , &H00  'Y
Data &H1E , &H02 , &H04 , &H08 , &H10 , &H10 , &H1E , &H00  'Z

Data &H0E , &H11 , &H13 , &H15 , &H19 , &H11 , &H0E , &H00  '0
Data &H04 , &H0C , &H04 , &H04 , &H04 , &H04 , &H0E , &H00  '1
Data &H0E , &H11 , &H01 , &H06 , &H08 , &H10 , &H1F , &H00  '2
Data &H0E , &H11 , &H01 , &H0E , &H01 , &H11 , &H0E , &H00  '3
Data &H02 , &H06 , &H0A , &H12 , &H1F , &H02 , &H02 , &H00  '4
Data &H1F , &H10 , &H10 , &H1E , &H01 , &H11 , &H0E , &H00  '5
Data &H06 , &H08 , &H10 , &H1E , &H11 , &H11 , &H0E , &H00  '6
Data &H1F , &H01 , &H02 , &H04 , &H08 , &H08 , &H08 , &H00  '7
Data &H0E , &H11 , &H11 , &H0E , &H11 , &H11 , &H0E , &H00  '8
Data &H0E , &H11 , &H11 , &H0F , &H01 , &H02 , &H0C , &H00  '9

Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00  ' Space
Data &H04 , &H0E , &H0E , &H04 , &H04 , &H00 , &H04 , &H00  '!
Data &H1B , &H1B , &H12 , &H00 , &H00 , &H00 , &H00 , &H00  '
Anführungszeichen
Data &H00 , &H0A , &H1F , &H0A , &H0A , &H1F , &H0A , &H00  '#
Data &H08 , &H0E , &H10 , &H0C , &H02 , &H1C , &H04 , &H00  '$
Data &H19 , &H19 , &H02 , &H04 , &H08 , &H13 , &H13 , &H00  '%
Data &H08 , &H14 , &H14 , &H08 , &H15 , &H12 , &H0D , &H00  '&
Data &H0C , &H0C , &H08 , &H00 , &H00 , &H00 , &H00 , &H00  '
Data &H04 , &H08 , &H08 , &H08 , &H08 , &H08 , &H04 , &H00  '
Data &H08 , &H04 , &H04 , &H04 , &H04 , &H04 , &H08 , &H00  '
Data &H00 , &H0A , &H0E , &H1F , &H0E , &H0A , &H00 , &H00  '*
Data &H00 , &H04 , &H04 , &H1F , &H04 , &H04 , &H00 , &H00  '+
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H0C , &H0C , &H08  ',
Data &H00 , &H00 , &H00 , &H1F , &H00 , &H00 , &H00 , &H00  '-
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H0C , &H0C , &H00  '.
Data &H00 , &H01 , &H02 , &H04 , &H08 , &H10 , &H00 , &H00  '/

von Bernhard S. (bernhard)


Lesenswert?

Hallo Sebastian,

hab's gerade mal getestet.

Leider sind alle Zeichen spiegelverkehrt

Schade.

Trotzdem danke

Gruß

Bernhard

von Philipp (Gast)


Lesenswert?

Wenn Du einen Linksshift durch Rechtsshift ersetzt (bzw. umgekehrt), ist
es doch richtig. Also wirklich!

von Bernhard S. (bernhard)


Lesenswert?

@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

von Sebastian Heyn (Gast)


Lesenswert?

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...

von Sebastian Heyn (Gast)


Lesenswert?

@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...

von Benedikt (Gast)


Lesenswert?

Wiso synchronisieren ?
Der AVR erzeugt Sync und Videodaten, dadurch sind beide automatisch
synchron.

von Sebastian Heyn (Gast)


Lesenswert?

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.

von Benedikt (Gast)


Lesenswert?

Das war ein anderes Projekt, bei dem es darum ging einfach nur ein
festes Bild zu erzeugen.

von Philipp (Gast)


Lesenswert?

@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.

von Bernhard S. (bernhard)


Lesenswert?

@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 ;)

von Sebba (Gast)


Lesenswert?

Probiers mal mit der Tabelle hier:
Hatte n bissl langeweile, ich hoffe, die is richtig



Data &H00 , &H00 , &H70 , &H80 , &HF0 , &H88 , &HF0 , &H00
Data &H08 , &H08 , &H78 , &H88 , &H88 , &H88 , &H78 , &H00
Data &H00 , &H00 , &H70 , &H88 , &H08 , &H88 , &H70 , &H00
Data &H80 , &H80 , &HF0 , &H88 , &H88 , &H88 , &HF0 , &H00
Data &H00 , &H00 , &H70 , &H88 , &HF8 , &H08 , &H70 , &H00
Data &H60 , &H10 , &H10 , &H78 , &H10 , &H10 , &H10 , &H00
Data &H00 , &H00 , &HF0 , &H88 , &H88 , &HF0 , &H80 , &H70
Data &H08 , &H08 , &H38 , &H48 , &H48 , &H48 , &H48 , &H00
Data &H20 , &H00 , &H20 , &H20 , &H20 , &H20 , &H20 , &H00
Data &H40 , &H00 , &H60 , &H40 , &H40 , &H40 , &H48 , &H30
Data &H08 , &H08 , &H48 , &H28 , &H18 , &H28 , &H48 , &H00
Data &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H60 , &H00
Data &H00 , &H00 , &H58 , &HA8 , &HA8 , &H88 , &H88 , &H00
Data &H00 , &H00 , &H38 , &H48 , &H48 , &H48 , &H48 , &H00
Data &H00 , &H00 , &H70 , &H88 , &H88 , &H88 , &H70 , &H00
Data &H00 , &H00 , &H78 , &H88 , &H88 , &H88 , &H78 , &H08
Data &H00 , &H00 , &HF0 , &H88 , &H88 , &H88 , &HF0 , &H80
Data &H00 , &H00 , &H68 , &H90 , &H10 , &H10 , &H38 , &H00
Data &H00 , &H00 , &H70 , &H08 , &H70 , &H80 , &H70 , &H00
Data &H00 , &H10 , &H78 , &H10 , &H10 , &H50 , &H20 , &H00
Data &H00 , &H00 , &H48 , &H48 , &H48 , &H68 , &H50 , &H00
Data &H00 , &H00 , &H88 , &H88 , &H88 , &H50 , &H20 , &H00
Data &H00 , &H00 , &H88 , &H88 , &HA8 , &HF8 , &H50 , &H00
Data &H00 , &H00 , &H48 , &H48 , &H30 , &H48 , &H48 , &H00
Data &H00 , &H00 , &H48 , &H48 , &H48 , &H70 , &H20 , &H18
Data &H00 , &H00 , &H78 , &H40 , &H30 , &H08 , &H78 , &H00

Data &H70 , &H88 , &H88 , &HF8 , &H88 , &H88 , &H88 , &H00
Data &H78 , &H88 , &H88 , &H78 , &H88 , &H88 , &H78 , &H00
Data &H70 , &H88 , &H08 , &H08 , &H08 , &H88 , &H70 , &H00
Data &H78 , &H88 , &H88 , &H88 , &H88 , &H88 , &H78 , &H00
Data &HF8 , &H08 , &H08 , &H78 , &H08 , &H08 , &HF8 , &H00
Data &HF8 , &H08 , &H08 , &H78 , &H08 , &H08 , &H08 , &H00
Data &H70 , &H88 , &H08 , &HE8 , &H88 , &H88 , &HF0 , &H00
Data &H88 , &H88 , &H88 , &HF8 , &H88 , &H88 , &H88 , &H00
Data &H70 , &H20 , &H20 , &H20 , &H20 , &H20 , &H70 , &H00
Data &H80 , &H80 , &H80 , &H80 , &H88 , &H88 , &H70 , &H00
Data &H88 , &H48 , &H28 , &H18 , &H28 , &H48 , &H88 , &H00
Data &H08 , &H08 , &H08 , &H08 , &H08 , &H08 , &HF8 , &H00
Data &H88 , &HD8 , &HA8 , &H88 , &H88 , &H88 , &H88 , &H00
Data &H88 , &H98 , &HA8 , &HC8 , &H88 , &H88 , &H88 , &H00
Data &H70 , &H88 , &H88 , &H88 , &H88 , &H88 , &H70 , &H00
Data &H78 , &H88 , &H88 , &H78 , &H08 , &H08 , &H08 , &H00
Data &H70 , &H88 , &H88 , &H88 , &HA8 , &H48 , &HB0 , &H00
Data &H78 , &H88 , &H88 , &H78 , &H48 , &H88 , &H88 , &H00
Data &H70 , &H88 , &H08 , &H70 , &H80 , &H88 , &H70 , &H00
Data &HF8 , &H20 , &H20 , &H20 , &H20 , &H20 , &H20 , &H00
Data &H88 , &H88 , &H88 , &H88 , &H88 , &H88 , &H70 , &H00
Data &H88 , &H88 , &H88 , &H88 , &H88 , &H50 , &H20 , &H00
Data &H88 , &H88 , &HA8 , &HA8 , &HA8 , &HA8 , &H50 , &H00
Data &H88 , &H88 , &H50 , &H20 , &H50 , &H88 , &H88 , &H00
Data &H88 , &H88 , &H88 , &H50 , &H20 , &H20 , &H20 , &H00
Data &H78 , &H40 , &H20 , &H10 , &H08 , &H08 , &H78 , &H00

Data &H70 , &H88 , &HC8 , &HA8 , &H98 , &H88 , &H70 , &H00
Data &H20 , &H30 , &H20 , &H20 , &H20 , &H20 , &H70 , &H00
Data &H70 , &H88 , &H80 , &H60 , &H10 , &H08 , &HF8 , &H00
Data &H70 , &H88 , &H80 , &H70 , &H80 , &H88 , &H70 , &H00
Data &H40 , &H60 , &H50 , &H48 , &HF8 , &H40 , &H40 , &H00
Data &HF8 , &H08 , &H08 , &H78 , &H80 , &H88 , &H70 , &H00
Data &H60 , &H10 , &H08 , &H78 , &H88 , &H88 , &H70 , &H00
Data &HF8 , &H80 , &H40 , &H20 , &H10 , &H10 , &H10 , &H00
Data &H70 , &H88 , &H88 , &H70 , &H88 , &H88 , &H70 , &H00
Data &H70 , &H88 , &H88 , &HF0 , &H80 , &H40 , &H30 , &H00

Data &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H20 , &H70 , &H70 , &H20 , &H20 , &H00 , &H20 , &H00
Data &HD8 , &HD8 , &H48 , &H00 , &H00 , &H00 , &H00 , &H00

Data &H00 , &H50 , &HF8 , &H50 , &H50 , &HF8 , &H50 , &H00
Data &H10 , &H70 , &H08 , &H30 , &H40 , &H38 , &H20 , &H00
Data &H98 , &H98 , &H40 , &H20 , &H10 , &HC8 , &HC8 , &H00
Data &H10 , &H28 , &H28 , &H10 , &HA8 , &H48 , &HB0 , &H00
Data &H30 , &H30 , &H10 , &H00 , &H00 , &H00 , &H00 , &H00
Data &H20 , &H10 , &H10 , &H10 , &H10 , &H10 , &H20 , &H00
Data &H10 , &H20 , &H20 , &H20 , &H20 , &H20 , &H10 , &H00
Data &H00 , &H50 , &H70 , &HF8 , &H70 , &H50 , &H00 , &H00
Data &H00 , &H20 , &H20 , &HF8 , &H20 , &H20 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H30 , &H30 , &H10
Data &H00 , &H00 , &H00 , &HF8 , &H00 , &H00 , &H00 , &H00
Data &H00 , &H00 , &H00 , &H00 , &H00 , &H30 , &H30 , &H00

von Bernhard S. (bernhard)


Lesenswert?

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

von Sebba (Gast)


Lesenswert?

ach ja, sorry

ist genau die tabelle die weiter oben schon gepostet is - nur halt alle
Bits vertauscht

also Zeile 1 - 26 a-z
     Zeile 28-... A-Z
usw

von Hauke Radtki (Gast)


Lesenswert?

Ich hab n Programm geschrieben um die Zeichen zu erzeugen:
http://www.mikrocontroller.net/forum/read-4-422387.html

Vielleicht kann ja jemand was damit anfangen :)

von Viktor (Gast)


Lesenswert?

ne kurze frage:

ist das so korrekt? ->

vsync -> 1.Zeile (Hsync vorne weg) -> 2.Zeile (hysnc vorne weg) -> ...
-> 240. Zeile -> vsync

von Bernhard S. (bernhard)


Lesenswert?

@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

von Viktor (Gast)


Lesenswert?

ja okay, habe ich ja.
wieviele der zeilen werden nicht sichtbar sein?

von Bernhard S. (bernhard)


Lesenswert?

@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

von Christof Rieger (Gast)


Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

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.

von Läubi (Gast)


Lesenswert?

Benedikt, das TWI kann sozsuagen auf "Pause" gestellt werden, da geht
nix verloren, weil das ne getaktete Übertragung ist.

von Christof Riger (Gast)


Lesenswert?

@ 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€

von Läubi (Gast)


Lesenswert?

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.

von Christof Riger (Gast)


Lesenswert?

Eigendlich ist ja auch gut, wenn man zwischein einem Projekt mit RS232
und I2C schnitstelle wählen kann.

Gruß Christof

von Benedikt (Gast)


Lesenswert?

@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.

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

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

von Bernhard S. (bernhard)


Angehängte Dateien:

Lesenswert?

Etwas vergrößert....

Man erkennt, das eine Zeichen-Zeile aus 4 TV-Zeilen zusammengesetzt
ist.

von Jan (Gast)


Lesenswert?

@Bernhard:
>>Mein TV-Projekt läuft auch

Gratuliere, sie doch Klasse aus !
Womit ist das realisiert ? C ? ASM ?

Schöne grosse Zeichen! ;-)

Gruß Jan

von Bernhard S. (bernhard)


Lesenswert?

@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

von Paul Baumann (Gast)


Lesenswert?

@Bernhard

Hut ab! Eine feine Sache hast Du da programmiert. Läuft es mit Atmega8
oder mit einem von den "Größeren"?

MfG Paul

von Bernhard S. (bernhard)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

@alle

Ich habe das TV-Projekt mal veröffentlicht:

http://www.mikrocontroller.net/forum/read-4-427581.html

Bernhard

von Jan (Gast)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

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

von Bernhard S. (bernhard)


Lesenswert?

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

von JanB (Gast)


Lesenswert?

>>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

von Bernhard S. (bernhard)


Lesenswert?

@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

von Benedikt (Gast)


Lesenswert?

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 ?

von Bernhard S. (bernhard)


Lesenswert?

>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. ?

von Benedikt (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

>Wie funktioniert die Kontrolle durch den 2. Timer genau ?

ganz einfach:
  1. den Kontrolltimer einlesen
  2. Eine Differenz berechnen (Kontrolltimer - xx)
     (xx wird beim allerersten Interruptaufruf eingelesen)
  3. Taktausgleich==> Sprung auf Programm-Adresse durch "IJMP"

1.
; TAKT-Synchronisation   TIMER2 auslesen
        in   temp, TCNT2

2.
; TAKT-Synchronisation Berechnung der "NOPs"
        sub  temp,TV_TAKT

3.
; TAKT-SYNCHRONISATION Z-Zeiger initialisieren
  ldi ZL,low (TAKT_SYNCHRONISATION)
  ldi ZH,HIGH(TAKT_SYNCHRONISATION)
  add ZL,temp
  adc ZH,NULL
  IJMP   ; SPRUNG (Adresse in Z)
TAKT_SYNCHRONISATION:
        nop
        ...

von Benedikt (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

>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 ?

von Benedikt (Gast)


Lesenswert?

Bin gerade dabei am Testen...

von Benedikt (Gast)


Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

> 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?

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

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)

von Benedikt (Gast)


Lesenswert?

Ich habe die Software mal in die Codesammlung gestellt.
Ich habe noch kein Programm eingebaut, das den Text erzeugt, das kann
jeder selbst machen:

http://www.mikrocontroller.net/forum/read-4-429298.html#new

von Bernhard S. (bernhard)


Lesenswert?

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?

von Benedikt (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Bernhard S. (bernhard)


Lesenswert?

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

von Benedikt (Gast)


Lesenswert?

>...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.

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
Noch kein Account? Hier anmelden.