www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Videosignalerzeugung


Autor: Julius Krebs (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Julius Krebs (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Das Testbild hat nicht mehr reingepasst...

Autor: Markus Kaufmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Julius Krebs (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Julius Krebs (Gast)
Datum:
Angehängte Dateien:

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

Autor: eugen dischke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Simon Stoye (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R2D2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR-GCC beachtet das bis zu einer gewissen funktionsgröße.

Autor: Markus Kaufmann (Gast)
Datum:

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

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus Kaufmann (Gast)
Datum:

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

Autor: Chaldäer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, vielleicht helfen Dir die beiden Links weiter:

http://instruct1.cit.cornell.edu/courses/ee476/vid... (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.)

Autor: Simon (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Julius Krebs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tobias Schilgen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: leo9 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.