mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DCF77 von U. Radig


Autor: L.R. (Gast)
Datum:

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

Autor: L.R. (Gast)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

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

Autor: L.R. (Gast)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: L.R. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es ist ein Mega8. Code im Anhang.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: werner (Gast)
Datum:

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

Autor: L.R. (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

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

Autor: Niels Hüsken (monarch35)
Datum:

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

Autor: L.R. (Gast)
Datum:

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

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.