www.mikrocontroller.net

Forum: Codesammlung DCF77-Uhr mit ATTINY12


Autor: peter dannegger (Gast)
Datum:
Angehängte Dateien:

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:

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:

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 (Gast)
Datum:

@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 (Gast)
Datum:

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

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 (Gast)
Datum:

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:

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 (Gast)
Datum:

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:

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:

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:

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:

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:

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:

Ups, natürlich falsch
xtal/(64*256) + 0.5
Autor: (oumPuter-haKker.Freaker (Gast)
Datum:

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:

lol
stimmt!!!
Autor: Anja zoe Christen (zoe)
Datum:

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:

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:

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:

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:

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:

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:

kann hier nochmal jemand schauen ob das klappt?

G Ingo
Autor: Frankl (Gast)
Datum:

Was muß man alles ändern wenn man das Programm auf einem Mega8 laufen
lassen will? Ports und Frequenz ist klar
Autor: Bingo (Gast)
Datum:

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

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:

Sowas passiert halt, wenn man statt in übersichtlichem C in
steinzeitlichem Assembler programmiert.
Autor: asm-fan (Gast)
Datum:

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

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




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 erkennst du die Nutzungsbedingungen an.

webmaster@mikrocontroller.netImpressumNutzungsbedingungenWerbung auf Mikrocontroller.net