DCF77 von U. Radig

Gast #704580
Lesenswert?

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.
Gast #704779
Lesenswert?

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?
#704827
Lesenswert?

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.
Gast #704859
Lesenswert?

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.
#704939
Lesenswert?

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.
Gast #704992
Lesenswert?

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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren