BAS-Signal mit ATMega32: kein Bild

Gast #2977904
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!
Angehängte Dateien:
#2977940
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.
Gast #2977986
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.
Gast #2978065
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren