Forum: Mikrocontroller und Digitale Elektronik Video PAL-Signal erzeugen


von Marcel H. (multiholle)


Angehängte Dateien:

Lesenswert?

Ich versuche gerade nach diesen Beschreibungen ein PAL-Signal für meinen 
Fernseher zu erzeugen: 
http://www.rickard.gunee.com/projects/video/pic/howto.php

Leider bekomme ich mit folgendem Code an meinem LCD-Fernseher nur ein 
schwarzes Bild. Ich habe leider kein Oszilloskop um das Signal zu 
prüfen, aber es sollte der Beschreibung entsprechen um drei horizontale 
Streifen zu erzeugen.

Könnt ihr einen Fehler im Code erkennen?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#define F_CPU 20000000UL
5
6
#define S_SYNC PORTD = 0
7
#define S_BLACK PORTD = 1 << PD6
8
#define S_GREY PORTD = 1 << PD5
9
#define S_WHITE PORTD = 1 << PD5 | 1 << PD6
10
11
int main(void) {
12
  // init output
13
  DDRD = 1 << PD5 | 1 << PD6;
14
  // timer prescaler 1
15
  TCCR1B |= 1 << CS10;
16
  // timer
17
  OCR1A = 1280;
18
  // timer
19
  TIMSK1 |= (1 << OCIE1A);
20
  // enable interrupts
21
  sei();
22
23
  while (1);
24
}
25
26
ISR(TIMER1_COMPA_vect) {
27
  /* hsync start (12 µs) */
28
  // 4 µs
29
  S_SYNC;
30
  while (TCNT1 < 80);
31
  // 8 µs
32
  S_BLACK;
33
  while (TCNT1 < 240);
34
  /* hsync end */
35
  
36
  /* data start (52 µs) */
37
  // 4 µs
38
  S_GREY;
39
  while (TCNT1 < 320);
40
  // 20 µs
41
  S_BLACK;
42
  while (TCNT1 < 720);
43
  // 4 µs
44
  S_WHITE;
45
  while (TCNT1 < 800);
46
  // 20 µs
47
  S_BLACK;  
48
  while (TCNT1 < 1200);
49
  // 4 µs
50
  S_GREY;
51
  /* data end */
52
}

von FullSync (Gast)


Lesenswert?

Moderne TV-Geräte, und ganz speziell diejenigen, bei denen die 
Eingangssignale nicht lange analog bleiben, sondern der größte Teil der 
internen Verarbeitung erst nach der Digitalisierung stattfindet, sind 
hinsichtlich der Signale nicht mehr so anspruchslos wie alte 
Röhrengeräte.

Üblicherweise werden nur "vollständige" Signale akzeptiert, in denen 
neben dem horiziontalen Frame auch ein vertikales durch entsprechende 
Synchronsignale definiert ist. Ganz ohne Grund ist diese 
"Empfindlichkeit" nicht - diese Rahmendefinitionen werden bspw. oft 
benötigt, um die digitalisierte Bildinformation passend in einem 
Zwischenspeicher abzulegen.

Allzu große Abweichungen bei der Horizontal- und Vertikalfrequenz werden 
auch nicht immer toleriert. Und schlimmer geht immer. Ich fernsehe 
gerade nebenbei auf einem ca. 10 Jahre alten IIYama 17-Zoll-TFT - damals 
die eierlegende Wollmilchsau mit FBAS, S-Video, VGA und DVI-Eingang - 
aber mit besonders feinem Geschmack für korrekte Signale: Falls am 
S-Video Eingang lediglich ein (normgerechtes) Schwarzweiss-Signal 
anliegt, aber am C-Pin die Farbinformation fehlt (bei einem reinen 
schwarzweiss-Signal also zumindest der Burst), wird das 
schwarzweiss-Bild ein zwei Sekunden korrekt angezeigt, aber dann geht 
das Gerät einfach auf Standby...

MfG

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Ich hab da auch gewisse Zweifel, dass das so ohne Vertical-Sync auf 
einem LCD überhaupt funktioniert, alte Fernseher sind da für die ersten 
Versuche besser. Ob deine ISR so überhaupt funktionieren kann weiß ich 
nicht genau, zumindest dürfte es kein scharfes Bild ergeben.

Direkt aufgefallen ist mir, dass du den Timer offensichtlich nicht im 
CTC-Modus betreibst und damit auch nur ab und an mal überhaupt eine 
Zeile gesendet wird. Die hintere Schwarzschulter fehlt auch. Bei 
Wikipedia gibt's da eine etwas detailiertere Beschreibung als bei 
Rickard Gunee.

Als ich mich mal mit dem Thema BAS beschäftigt hatte, habe ich den 
Simulator verwendet und mir den Port ausgeben lassen, da braucht man 
nicht unbedingt ein Oszi.

von Spess53 (Gast)


Lesenswert?

Hi

>Ich versuche gerade nach diesen Beschreibungen ein PAL-Signal für meinen
>Fernseher zu erzeugen:
>http://www.rickard.gunee.com/projects/video/pic/howto.php

Dir ist aber aufgefallen, das das Programm dort in Assembler geschrieben 
ist?
Ich bezweifle, das du mit C ein exaktes Timing hin bekommst.

MfG Spess

von Marcel H. (multiholle)


Lesenswert?

> Ich bezweifle, das du mit C ein exaktes Timing hin bekommst.
Ich habe ein Beispiel gefunden, welches in C implementiert wurde. 
Anscheinend ist es machbar.

> Direkt aufgefallen ist mir, dass du den Timer offensichtlich nicht im
> CTC-Modus betreibst und damit auch nur ab und an mal überhaupt eine
> Zeile gesendet wird.
Stimmt. Habe es durch ein TCNT1 = 0; zu Beginn der ISR korrigiert.

> Die hintere Schwarzschulter fehlt auch. Bei
> Wikipedia gibt's da eine etwas detailiertere Beschreibung als bei
> Rickard Gunee.
Ich habe ein Sync-Signal für 4 µs und anschließend eine hintere 
Schwarzschulter von 8 µs. Ist das nicht in Ordnung?

>Als ich mich mal mit dem Thema BAS beschäftigt hatte, habe ich den
>Simulator verwendet und mir den Port ausgeben lassen, da braucht man
>nicht unbedingt ein Oszi.
Gibt es einen brauchbaren Simulator für Linux (Ubuntu)? Ich kenne leider 
keinen :/


Ich werde dann mal versuchen das VSync Signal zu implementieren und so 
hoffentlich ein Bild zu erhalten.

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.