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.
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
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.
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.
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 ?
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
@Julius: Das Bild sieht so aus wie wenn man schlechten Empfang hat. Hast Du mal die Verkabelung überprüft?
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.
Kannst Du mal Deinen Schaltplan posten? Ich habe gerade Urlaub, vielleicht baue ich das ja mal nach.
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.)
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
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.
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.