Forum: Mikrocontroller und Digitale Elektronik DCF77 von U. Radig


von L.R. (Gast)


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.

von L.R. (Gast)


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?

von Niels H. (monarch35)


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.

von L.R. (Gast)


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.

von Niels H. (monarch35)


Lesenswert?

Eigentlich nicht....zumindest nicht, daß ich wüsste. Von welchen uc 
reden wir denn?

von Karl H. (kbuchegg)


Lesenswert?

Ich denke es ist Zeit mal den kompletten Code zu posten.
Irgendwo muss es noch eine Querverbindung zur UART geben.

von L.R. (Gast)


Angehängte Dateien:

Lesenswert?

Es ist ein Mega8. Code im Anhang.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Ah gerade gesehen:
In der main Schleife hast du ja schon sowas über flags.dcf_rx gemacht.
Und? Blinkt die LED?

von Niels H. (monarch35)


Lesenswert?

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)?

von Karl H. (kbuchegg)


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.

von werner (Gast)


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

von L.R. (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Niels H. (monarch35)


Lesenswert?

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.

von L.R. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.