mikrocontroller.net

Forum: Projekte & Code DCF77-Uhr mit ATTINY12


Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei ein kleines Programmbeispiel für den TINY12.

Funktioniert super !

Alles, was man braucht,ist ein LCD, ein 74HC164, ein ATTINY12, ein 
DCF77-Modul (z.B. von Conrad) und dann die 5V dran.

Hat natürlich alle Features, d.h. Fehlererkennung, Gangreserve, Datum 
usw..

Im ZIP-File ist auch die ausführliche Beschreibung (index.htm) mit 
dabei.


Peter

Autor: Hardy Schöfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

danke für Deine Nachricht.
Werde Deine Vorschläge genauer unter die Lupe nehmen. Falls Fragen 
auftauchen, melde ich mich nochmal bei Dir.

Grüße
Hardy

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Du hast da sehr schöne Sachen eingearbeitet (Taktabgleich für gestörten 
Betrieb,Decodiertabelle,volle Zeit- und Datumsunterstützung). Gefällt 
mir recht gut,aber was ich nicht finde,ist die Überprüfung ob das was du 
empfangen hast, auch sein kann.(Paritäts- und Signaltest kannst du 
vergessen, hilft nicht immer) Habe ich das übersehen? Oder wo machst du 
das?
MFG Uwe

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uwe,

das wäre nur nötig, wenn die mit Absicht eine falsche Zeit senden 
würden.

Empfangsstörungen werden ja sicher erkannt durch die Paritätsprüfung und 
Impulsüberwachung.

Ich habe das als C-Programm schon einige Jahre auf nem AT89C2051 laufen 
und noch nie eine falsche Zeit gesehen.

Probiers einfach mal aus.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Uwe,

zur Erläuterung:

Damit Störimpulse durchkommen können, müßten sie:

- exakt synchron zum DCF77-Signal kommen,
- genau 59 sein
- immer 0,9 - 1,1s Abstand haben
- immer 50 - 250ms lang sein
- die richtige Parität haben


Mit anderen Worten:

Du hast eher einen Sechser im Lotto als eine falsche Zeitanzeige.


Peter

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ich habe solche "Sechser" schon gesehen,sonst würde ich nicht fragen. 
Mal sehen ob ich es noch zusammenbekomme.
Wenn innerhalb eines Zeitframes 2 Einsen zu Null 
werden(Signalabbruch),sind alle deine Bedingungen erfüllt und du hast 
trotzdem eine falsche Zeit. Wenn ich mich recht entsinne geht das beim 
Datum auch. Bei einer Schaltuhr kann das fatal sein. Deshalb benutze ich 
einen Vergleich der Quersummen über alle empfangenen Werte der 
momentanen Minute & der vorherigen Minute die um eins erhöht wurde. Das 
erzeugt zwar bei jedem Übergang von 9->0 einen Error, aber das ist für 
mich besser als eine falsche Zeit/Datum.(Die interne Uhr läuft ja 
deswegen weiter.)
MFG Uwe

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Uwe,

ich gehe mal davon aus, daß Du meinen Code gar nicht getestet hast und 
deshalb Deine Annahme eines Sechser in z.B. den nächsten 10 Jahren rein 
spekulativ ist.


Mögliche Störquellen des DCF77-Signals sind TV, PC-Monitor, Staubsauger, 
Gewitter und sonstige Schaltvorgänge.

Die Warscheinlichkeit, daß diese bezüglich Impulslänge und Impulsabstand 
mit dem DCF7-Signal auch nur entfernt ähnlich sind, ist äußerst gering.

Rein theoretisch reichen 2 Störimpulse, die genau zum richtigen 
Zeitpunkt abrupt einsetzen und auch genau so abrupt enden aus, um den 
Paritätscheck auszutricksen.
Dann müssen sie jedoch auch noch einen dem DCF77-Signal identischen 
Pegel haben, da sonst die automatische Verstärkungsregelung des 
Empfangs-IC hochregelt und damit nachfolgende echte DCF77-Impulse 
verloren gehen, d.h. die nötigen 59 Impulse werden nicht erreicht.


Ich hatte zuerst auch nur getestet, ob die Impule größer 150ms bzw. die 
Impulsabstände größer 1,5s sind. Und nur da konnte ich tatsächlich trotz 
Parität falsche Zeiten feststellen.


Also probiers doch einfach mal aus.


Für alle Skeptiker werde ich die Zeiten vor der Übernahme vergleichen 
und bei Unterschieden in den EEPROM schreiben. Das wird dann also nur 
zur Sommer- und Winterzeitumstellung der Fall sein.


Peter

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Ich brauch deinen Code nicht zu testen, weil er meinem teilweise recht 
ähnlich ist. Ich habe übrigens als
1.Filter die Parität eingesetzt->fehlerhafte Zeiten,
2.Filter fehlerhafte Impulslängen, schon besser aber
  ab und an immernoch Fehler
3.Filter Quersummentest, Keine falschen Zeiten mehr.

Die Zeiten sind per RS232 mitgelesen worden, da habe ich dann die Fehler 
entdeckt.
Bis zum DCF-Sender habe ich ca.: 800km und daneben (1,5m)steht der 
Fernseher.

MFG Uwe

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wirklich nur ähnlich. Denn da fehlen ja noch der Abstandstest 
(0,9-1,1s) und die Anzahl (59).
Und deshalb habe ich auch keine falschen Zeiten.


Peter

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!
Das ist richtig, aber ich musste mich leider mit dem Problem 
beschäftigen und denke das es auch bei deinem Progr. geschehen kann. Es 
sollte auch nur ein Denkanstoss sein.
Mittlerweile benutze ich garkeinen Prüfsummentest mehr und auch nur eine 
minimale Impulseingrenzung, aber eben den 3.Filter,der geht saugut.
Drumm wünsche ich allzeit richtige Zeit.
MFG. Uwe

Autor: Schoaschi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

du könntest du mir bitte ein sample zeigen wie man den internen
oszillator des ATTiny12 benutz? ich verstehs einfach nicht.
und was ist bitte calbyte in deinem programm?

denn ich will eigentlich nur einmal kurz etwas assambler verstehen und
ein LED mit meinem ATTiny blinken lassen.

Wie lange wartet er bei einem NOP befehl?
mfg schoasch

Autor: Raik (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich habe mal eine Frage zu der definierten Konstante im Teil CLOCK.H

reload1sec = (xtal / 64 + 128 ) / 256

Wie setzt sich die Konstante reload1sec zusammen?
xtal -> Systemtakt
64 -> Vorteiler des Timers

MfG
Raik

Autor: camel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mich wuerde auch interessieren wie sich diese zeile zusammensetze? woher 
kommen die "128" - ich kann es nicht wirklich nachvollziehen!

.equ  xtal    = 3686400  ;3.6MHz
.equ  reload1sec  = (xtal / 64 + 128 ) / 256

64 = hardware teiler
256 = software teiler
128 = ?

bitte um auskunft :-) besten dank die herren!

kamel

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist für die Rundung

Bei realen Zahlen ist es einfacher
(xtal / 64 + 128 ) / 256 = xtal/4 + 0.5

aber beim Rechnen mit INTEGER zieht man die Rundung vor die Division.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ups, natürlich falsch
xtal/(64*256) + 0.5

Autor: (oumPuter-haKker.Freaker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach quatsch ihr habt doch keine Ahnung :-)
Wenn den Taster über 150 ms aussteht wird das Singnal als Null weiter an 
den xcf gereicht und dort als pc9 verwendet!!
Also wenn ihr eine Potenzelle Eins erreichen wollt müßt ihr die Null 
Konjungent erweitern und dann mit dem "mov"
in den akkumulator rutschen anschließend den Quotentionsbefehl an die 
Androtta senden und den can-befehl abwarten..
Nun den xta von 3 auf Null stellen sich nen stift in den po stecken und 
dann den 3.5 cpu auf 6+ takten und den kühler ausstellen !!!
so funktioniert das bloß!!!
Mit anderen Worten:
Braune Borstenbürsten Bürsten besser als Börstenbürsten mit Weißen 
Borsten an der Bürste!!!
lg einer derjenigen Ahnung hat!!!

Autor: Rolf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lol
stimmt!!!

Autor: Anja zoe Christen (zoe)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Uwe wrote:
> Hi!
> Ich brauch deinen Code nicht zu testen, weil er meinem teilweise recht
> ähnlich ist.

Das haben sich die Leute bei der Ariane 501 auch gedacht; das Ergebnis 
ist bekannt :-/

Zoe

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Versuche von Peter den Code zum laufen zu bringen, bekomme aber immer 
folgende Fehlermeldung:

AVR PROGRAMME__ ASSEMBLER\tn12def.inc(141): error: F: Unknown 
instruction or macro

mit der Zeile: .equ E2END = 3F

wo liegt da der Fehler??

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Laabs wrote:
> Versuche von Peter den Code zum laufen zu bringen, bekomme aber immer
> folgende Fehlermeldung:

Das Beispiel ist schon sehr alt.
Nimm mal das aktuelle tn12def.inc aus Deiner AVRStudio-Installation.


Peter

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
uiiii..geht soweit.

wenn ich den Autor schon mal selber dran habe, ich  will jetzt kein LCD 
anschließen, dafür aber die Register mit der Zeit mit einem zweiten uP 
auslesen. In welche Registern steht die aktuelle Zeit?

Danke Ingo

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo Laabs wrote:

> auslesen. In welche Registern steht die aktuelle Zeit?

CLOCK.H:
.def  second    = r16    ;actual time
.def  minute    = r17
.def  hour    = r18
.def  day    = r19
.def  weekday    = r20
.def  month    = r21
.def  year    = r22

Peter

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alles super :-)
die sache hat jetzt einmal kurz funktioniert, dann nie wieder.
Ich verwende statt dem 74HCT164 einen LS164. Kann es mit dem Typen 
Probleme geben??

Autor: Ingo Laabs (grobian)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann hier nochmal jemand schauen ob das klappt?

G Ingo

Autor: Frankl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was muß man alles ändern wenn man das Programm auf einem Mega8 laufen 
lassen will? Ports und Frequenz ist klar

Autor: Bingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Frankl

Für Mega8 kann du auch Peter's Tiny26 AVR-GCC version portiere
Beitrag "DCF77 Uhr in C mit ATtiny26"

mfg
Bingo Dänemark

Autor: Frankl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für den Tip aber leider bin ich in C nicht so bewandert und 
ich wollte die DCF Uhr mit einer Erweiterung in Assembler betreiben. Ich 
vermute das die DCFTable nicht richtig funktioniert, da der Mega8 ja 
mehr Interupts hat.Folgender Fehler tritt auf: Die Sekunden laufen 
richtig nur die Zeit steht auf 24:05 und das Datum ist :4.40.2010.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sowas passiert halt, wenn man statt in übersichtlichem C in 
steinzeitlichem Assembler programmiert.

Autor: asm-fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
pfffff

Autor: stephan (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche seit ein paar Tagen das Programm ans laufen zu bekommen. 
Zunächst mit ein paar kleinen Änderungen auf einem ATTiny13. Ergebnis: 
In der Anzeige erscheinen die voreingestellten Daten. Die Sekunden 
zählen dann aber nur alle 3 Sekunden weiter. In der Statusanzeige blingt 
ständig das "E".

Nun habe ich mir einen ATTiny12 besorgt, bekommen das hex-File aber 
nicht gebrannt. Nach dem Compilieren erhalte ich folgende Meldung:
AVRASM: AVR macro assembler 2.1.2 (build 99 Nov  4 2005 09:35:05)
Copyright (C) 1995-2005 ATMEL Corporation

C:\Franzis\Clock\Clock.asm(10): Including file 'C:\Franzis\Clock\clock.h'
C:\Franzis\Clock\clock.h(2): Including file 'C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn12def.inc'
C:\Franzis\Clock\clock.h(49): warning: Register r26 already defined by the .DEF directive
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
C:\Franzis\Clock\clock.h(51): warning: Register r28 already defined by the .DEF directive
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
C:\Franzis\Clock\clock.h(52): warning: Register r29 already defined by the .DEF directive
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
C:\Franzis\Clock\clock.h(53): warning: Register r30 already defined by the .DEF directive
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
C:\Franzis\Clock\clock.h(54): warning: Register r31 already defined by the .DEF directive
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
C:\Franzis\Clock\Clock.asm(11): Including file 'C:\Franzis\Clock\lcd.mac'
C:\Franzis\Clock\Clock.asm(17): Including file 'C:\Franzis\Clock\ovf0int.inc'
C:\Franzis\Clock\Clock.asm(59): Including file 'C:\Franzis\Clock\lcd12s.inc'
C:\Franzis\Clock\Clock.asm(60): Including file 'C:\Franzis\Clock\clockd.inc'
C:\Franzis\Clock\Clock.asm(61): Including file 'C:\Franzis\Clock\dcf77.inc'
C:\Franzis\Clock\Clock.asm(62): Including file 'C:\Franzis\Clock\div60.inc'
C:\Franzis\Clock\Clock.asm(68): No EEPROM data, deleting C:\Franzis\Clock\Clock.eep

ATtiny12 memory use summary [bytes]:
Segment   Begin    End      Code   Data   Used    Size   Use%
---------------------------------------------------------------
[.cseg] 0x000000 0x000400    580     78    658    1024  64.3%
[.dseg] 0x000000 0x000060      0      0      0       0      -
[.eseg] 0x000000 0x000000      0      0      0      64   0.0%

Assembly complete, 0 errors. 5 warnings


Versuche ich dann zu brennen meldet mir "myAVR ProgTool V1.00":

Vorbereiten:
Flash: C:\Franzis\Clock\Clock.hex
Brennen:
USB-Treiber installiert, aktiv (V 4.40.1.0)
Port: COM16
Prozessor: ATtiny12
schreibe 1024 Bytes in Flash-Memory ...
Fehler: beim Schreiben der Daten.
Fehler: beim Schreiben der Daten.

Wenn ich ein anderes hex-File in den Tiny12 brenne funktioniert alles.
Wer kann mir helfen???

Gruß Stephan

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.