Forum: Mikrocontroller und Digitale Elektronik BAS-Signal mit ATMega32: kein Bild


von Christopher C. (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich versuche derzeit ein BAS-Signal mit dem ATMega32 am STK500 zu 
erzeugen. Es soll nur ein weißes Bild angezeigt werden. Zuerst habe ich 
es mit C versucht, dann hab ich aber schnell gemerkt, dass das eher eine 
Aufgabe für Assembler ist. Also schnell ein Programm in Assembler 
geschrieben und am Fernseher angeschlossen. Kein Bild. Signal am Oszi 
angeschaut, das Signal sollte eigentlich passen.

Hier das Programm:
1
.include "m32def.inc"
2
3
.def tmp1 = r16
4
.def state = r16
5
.def tmp2 = r17
6
.def sig_val = r18
7
.def none = r20
8
9
#define OUT_PIN PORTB
10
#define SIG_0V 0x00
11
#define SIG_0_3V 0x02
12
#define SIG_1V 0x01
13
14
#define STATE_DUR0 24
15
#define STATE_DUR1 73
16
#define STATE_DUR2 90
17
#define STATE_DUR3 812
18
19
#define STATE_FLAG0 0x01
20
#define STATE_FLAG1 0x02
21
#define STATE_FLAG2 0x04
22
#define STATE_FLAG3 0x08
23
24
#define STATE0 0
25
#define STATE1 1
26
#define STATE2 2
27
#define STATE3 3
28
29
.org 0x0000
30
  rjmp  main
31
.org OC1Aaddr
32
  rjmp timer1_compare
33
34
main:
35
  ;init stack
36
  ldi tmp1, HIGH(RAMEND)
37
  out SPH, tmp1
38
  ldi tmp1, LOW(RAMEND)
39
  out SPL, tmp1
40
41
  ;init output
42
  ldi  tmp1, 0xFF
43
  out  DDRB, tmp1
44
  
45
  ;set CTC-value
46
  ldi tmp1, HIGH(830)
47
  ldi tmp2, LOW(830)
48
  out OCR1AH, tmp1
49
  out OCR1AL, tmp2
50
51
  ;init timer
52
  ldi tmp1, (1<<WGM12) | (1<<CS10)  ;enable timer1, enable CTC-mode
53
  out TCCR1B, tmp1
54
  ldi tmp1, (1<<OCIE1A)  ;enable compare interrupt
55
  out TIMSK, tmp1
56
  
57
  ;prepare registers
58
  ldi tmp1, STATE_FLAG0
59
  ldi tmp2, 0x01
60
  clr none
61
62
  ;enable all interrupts
63
  sei
64
65
loop:
66
  rjmp loop
67
68
timer1_compare:
69
  sbrc state, STATE0
70
  rjmp state0
71
  
72
  sbrc state, STATE1
73
  rjmp state1
74
75
  sbrc state, STATE2
76
  rjmp state2
77
78
state3:
79
  ldi tmp2, SIG_1V
80
  out OUT_PIN, tmp2
81
  ldi tmp2, HIGH(STATE_DUR3)
82
  out OCR1AH, tmp2
83
  ldi tmp2, LOW(STATE_DUR3)
84
  out OCR1AL, tmp2
85
  ldi state, STATE_FLAG0
86
  reti
87
state1:
88
  ldi tmp2, SIG_0V
89
  out OUT_PIN, tmp2
90
  out OCR1AH, none
91
  ldi tmp2, LOW(STATE_DUR1)
92
  out OCR1AL, tmp2
93
  ldi state, STATE_FLAG2
94
  reti
95
state2:
96
  ldi tmp2, SIG_0_3V
97
  out OUT_PIN, tmp2
98
  out OCR1AH, none
99
  ldi tmp2, LOW(STATE_DUR2)
100
  out OCR1AL, tmp2
101
  ldi state, STATE_FLAG3
102
  reti
103
state0:
104
  ldi tmp2, SIG_0_3V
105
  out OUT_PIN, tmp2
106
  ldi state, STATE_FLAG1
107
  out OCR1AH, none
108
  ldi tmp2, LOW(STATE_DUR0)
109
  out OCR1AL, tmp2
110
  reti

Wie man sieht, erzeuge ich das Signal mit Port B. Pin0 erzeugt 1V, Pin1 
0,3V. Die Spannung wird mithilfe von Widerständen runtergeregelt. 1V und 
0,3V werden dann mit einer ODER-Schaltung verbunden und an einem Video 
Cinch Stecker angeschlossen. Der ATMega32 läuft mit 16MHz.

Das Timing ist zwar nicht ganz perfekt, das sollte den Fernseher aber 
nicht allzu stören. Es müsste daran liegen, dass es keine richtigen 
Flanken im Signal gibt (Siehe Bilder).
Die Frage lautet also, wie kann ich mit dem µC saubere Flanken erzeugen 
bei Zeiten von 1,5µs?

Vielen Dank für eure Hilfe!

von (prx) A. K. (prx)


Lesenswert?

16 MHz / 831 = 19,25 Khz. Was soll das sein? Eine halbwegs passende 
Zeilenfrequenz ist es jedenfalls nicht.

Bisschen kommentieren könnte nicht schaden. So beispielsweise welcher 
Status was bedeutet, was welche Pinsteuerungen eigentlich machen sollen, 
... Ist recht viel Arbeit, die du dem Leser zumutest.

Hardware beschreibt man primär als Bild, nicht als Prosa. Ja, ich weiss 
dass du kein Bild hast und keins brauchst. Aber ich brauch eines. 
Bilderprosa zu entschlüsseln ist mir ein Graus. Also mal eines von dem 
Gebilde zwischen AVR und TV, notfalls mit Papier und Bleistift.

Und dann such dir eine Cam, die auch im Stockdunklen noch rauscharme 
Bilder macht, oder ersatzweise eine Lichtquelle. Damit man dem Oszi 
wenigstens die Einstellungen entnehmen kann. Wenn du sie schon nicht 
nennst.

Die Zeilenlänge kriegt man bei einem Oszi leichter raus, indem man zwei 
Syncs anzeigt, nicht bloss eines. Das Bild vom Sync wiederum ist zu 
klein, um viel zu erkennen.

von Christopher C. (Gast)


Lesenswert?

A. K. schrieb:
> 16 MHz / 831 = 19,25 Khz. Was soll das sein? Eine halbwegs passende
> Zeilenfrequenz ist es jedenfalls nicht.
Warum?
1 Takt = 1 / 16MHz = 62ns
52Mikrosekunden = 62ns * 831

> Bisschen kommentieren könnte nicht schaden. So beispielsweise welcher
> Status was bedeutet, was welche Pinsteuerungen eigentlich machen sollen,
> ... Ist recht viel Arbeit, die du dem Leser zumutest.
Ich weiß, da das Programm allerdings seine Arbeit macht, hab ich es mir 
gespart. Ist nur zur Vollständigkeit hier.

> Hardware beschreibt man primär als Bild, nicht als Prosa. Ja, ich weiss
> dass du kein Bild hast und keins brauchst. Aber ich brauch eines.
> Bilderprosa zu entschlüsseln ist mir ein Graus. Also mal eines, notfalls
> mit Papier und Bleistift.
Die Beschreibung ist unkompliziert und kurz, außerdem kann ich die 
Schaltung als Problemstellung eigentlich auch ausschließen.

> Und dann such dir eine Cam, die auch im Stockdunklen noch rauscharme
> Bilder macht, oder ersatzweise eine Lichtquelle. Damit man dem Oszi
> wenigstens die Einstellungen entnehmen kann. Wenn du sie schon nicht
> nennst.
Eine andere Kamera habe ich derzeit nicht zur Hand. Beim ersten Bild 
habe ich bewusst das Licht ausgeschaltet, damit das Signal besser 
sichtbar ist.

Tut mir Leid, dass der Beitrag nicht dem akademischen Qualitätsanspruch 
genügt.

Das Signal muss eigentlich genau zu erkennene Flanken haben, deshalb 
glaube ich, dass das Problem ist. Das Timing braucht eigentlich nur 
Feineinstellung.

von (prx) A. K. (prx)


Lesenswert?

Christopher C. schrieb:
> Tut mir Leid, dass der Beitrag nicht dem akademischen Qualitätsanspruch
> genügt.

Kein Problem für mich. Aber du bist es, der Hilfe braucht. Nicht ich.

> Das Signal muss eigentlich genau zu erkennene Flanken haben.

Woher sollten die bei einem TV-Signal mit einer Bandbreite von einigen 
MHz kommen?

von (prx) A. K. (prx)


Lesenswert?

Christopher C. schrieb:
> 52Mikrosekunden = 62ns * 831

Bei einem zyklischen Timer, und das ist der CTC Modus, gehe ich davon 
aus, dass damit die Zeilenfrequenz gemeint ist. Und die liefert 64µs. 
Deine 52µs sind nur der angezeigte Teil der Zeile.

von (prx) A. K. (prx)


Lesenswert?

Christopher C. schrieb:
> Tut mir Leid, dass der Beitrag nicht dem akademischen Qualitätsanspruch
> genügt.

Soll heissen: Je mehr offensichtliche und insbesondere überflüssige 
Arbeit du dem Leser in einem Forum machst, desto grösser sind die 
Chancen, dass die Frage vom Leser aussortiert wird.

von Georg G. (df2au)


Lesenswert?

Falls es ein Signal nach europäischer Norm sein sollte: Wo erzeugst du 
den V-Sync? Ohne den verweigert ein TV-Gerät i.A. die Mitarbeit.

von Frank B. (elan40)


Lesenswert?

Schau dir doch erst einmal ein FBAS / BAS -Signal an.
Zeiten, Synchronimpuls, Schwarzschulter und ggfs. Burst-bei Farbe.

Grundlegend sind der Syncronimpuls und die Zeilenlänge, so das sich auch 
Halbbilder ergeben können. Wenn das Bild rein weiss sein soll, na?

von Christopher C. (Gast)


Lesenswert?

Aber natürlich! Der V-Sync fehlt. Ich sollte genauer lesen, denn ich 
dachte entweder H-Sync oder V-Sync, aber das ist natürlich Blödsinn. Ich 
werde das korrigieren und dann melden ich mich. Hoffentlich mit einem 
funktionierendem Signal.

von Frank B. (elan40)


Lesenswert?

Nochmals Eckdaten:

Die Zeilenfrequenz beträgt :_15,625Khz_

Bildwiederholfrequenz mal Zeilenauflösung ~  50Hz*625Zeilen=_31,25kHz_
Nun teilen wir das nocheinmal durch die Halbbilder.  31,25K/2 
=_15,625Khz_

Dieser "Ton" war bei den alten Kisten immer mal zu hören.

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.