Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen
Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.
Hinweis kann nach Kenntnisnahme deaktiviert werden!
Hallo,
danke für Deine Antwort.
Ich wollte erst mal grundsätzlich danach fragen, unabhängig vom Quellcode.
Es scheint, daß die config DCF77 nicht richtig funzt. Die Gosub Sectic von der Kommandozeile wird nicht angesprungen. Ohne diesen Eintrag in der Do...Loop Schleife wird keine Uhrzeit ausgegeben.
Die Anzeige "MEZ" nehme ich als erste Reaktion, daß eine Synchronisation bevorsteht. Das funktioniert hie und da auch mit dem Eintrag in der Schleife. Die Synchronisation ist eher Zufall.
Im übrigen, der DS1307 funktioniert bei 3,3V. Kann natürlich auch sein, daß dieser im Grenzbereich betrieben wird und so die Sync nicht immer klappt. Da aber mit Eintrag in der Schleife die Uhrzeit angezeigt wird und ohne diesen Eintrag nicht, liegt es wohl eher an der DCF Routine.
Ohne Interruptroutine gleiches Ergebnis.
Hier der Quellcode...abgespeckt vom eigentlichen Projekt, aber genauso getestet.
wenn Du beim Erstellen eines Beitrags über dem Editorfenster auf </> klickst und anschließend in dem sich öffnenden Fenster auf "Bascom- Quellcode" klickst, wird Dein Programmcode so dargestellt wie in Deinem letzten Beitrag hier (Dort habe ich das für Dich geändert).
Gruß Christian
Wenn das die Lösung ist, möchte ich mein Problem wieder haben.
Der Xmega ist leider etwas anderes als ein normaler AT mega. Bekommst du beim kompillieren einen Fehler? Die Dcf lib benutz ja einen timer, der kann ja anders sein als erwartet. Für dcf Empfang gibts doch auch händische routinen statt der lib. Hast du mal solch eine probiert?
An der RTC liegts nicht die kommt mit 3,3v super zurecht.
übrigens "sectic" ist die Interrupt-Routine von deinem eingestellten Timer und ohne die globalen Interrupts ein zu schalten spingt dein Programm auch nicht in Sectic.
Wieso hast du die Lese- und Schreibadresse von der RTC als Variable und nicht als Konstante angelegt?
Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
Hi, du kannst ja mal dcf_status.0 an einem Ausgang ausgeben. Damit sollte man erkennen können, ob die DCF77 Routine läuft.
Aus der Hilfe:
The DCF decoding routines use a status byte. This byte can be examined as in the example.
The bits have the following meaning.
Bit
Explanation
0
The last reading of the DCF pin.
1
This bit is reserved.
2
This Bit is set, if after a complete time-stamp at second 58 the time-stamp is checked and it is OK. If after a minute mark (2 sec pause) this bit is set, the time from the DCF-Part is copied to the Clock-Part and this bit reset too. Every second mark also resets this bit. So time is only set, if after second 58 a minute mark follows. Normally this bit is only at value 1 from Second 58 to second 60/00.
3
This Bit indicates, that the DCF-Part should be stopped, if time is set. (at the option of updating once per hour or day).
4
This Bit indicated that the DCF-Part is stopped.
5
This bit indicates, that the CLOCK is configured the way, that during DCF-Clock is stopped, there is only one ISR-Call in one second.
6
This Bit determines the level of the DCF input-pin at the pulse (100/200 mSec part).
7
This bit indicates, that the DCF-Part has set the time of the Clock-part.
Hallo,
vielen Dank für das rege Interesse und Eure Antworten.
Beim Kompilieren gibt es keine Fehler.
Die lib zu benutzen ist natürlich naheliegender als eine extra Timerroutine zu implementieren.
Enable Interrupts werde ich testen. Ebenso dcf_status.0.
Die Adressen von dem RTC nebst Konfiguration als Variable hatte ich von einem anderen Quellcode übernommen. Vielen Dank für den Hinweis.
Ergänzend möchte ich noch anmerken: ich verwende immer eine Kontrollled in der Treiberstufe nach dem Dcfmodul. Damit kann man sehr gut die Empfangsqualität abschätzen. Es ist nicht so, dass man immer guten Empfang hat, wenn ein Aufbau mal funktioniert hat. Ein ungeeignetes Netzteil kann alles zunichte machen, oder ein Multiplexbetrieb von Anzeigen.
Hallo,
danke für den Tipp. Das DCF Signal beobachte ich mit Oszi. Habe mir auch die hier im Forum existierende Schaltung zum generieren eines DCF Signals nachgebaut. Ziemlich hilfreich, da das Signal sauber und störungsfrei ist.
Signal wird von der lib auch verarbeitet, da das dcf_status.0 Signal ausgegeben wird. Enable Interrupt war bereits gesetzt...unterhalb der Routine von D.1. Diese Routine habe ich mal komplett weggelassen. Hat keine Auswirkung hinsichtlich der Signalausgabe. Es scheint, als ob das Programm ab und zu mal ein Impuls auslässt. Dadurch auch keine Synchronisation. Print #1 Time(dfc_sec) zählt hoch, manchmal zeigen sich sogar Minuten und Stunden. Kann sich ja nur noch um ein timing Problem handeln, Impuls und Pausenlänge liegen im Bereich 4-5 und 26-72. Den dcf_status.7=0 habe ich beim Atmega328 auch weggelassen. Synchronisiert zumindest trotzdem nach 3 Minuten, was beim Atxmega nicht mal ansatzweise funktioniert. Komischerweise wird die Timezone nach einer Minute angezeigt.
Habe schon im Internet nach möglichen funktionierenden Beispielen für den Xmega gesucht. Leider vieles in C.
Es gab da mal von einem Anbieter einen fertigen Attiny für das DCF Modul, welcher per UART an einen AVR angeschlossen werden kann. Leider ist dieser nicht mehr verfügbar. Wäre auch noch ein Ansatz.
Wenn du ein bisschen experimentieren willst, ich hab' mal mit einer anderen Lib dcf zum Laufen gebracht. dcf77 lib und der timer1 bei dieser Version kann man den timer frei wählen, muss ihn aber configurieren, was nicht schlimm ist. Das dcf_status byte ist auch anders belegt! Aber bei mir (kein atxmega) hat es funktioniert.
Ach ja, der Pegel deines Signals passt mit der Einstellung 'Inverted'?
Noch was, in der Hilfe steht
In the XMEGA, you must enable HI, LO or MED interrupts before you can use them.
When you enable an interrupt you also must specify the priority.
For example : Enable Usartc0_rxc , Lo
This would enable the USARTC0_RX interrupt and would assign it a low priority.
Vielleicht musst du das mit deinem in der config dcf verwendeten timer auch machen
(Ich rätsel jetzt, weil ich noch nix mit atxmega gemacht hab' und völlig unbeleckt bin)
Hallo,
danke für die schnelle Antwort.
Wenn die lib das Signal generiert, und das macht es, scheint die Einstellung 'inverted' zu stimmen.
Die Anweisung der Priorität für den Interrupt habe ich im Programm:
On Portd_int1 Port_d_interrupt
Enable Portd_int1 , lo
Enable Interrupt
Ok. Kannst Du mir bitte Deinen Code für den Timer 1 vom Atmega schicken? Mal sehen, was ich daraus machen kann.
Diese alternative lib hat bei nichtatxmega den Vorteil nicht den timer1 zu verwenden, was die bascomeigne lib zwingend macht. Ich hab' zwar trotzdem in meinem Fall timer1 verwendet, konnte den aber noch für andere Zwecke verwenden. Diese alternative lib braucht nur einen Aufruf einer sub alle 25 mSec. Mit welchem timer ist egal und man kann mehr 'fummeln', zB einen pin wackeln lassen, dann weiß man, die sub wird aufgerufen. Musst mal den Text bei rn durchlesen.
Hallo,
es funktioniert mit der DCF77.lib. Seperate Interruptanweisung ist nicht notwendig.
Mittels der time(dcf_sec) als Indikator sieht man schnell, ob die Uhrzeit korrekt empfangen wird. Nach kurzer Zeit erfolgt dann die Synchronisation.
Der Fehler lag am Laptop, welches mit der USB - Stromversorgung am Testgerät verbunden ist. Es treten ab und zu ein paar kurze Nadelimpulse auf, welche die time(dcf_sec) wieder auf "00" stellt. Da das innerhalb von 3 Minuten ein paar Mal auftritt, kommt nie eine korrekte Zeit zusammen.
Für den Atmega328 habe ich ein seperates Netzteil...für den Atxmega128 jetzt auch.
Nochmals vielen Dank für die Tipps.
Ich hänge hier mal noch ein Foto dran. Es handelt sich um eine Hausüberwachung. Temperaturen sind fiktiv - sie werden von einem Testsender geliefert. Der eigentliche Sender hat ein watchdog von 10 Minuten. Zu lang für schnell mal was umprogrammieren.