PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Uhr als Soft oder DCF ?



hellraider
01.03.2006, 21:03
Hallo,
nachdem mir ja bei meinem ersten Problem hier recht gut und schnell geholfen wurde, will ich euch gleich mit meinem nächsten Problem belästigen.

Ich möchte eine einfache Uhr programmieren, die mir die Uhrzeit auf dem
LCD ausgibt, sowie eine Ausgabe über die Ports.

Nun mein Problem, wenn ich es richtig verstanden habe, muss ich beim
ATMega 16 (32) an den Anschlüßen T OSC1 und TOSC2 einen Quarz
mit 32768 Hz anschließen, damit der Timer anläuft.
Sehe ich das so richtig ?

Ich habe u.g. prgramm aus den Beispieldateien von Bascom
übernommen, jedoch sehe ich hier nirgends, das der Timer konfiguriert wird.

Was mache ich falsch ?

Gruß und schon mal danke

svenulm31
01.03.2006, 21:52
Wenn ich Dir einen Tipp geben darf, lass es sein das Fahrrad neu zu erfinden und kauf Dir ein PCF8583 oä für 2 €. Ich habe auch schon viele Stunden damit verbracht die MCS Uhr zum laufen zu bringen. Ein einziger waitms Befehl wirft Deine Uhr um Lichtjahre (ms bis unendlich) zurück. Um das alles genau zu berechen brauch ich zumindest einige Stunden Tage oder Wochen, was mir für jede kleine Änderung im Programm zu Blöd war. Außerdem ist ein Stromausfall jetzt auch kein Problem mehr.
Die bessere Variante ist eine Funkuhr leider aber auch etwas teurer (ca 10-15 €) und nicht unbedingt in allen ecken Deutschlands erreichbar.
Gruß Sven

hellraider
01.03.2006, 22:07
Jo, danke für den tip,
was heißt die bessere Variante ?

meinst du einen Chip der DCF dekodiert, oder die Softwaremäßige decodierung ?

svenulm31
01.03.2006, 22:08
Wenn ich Dir einen Tipp geben darf, lass es sein das Fahrrad neu zu erfinden und kauf Dir ein PCF8583 oä für 2 €. Ich habe auch schon viele Stunden damit verbracht die MCS Uhr zum laufen zu bringen. Ein einziger waitms Befehl wirft Deine Uhr um Lichtjahre (ms bis unendlich) zurück. Um das alles genau zu berechen brauch ich zumindest einige Stunden Tage oder Wochen, was mir für jede kleine Änderung im Programm zu Blöd war. Außerdem ist ein Stromausfall jetzt auch kein Problem mehr.
Die bessere Variante ist eine Funkuhr leider aber auch etwas teurer (ca 10-15 €) und nicht unbedingt in allen ecken Deutschlands erreichbar.
Gruß Sven

hellraider
01.03.2006, 22:18
hallo,
jo das hattest du aber gerade schon mal geschrieben.

svenulm31
01.03.2006, 22:22
Nein ich meinte die günstige Variante gegen die Luxusvariante um die ( in meinen Augen blödeste Idee ) auszutauschen. Der PCF (günstigste Variante) ist eine I2C Uhr die du einmal stellst und Batterie gepuffert über Jahre relativ genau läuft.
Die Luxus Variante (DCF) ist mit dem Empfänger ca 10 € teurer genauer aber auch langsamer nach einem Stromausfall. Meine DCF hatte 2 Minuten bis 3 Stunden gebraucht um sich ein verwertbares Signal zu ergattern. Die Auswertung des DCF Signal kann auf dem µc gemacht werden, es sei denn er ist zeitlich voll ausgelastet.
Gruß Sven

hellraider
01.03.2006, 22:34
Ne, sonst muss der uC nicht viel machen, nur ein paar Port ansteuern.
Gibts da irgendwo ne lauffähige Version ( vom DCF77).
Denn alle beiträge im Forum enden irgendwo mitten in der Entwicklung
und es gibt nichts endgültiges ( was läuft)

Gruß

svenulm31
02.03.2006, 08:38
versuchs mal mit der Version

http://www.mcselec.com/index.php?option=com_content&task=view&id=86&Itemid=57

sebastian.heyn
04.03.2006, 13:11
Hi,

also mein Tip: kein extra quarz, mach die uhr in software, und benutz nen timer, der mit ext clock gespeist ist. dann syncronisierst du die uhr einmal pro nacht mit dcf im hintergrund... über die eins zwei sekunden die deine uhr in 24h falsch geht kannst du dann getrost lachen...

Vitis
04.03.2006, 13:19
oder ne RTC, hab mal n bissl an der SPI RTC-4553 getüftelt.
hier der Code:


'----------------------------------------------------------
' Programm initialisieren
'----------------------------------------------------------
'
' ACHTUNG JTAG per Fuse abschalten !!!!
'
' SPI RTC an MISO MOSI CS0 = PortC.7 CS1 = PortC.6 RW = PortC.5
' Habe noch SRF04 Ultraschallenfernungssensor an PortC.2 und PortC.3
' Ist nicht besonders elegant gecodet, aber kann ja je nach Bedarf
' eventbasierend individuell umgebaut werden.
'
' Nur zur Verdeutlicheung der Grundfunktionen der RTC-4553 Uhrenfunktion

$regfile = "m16def.dat"
$crystal = 8000000

$baud = 19200

Declare Function Ultrasonic() As Integer ' Funktionen deklarieren
Declare Function Spitransfer(byval Outbyte As Byte ) As Byte

Dim A As Byte ' variablen deklarieren
Dim I As Byte
Dim X As Byte
Dim Temp As Word
Dim Tempint As Integer
Dim Tempstr As String * 16

Enable Interrupts

Config Pinc.2 = Output
Config Pinc.3 = Input
Config Portc.5 = Output
Config Portc.6 = Output
Config Portc.7 = Output

' Konstanten deklarieren
Const Setyear = &B00001011
Const Setmonth = &B00001001
Const Setday = &B00000111
Const Sethour = &B00000100
Const Setminute = &B00000010

Rtcwr Alias Portc.5
Rtccs1 Alias Portc.6
Rtccs0 Alias Portc.7
Rtccs1 = 1
Rtccs0 = 0

' SPI konfigurieren und initialisieren
Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 0
Spiinit

' RTC-4553 initialisieren
Rtcwr = 0
X = Spitransfer(&B00001111) 'c3 (Initialisierung)
X = Spitransfer(&B00011101) 'c1 (Initialisierung)
Rtcwr = 1

Do
Tempstr = ""
For A = &B00001100 To 0 Step -1 ' absteigende Reihenfolge
X = Spitransfer(a) ' sena Anfrage
X = Spitransfer(0) ' empfange Antwort
X = X And &B11110000
Shift X , Right , 4
Tempstr = Tempstr + Str(x) ' Zahlenwert in String umwandeln und an String anreihen
Next A
I = Inkey() ' UART abfragen
Select Case I ' Je nach Zeichen Funktion auslösen
Case &H79: ' wenn y
Rtcwr = 0
X = Spitransfer(setyear)
Rtcwr = 1
Case &H6D: ' wenn m
Rtcwr = 0
X = Spitransfer(setmonth)
Rtcwr = 1
Case &H64: ' wenn d
Rtcwr = 0
X = Spitransfer(setday)
Rtcwr = 1
Case &H68: ' wenn h
Rtcwr = 0
X = Spitransfer(sethour)
Rtcwr = 1
Case &H69: ' wenn i
Rtcwr = 0
X = Spitransfer(setminute)
Rtcwr = 1
End Select
Waitms 200
Print Tempstr ; " "; ' Ausgabe Datum und Uhrzeitstring
Tempint = Ultrasonic() ' Entfernung per SRF04 messen
Tempint = Tempint * 10 ' in cm umrechnen
Tempint = Tempint / 62
Print Tempint 'Enfernung ausgeben
Loop
End


Function Ultrasonic() As Integer
Portc.2 = 0
Pulseout Portc , 2 , 20
Pulsein Ultrasonic , Pinc , 3 , 1
End Function

Function Spitransfer(byval Outbyte As Byte) As Byte
Spdr = Outbyte ' SPI-Ausgabe
Do
Loop Until Spsr.spif = 1 ' Warten bis Byte raus ist
Spitransfer = Spdr ' Rückgabewert auslesen
End Function
End