Moin, ich bin dabei mir eine Funkuhr zu bauen mit dem Code von U. Radig. Der Code läuft soweit mit Ausgabe über die serielle Schnittstelle und 4x 7-Segmentanzeige. Das Problem ist jetzt, wenn ich die usart_write(...) Zeile in der Schleife (main.c) auskommentiere, bekomme ich keine Zeit mehr auf den 7-Seg angezeigt. Anscheinend findet der Sekunden-Interrupt nicht mehr statt. Hat jemand eine Idee wie ich das hinbekommen könnte? Danke.
Also es scheint wohl wirklich so zu sein, dass ich keine Interrupts mehr erhalte wenn ich die serielle nicht initialisiert habe und nicht regelmäßig etwas über sie ausgebe. Ich habe das Phänomen noch nie gesehen. Jemand Tipps?
Ich vermute, daß irgendwo im Quelltext noch Zugriffe auf die UART gemacht werden, die in einer Endlosschleife enden, wenn die UART nicht initialisiert wird. Bitte stell sicher, das keine UART-Zugriffe mehr stattfinden, z.B. in dem du die Datei "usart.c" löschsts und den Code soweit modifizierst, daß er fehlerfrei compiliert.
Hi, danke schonmal dafür. Habe die usart.* umbenannt und compiliere nur noch die clock.c/h und main.c. Keine Änderung. Gibt es vielleicht irgendwo eine Beschränkung bzgl. UART und INT0? Danke.
Eigentlich nicht....zumindest nicht, daß ich wüsste. Von welchen uc reden wir denn?
Ich denke es ist Zeit mal den kompletten Code zu posten. Irgendwo muss es noch eine Querverbindung zur UART geben.
Mach mal in den Interrupt Code Zusatzcode hinein, der jeweils die Dezimalpunkte deiner Anzeigen ein bzw. ausschaltet. Dadurch weist du genau, ob der Interrupt ausgelöst wird. Ansonsten fällt mit eigentlich nur auf: mm, hh, ss sollten als volatile deklariert werden.
Ah gerade gesehen: In der main Schleife hast du ja schon sowas über flags.dcf_rx gemacht. Und? Blinkt die LED?
Karl heinz Buchegger wrote:
> In der main Schleife hast du ja schon sowas über flags.dcf_rx gemacht.
Sollte flags nicht auch besser volatile deklariert werden (sofern das
bei structs überhaupt geht)?
Niels Hüsken wrote: > Karl heinz Buchegger wrote: > >> In der main Schleife hast du ja schon sowas über flags.dcf_rx gemacht. > > Sollte flags nicht auch besser volatile deklariert werden (sofern das > bei structs überhaupt geht)? Ja natürlich. Alles was gemeinsam von ISR und main() benutzt wird, sollte in erster Linie volatile sein. Es gilt zu verhindern, dass der Compiler in der main() Schleife die Zugriffe auf diese Variablen wegoptimiert und die Werte in Register ablegt. Das könnte auch die Ursache sein, ist aber reine Spekulation: Solange der UART Code drinnen war, hatte der Copmiler nicht genug Register um alle Variablen dort abzulegen und war so gezwungen, die Variablen immer aus dem SRAM nachzuladen. Jetzt ist der UART Code weg, ein paar mehr Register sind frei und der Compiler benutzt sie um Variablen dort ständig unterzubringen und sich das ständige Nachladen aus dem SRAM zu ersparen. Ist aber, wie gesagt, reine Spekualtion. Ansonsten ist mir im Code nichts aufgefallen. Die main() Schleife ist einfach genug um sie überschauen zu können. Wenn die Pulse am INT0 ankommen und der Interrupt ausgelöst wird, die LED also regelmässig blinkt, sehe ich keinen Grund (ausser dem volatile) warum das nicht gehen sollte.
Vielleicht ist aber nur die Ausgabegeschwindigkeit bei der 7-Segment-Ansteuerung zu hoch, baue doch mal eine kurze Verzögerung mit ein, damit die Leds länger AN sind. Hoffe das hilft, ansonsten Oszi ranhängen...
@Karl Heinz: Die Punkte blinken wenn der UART Code drin ist. So wie der Code jetzt ist (vorheriger Anhang) blinken Sie nicht. Das mit Volatile probier ich gleich mal aus.
Mach auch mal den Gegentest und baue das Blinken direkt in die Interrupt Routine ein. Auf die Art hast du die Gewähr, dass da nicht irgendwelche Seiten- effekte mit reinspielen. Erste Anweisung in der ISR: LED umschalten.
L.R. wrote: > So wie der Code jetzt > ist (vorheriger Anhang) blinken Sie nicht. Das mit Volatile probier ich > gleich mal aus. Ich schätze die Variablendeklaration volatile als sehr wichtig ein. Das hätte ich als erstes ausporbiert.
So, es läuft. Erster Fehler war kein volatile bei der struct ... flags. Zweiter Fehler war zu schnelles Multiplexen. Vielen Dank an alle Helfer!
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.