Forum: Mikrocontroller und Digitale Elektronik AVR Atmega8 / Atmega32 - BAS Signal


von Alexander K. (sascha712)


Lesenswert?

Hallo,

ich bin neu hier und ich habe auch schon die suche benutzt. Aber das hat 
nicht so ganz das ergeben, was ich wollte.

Ich habe jetzt seit ein paar Tagen mit C programmieren angefangen und 
auch bereits kleinen erfolge verzeichnen können, wie zb. benutzung einer 
LED als Fotodiode, oder benutzen des AVRs, als kleinen Audio verstärker 
(allerdings sehr schlechter klang),... etc.

Nun möchte ich meinen TV als Display nutzen. Mir ist auch bekannt, das 
dies viel Speicher in anspruch nimmt, da das BAS Signal per software 
generiert wird.

Auch habe ich solche Projekte bereits gefunden. Aber ich möchte es 
selber programmieren und mir meinen Code nicht zusammen basteln.

Ziel ist es, den TV wie ein LCD Display anzusprechen. Sprich auswählen, 
wo was hinsoll und das dann ausgeben lassen.

Meinetwegen kann das alles auch von einem Atmega 8 als BAS signal 
erzeuger übernommen werden, während ein anderer AVR sich um das 
Hauptprogramm bemüht.
Eine hohe Auflösung brauche ich erstmal nicht. 6 Zeilen mit 12 Spalten 
würden erstmal reichen.

Bis jetzt habe ich einen weißen horizontalen Strich auf den TV bekommen. 
Ich habe den AVR auf 8 MHz getaktet, aber mit internem Oszilator.
Per _delay_us() habe ich pausen erzeugt, für zb. das Sync Signal.

Als schaltung habe ich einen 450 ohm und einen 900 ohm widerstand 
benutzt.
Somit kann ich theorethisch drei farben erzeugen(Schwarz, Grau und 
Weiß).

Bitte helft mir :D
MfG Alex

EDIT: Hier nochmal der neu entwickelte Code einfach nur um graue und 
weiße balken darzustellen. Funzt aber nicht.... Ich bin schon am 
verzweifeln.
1
#include <avr/io.h>
2
3
4
int main(void)
5
{
6
  DDRC = 0b00000011;        //PINC0 = 900ohm / PINC1 = 450ohm
7
                  //00=Sync=0v; 01=Schwarz=0,3v; 10=Grau=0,7v; 11=Weiß=1v
8
  PORTC = 0b00000000;
9
  int n=1;            //Zaehler pro Halber Scanline
10
  TCCR1B = 0b00000001;      //no prescaling
11
  
12
  
13
  while(1)
14
  {
15
    //Vortrabanten
16
    if(n == 621|622|623|624|625 && TCNT1 < 17)
17
    {
18
      PORTC = 0b00000000;
19
    }
20
    if(n == 621|622|623|624|625 && TCNT1 > 16 && TCNT1 < 257)
21
    {
22
      PORTC = 0b00000001;
23
      n ++;
24
      if(TCNT1 == 256)
25
      {
26
        TCNT1 = 0;
27
      }
28
    }
29
    //Hauptimpulse; Trabanten
30
    if(n == 1|2|3|4|5 && TCNT1 < 218)  //CPU Takt bei ca. 8 MHz; 218 ~ 27,3us
31
    {                  //1 us entspricht 8 Timer schritten
32
      PORTC = 0b00000000;
33
    }
34
    if(n == 1|2|3|4|5 && TCNT1 > 217 && TCNT1 < 257)  //Nach langen syncimpulsen folgt 
35
    {
36
      PORTC = 0b00000001;
37
      n ++;                      //n um eins erhöhen, da eine halbe Scanline um
38
      if(TCNT1 == 256)
39
      {
40
        TCNT1 = 0;
41
      }                      
42
    }
43
    //Nachtrabanten
44
    if(n == 6|7|8|9|10 && TCNT1 < 17)
45
    {
46
      PORTC = 0b00000000;
47
    }
48
    if(n == 6|7|8|9|10 && TCNT1 > 16 && TCNT1 < 257)
49
    {
50
      PORTC = 0b00000001;
51
      n ++;
52
      if(TCNT1 == 256)
53
      {
54
        TCNT1 = 0;
55
      }
56
    }
57
    //1. Halbbilder
58
    if(n > 10 && n < 620 && TCNT1 < 33)        //Hsyncimpuls
59
    {
60
      PORTC = 0b00000000;
61
    }
62
    if(n > 10 && n < 620 && TCNT1 > 32 && TCNT1 < 81)  //vordere Schwarzschulter
63
    {
64
      PORTC = 0b00000001;
65
    }
66
      if(n > 10 && n < 620 && TCNT1 > 80)      //Scanline
67
      {
68
        if(TCNT1 < 200)
69
        {
70
          PORTC = 0b00000010;            //grau
71
        }
72
        if(TCNT1 > 199 && TCNT1 < 300)
73
        {
74
          PORTC = 0b00000011;            //weiß
75
        }
76
        if(TCNT1 > 299 && TCNT1 < 497)
77
        {
78
          PORTC = 0b00000001;            //schwarz
79
        }
80
        
81
      }
82
    if(n > 10 && n <= 620 && TCNT1 > 496 && TCNT1 < 513)  //hintere Schwarzschulter
83
    {
84
      PORTC = 0b00000001;
85
      n ++;
86
      if(TCNT1 == 512)
87
      {
88
        TCNT1 = 0;
89
      }
90
    }
91
    
92
    if(n == 621)            //n zuruecksetzen, damit die schleife wieder beginnen kann
93
    {
94
      n = 1;
95
    }
96
  
97
  }
98
}

von Krapao (Gast)


Lesenswert?

> n == 1|2|3|4|5

Obacht: Diese Bedingung prüft nicht, ob der Zeilenzähler n 1,2,3,4 
oder 5 ist! Siehe Bitmanipulation

von Mark L. (m2k10) Benutzerseite


Lesenswert?

Ich würde ja glatt mal behaupten, dass das so gar nicht funktionieren 
kann. Das Timing ist viel zu knapp bzw. ein AVR deutlich zu langsam, um 
das mit if/then zu lösen. Bis dein Controller sich durch die ganzen 
Abfragen gehangelt hat um zu merken, was er tun soll, ist der passende 
Zeitpunkt längst vorbei. Dein erster Ansatz mit Delays war gar nicht so 
falsch, Bspw. beim H-Sync hast du ganze 37(,6)-Prozessortakte Zeit, da 
kann man nicht viel rechnen und abfragen sondern einfach nur ganz 
stupide warten und reagieren.

Ich selbst verwende für TV-Ausgabe nur durchgezählten Assemblercode, da 
gehen sogar 80 Zeichen je Zeile(512 Pixel) noch flimmerfrei. Einen 
Jitter von einem einzigen Takt sieht man schon deutlich, daher wird an 
Assembler wohl kaum ein Weg vorbei führen, zumindest an 
Timing-kritischen Stellen.

Die Synchronimpulse kann man gut über einen Timer als PWM erzeugen, 
Pixelausgabe, besonders für Zeichendarstellung, geht super über den SPI.

Vielleicht hilft auch diese Seite:
https://instruct1.cit.cornell.edu/courses/ee476/video/index.html

Mark

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.