Forum: Mikrocontroller und Digitale Elektronik Videosignalerzeugung


von Julius Krebs (Gast)


Angehängte Dateien:

Lesenswert?

Ich arbeite momentan an einem Programm zur Videosignalerzeugung. Ich 
möchte nämlich einen Fernseher als Display benutzen. Ich habe dafür 
einen at90S8535 bei 8 MHZ eingesetzt. Programmiert wird das ganze mit 
dem GNU Compiler, also in C. Und da liegt auch schon der Haken. Ich habe 
es zwar mittlerweile geschafft, mehrere Rechtecke auszugeben, doch dies 
gelang mir nur über sehr umständliche Wege. Dabei war das Hauptproblem, 
dass in If-Verzweigungen oftmals die Variablenwerte nicht richtig 
abgerufen wurden bzw. nicht aktualisiert wurden. Die Folgen kann man 
sich ja denken. Meine erste Idee bestand darin jeweils ein Delay vor 
eine Abfrage zu setzten, doch das half auch nicht weiter. Dann machte 
ich jedoch eine merkwürdige Entdeckung: Ich verwendete statt eines 
Delays einen einfachen Timer-Reset, also eine Zurückstellung auf 0, und 
all meine Probleme waren gelöst. (Der entsprechende Befehl lautet: 
start_timer_8();)  Die Variablenwerte wurden nun korrekt aktualisiert 
und das Programm lief flüssig. Kann sich das jemand erklären?
Der Code, und ein Testbild befindet sich im Anhang.

von Julius Krebs (Gast)


Angehängte Dateien:

Lesenswert?

Das Testbild hat nicht mehr reingepasst...

von Markus Kaufmann (Gast)


Lesenswert?

Ich hab' mir Dein Programm jetzt nicht näher angeschaut, aber die 
Symptome mit den nicht aktualisierten Variablen deuten eigentlich auf 
das übliche Variablen-im-Interrupt-verändern hin:

Der C-Compiler geht davon aus, daß sich Variablen nicht "einfach so" 
ändern. D.h. wenn man z.B. sowas schreibt:
a = 3;
a += 1;
Dann geht der Compiler davon aus, daß sich a zwischen der ersten und 
zweite Zeile nicht verändert hat. Das ist auch meistens so, außer wenn 
man z.B. die Variable im Interrupt ändert.

Dagegen hilft, daß man die Variable als "volatile" deklariert, dann 
stimmt das wieder.

bye
  Markus

von thkais (Gast)


Lesenswert?

Hmpf - ich stehe mit C auf dem Kriegsfuß. Für mich sieht das immer so 
aus, als ob ein Haustier auf der Tastatur rumgelaufen ist...
Mal ne Frage: Wenn ich das richtig interpretiere, dann war Dein Delay 
vorher per Verzögerungsschleife realisiert. Dann könnte auch die Ursache 
sein, daß ein "dazwischengeschobener" Interrupt das Delay verlängert 
hat. Solche zeitkritische Geschichten sollte man immer mit einem Timer 
machen.

von Julius Krebs (Gast)


Angehängte Dateien:

Lesenswert?

Ich bin dem Rat gefolgt und habe „volatile“ vor die 
Variablendeklerationen geschrieben und die Interuptmethode abgeschafft. 
Doch das Ergebnis ist, wie auf dem Bild zu erkennen immer noch 
unzureichend (stark verzerrt). Könnt ihr euch den Code mal genauer 
ankucken? Ich vermute, dass ich einfach etwas „unsauber“ geschrieben 
habe.

von Julius Krebs (Gast)


Angehängte Dateien:

Lesenswert?

Blöd, dass nicht zwei Dateien zur Zeit reinpassen.

von eugen dischke (Gast)


Lesenswert?

kurze frage ich bin grade dabei mir den urschleim von c reinzuziehen, 
ich verwende avredit weil das wegen der ide so leicht zu bedienen ist, 
mit der thematik externe variablen, bin ich schon recht gut zurecht 
gekommen, jedoch ist in einem codebeispiel mir etwas sehr fremdes 
aufgefallen,
da ist ein funktion die als extern deklariert,
extern inline funktion(), was das extern nun heist, ist mir klar aber 
die bedeutung von inline, hab ich nirgend wo finden können, kann mir 
einer sagen welche bedeutung dies hat ?

von Simon Stoye (Gast)


Lesenswert?

Inline gibt dem Compiler die Empfehlung den Code "einzubetten" also 
nicht zur Funktion zu springen, diese auszuführen und zurückzuspringen 
sondern den Code an jeder benötigten Stelle zu wiederholen. (Etwas 
schneller da keine Sprünge gemacht werden müssen verbraucht halt mehr 
Platz)
Keine Ahnung ob und welcher Compiler dies für die AVR's überhaupt 
beachtet.

mfg
SiSt

von R2D2 (Gast)


Lesenswert?

AVR-GCC beachtet das bis zu einer gewissen funktionsgröße.

von Markus Kaufmann (Gast)


Lesenswert?

@Julius: Das Bild sieht so aus wie wenn man schlechten Empfang hat. Hast 
Du mal die Verkabelung überprüft?

von Julius Krebs (Gast)


Lesenswert?

Ja, es liegt eindeutig an der AVR-Programmierung. Mit der anderen 
Version läuft es ja auch halbwegs. Es muss irgendwas mit dem Timing zu 
tun haben. Ich will nicht wissen, wie lange ich schon dran rumprobiert 
habe, ohne wirklichen Erfolg; daher hoffe ich ja auf Hilfe.

von Markus Kaufmann (Gast)


Lesenswert?

Kannst Du mal Deinen Schaltplan posten? Ich habe gerade Urlaub, 
vielleicht baue ich das ja mal nach.

von Chaldäer (Gast)


Lesenswert?

Hi, vielleicht helfen Dir die beiden Links weiter:

http://instruct1.cit.cornell.edu/courses/ee476/video/index.html (Mehr in 
C)
http://members.ozemail.com.au/~intello/video_s_w.htm (ass)
Zumindest die Screenshots sehen sehr sauber aus.

Auf einer Uni-Seite (habe leider den Link verhauen) stand etwas von den 
Problemen mit den Verzerrungen. Das Videosignal ist etwas empfindlich, 
was das Timing angeht. Es soll am Besten funktionieren, wenn das Bild 
vorberechnet wird und der AVR das Bild als Ganzes im Sleep-Mode 
rausschickt.


(Nach knapp 8-jähriger Lötkolbenabstinenz, wird dies wohl mein erstes 
Projekt werden.)

von Simon (Gast)


Angehängte Dateien:

Lesenswert?

Hi, ich wieß nicht ob dir das weiterhilft aber
in der Juni Ausgabe von Elektor ist ein TV-Tennis Spiel mit dem 
AT90S8515 realiesirt worden.

Das Programm ist aber in Assembler geschrieben.

Ich hab dir das ZIP mal drangehängt.

Viel Erfolg
Simon

von Julius Krebs (Gast)


Lesenswert?

Die Projekte kenne ich bereits. Ich habe auch sehr viele verschiedene 
Methoden ausprobiert.
habt ihr euch schon mal meinen Code genauer angekuckt? Ich vermute, dass 
ich einfach irgendeinen blöden Fehler gemacht habe, den ein erfahrener 
Programmierer sicher finden wird.

von Tobias Schilgen (Gast)


Lesenswert?

Hallo,

hat jemand noch die Elektor Ausgabe Juni 2003 und kann mir
den Artikel zukommen lassen? - ich bin sehr interessiert an der
vollständigen Beschreibung der Schaltung und der Software.

Tobias.

von leo9 (Gast)


Lesenswert?

ich trau mir mal folgende Aussage zu: "vergiss c für diese Anwendung
und die 8MHz werden bald 16 werden"
Bei 8MHz braucht ein einzelner Maschinenbefehl 125ns, der sichtbare
Teil einer Zeile hat 50us -> 400 Maschinenbefehle pro Zeile. Wenn eine
if Abfrage des "Video-Rams" & Ausgabe auf den Port-Pin 10
Maschinenbefehle braucht kommst du auf eine horizontale Auflösung von
40 Pixel. Für eine Videoausgabe würde ich das als unbrauchbar
einstufen.
Ich glaube du wirst um folgende Realisierung nicht herumkommen:
in der Austastlücke (Sync, etwa 12us) vom Video-Ram in Register
kopieren und dann die Register auf einen Port shiften. Alle Varianten
von if oder anderen Abfragen verursachen ein Jittern oder bei Korrektur
eine schlechtere Pixelanzahl.

grüsse leo9

von Christian (Gast)


Lesenswert?

Hallo Ng,


sowas hatte ich auch schon vor, daher suche ich den "richtigen"
Prozessor ...

Das das bei 8 MHz nicht hinhaut, habe ich auch schon rausgefunden...

Da von oben nach unten das Rechteck immer kleiner wird, kann mann davon
ausgehen, das das FBA-Signal nicht richtig erzeugt wird ...

Was ich vorhabe: Kantenerkennung mit dem uC ...

Hat da jemand eine Empfehlung was den Prozessor angeht ? (Habe vorher
mit PICs gespielt ...)

Danke


Christian

von leo9 (Gast)


Lesenswert?

Hallo Christian,

welche Auflösung schwebt dir denn vor, bis ca. 40 Chars pro Zeile
sollte es sich auch noch mit einem 16MHz AVR ausgehen.

grüsse leo9

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.