Forum: Projekte & Code DCF77-Uhr mit ATTINY12


von Peter D. (peda)


Angehängte Dateien:

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

von Hardy Schöfer (Gast)


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

von Uwe (Gast)


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

von Peter D. (peda)


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

von Peter D. (peda)


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

von Uwe (Gast)


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

von Peter D. (peda)


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

von Uwe (Gast)


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

von Peter D. (peda)


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

von Uwe (Gast)


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

von Schoaschi (Gast)


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

von Raik (Gast)


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

von camel (Gast)


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

von Werner B. (Gast)


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.

von Werner B. (Gast)


Lesenswert?

Ups, natürlich falsch
xtal/(64*256) + 0.5

von (oumPuter-haKker.Freaker (Gast)


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

von Rolf (Gast)


Lesenswert?

lol
stimmt!!!

von Anja Zoe C. (zoe)


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

von Ingo L. (grobian)


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

von Peter D. (peda)


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

von Ingo L. (grobian)


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

von Peter D. (peda)


Lesenswert?

Ingo Laabs wrote:

> auslesen. In welche Registern steht die aktuelle Zeit?

CLOCK.H:
1
.def  second    = r16    ;actual time
2
.def  minute    = r17
3
.def  hour    = r18
4
.def  day    = r19
5
.def  weekday    = r20
6
.def  month    = r21
7
.def  year    = r22

Peter

von Ingo L. (grobian)


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

von Ingo L. (grobian)


Lesenswert?

kann hier nochmal jemand schauen ob das klappt?

G Ingo

von Frankl (Gast)


Lesenswert?

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

von Bingo (Gast)


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

von Frankl (Gast)


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.

von Peter (Gast)


Lesenswert?

Sowas passiert halt, wenn man statt in übersichtlichem C in 
steinzeitlichem Assembler programmiert.

von asm-fan (Gast)


Lesenswert?

pfffff

von stephan (Gast)


Angehängte Dateien:

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:
1
AVRASM: AVR macro assembler 2.1.2 (build 99 Nov  4 2005 09:35:05)
2
Copyright (C) 1995-2005 ATMEL Corporation
3
4
C:\Franzis\Clock\Clock.asm(10): Including file 'C:\Franzis\Clock\clock.h'
5
C:\Franzis\Clock\clock.h(2): Including file 'C:\Programme\Atmel\AVR Tools\AvrAssembler2\Appnotes\tn12def.inc'
6
C:\Franzis\Clock\clock.h(49): warning: Register r26 already defined by the .DEF directive
7
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
8
C:\Franzis\Clock\clock.h(51): warning: Register r28 already defined by the .DEF directive
9
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
10
C:\Franzis\Clock\clock.h(52): warning: Register r29 already defined by the .DEF directive
11
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
12
C:\Franzis\Clock\clock.h(53): warning: Register r30 already defined by the .DEF directive
13
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
14
C:\Franzis\Clock\clock.h(54): warning: Register r31 already defined by the .DEF directive
15
C:\Franzis\Clock\Clock.asm(10): info: 'C:\Franzis\Clock\clock.h' included from here
16
C:\Franzis\Clock\Clock.asm(11): Including file 'C:\Franzis\Clock\lcd.mac'
17
C:\Franzis\Clock\Clock.asm(17): Including file 'C:\Franzis\Clock\ovf0int.inc'
18
C:\Franzis\Clock\Clock.asm(59): Including file 'C:\Franzis\Clock\lcd12s.inc'
19
C:\Franzis\Clock\Clock.asm(60): Including file 'C:\Franzis\Clock\clockd.inc'
20
C:\Franzis\Clock\Clock.asm(61): Including file 'C:\Franzis\Clock\dcf77.inc'
21
C:\Franzis\Clock\Clock.asm(62): Including file 'C:\Franzis\Clock\div60.inc'
22
C:\Franzis\Clock\Clock.asm(68): No EEPROM data, deleting C:\Franzis\Clock\Clock.eep
23
24
ATtiny12 memory use summary [bytes]:
25
Segment   Begin    End      Code   Data   Used    Size   Use%
26
---------------------------------------------------------------
27
[.cseg] 0x000000 0x000400    580     78    658    1024  64.3%
28
[.dseg] 0x000000 0x000060      0      0      0       0      -
29
[.eseg] 0x000000 0x000000      0      0      0      64   0.0%
30
31
Assembly complete, 0 errors. 5 warnings


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

1
Vorbereiten:
2
Flash: C:\Franzis\Clock\Clock.hex
3
Brennen:
4
USB-Treiber installiert, aktiv (V 4.40.1.0)
5
Port: COM16
6
Prozessor: ATtiny12
7
schreibe 1024 Bytes in Flash-Memory ...
8
Fehler: beim Schreiben der Daten.
9
Fehler: beim Schreiben der Daten.

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

Gruß Stephan

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.