PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DCF77 frage...



EDatabaseError
24.08.2005, 16:55
$crystal = 4000000
$regfile = "m32def.dat"

Config Lcd = 20 * 4
Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.2 , Rs = Portc.0
Config Lcdbus = 4

Config Pind.2 = Input 'extern INT0

' Empfangsstatus auf LED ausgeben, damit man sieht,
' ob der AVR auch arbeitet
Config Pina.0 = Output

Set Portd.2
Set Porta.0

' Wert des Prescaler durch Testen ermittelt.
Config Timer0 = Timer , Prescale = 256 '4000000 / 256 = 15625 Hz
Const Startwert = 100 'Überlauf 256 - Startwert 100 = 156 ( 15625 Hz / 156 = 100,1 Hz ) => 10ms
Load Timer0 , Startwert

Dim I As Byte
Dim J As Byte
Dim K As Byte

Dim Impuls As Byte
Dim Pause As Integer
Dim Sekunde As Byte
Dim Wert As Byte
Dim Paritaet As Byte
Dim Checker As Byte
Dim Wochentag As String * 14
Dim Temp As String * 2

Wochentag = "MoDiMiDoFrSaSo" ' String mit Kuerzel der Wochentage

Dim Werte_bit(6) As Byte
Dim Werte_start(6) As Byte
Dim Minute(42) As Byte ' Enthaelt die Sekunden-Impulse 0 und 1

' Arrays für Startposition und Laenge der Daten im Array Minute()
Werte_start(1) = 4 'Minuten
Werte_bit(1) = 6
Werte_start(2) = 12 'Stunden
Werte_bit(2) = 5
Werte_start(3) = 19 'Tag
Werte_bit(3) = 5
Werte_start(4) = 25 'Wochentag
Werte_bit(4) = 2
Werte_start(5) = 28 'Monat
Werte_bit(5) = 4
Werte_start(6) = 33 'Jahr
Werte_bit(6) = 7

Impuls = 0
Pause = 0
Sekunde = 0
Checker = 0
' Checker = 0 : Start
' Checker = 1 : Aktuelle Messung nicht erfolgreich
' Checker = 2 : Daten schenen in Ordnung zu sein

Config Int0 = Falling '-> bei negiertem DCF-Signal,
'sonst Config Int0 = Rising !!!
Enable Interrupts
Enable Int0
Enable Timer0 'enable the interrupt

On Int0 Zaehle Nosave
On Ovf0 Tim0_isr 'Überlauf alle 10ms

Cls
Cursor Off

Lcd "-- --.--.-- --:--:--" ' Display bei Start

Do 'endless loop
nop
Loop

End 'end program


' Routine zaehlt Sekunden und wertet Impuls- und Pausenzeit aus.
Zaehle:
'Für Debug eingebaut: (zeigt Impuls und Pausenlänge)
'Locate 3 , 1 : Lcd "Imp: " ; Impuls
'Locate 3 , 10 : Lcd "Pau: " ; Pause
Incr Sekunde
If Sekunde > 18 Then
K = Sekunde - 18
If Impuls > 17 Then
Minute(k) = 1
Else
Minute(k) = 0
End If
End If
Locate 1 , 19
Wert = Makebcd(sekunde) ' Umweg ueber BCD, dann fuehrende 0
Lcd Bcd(wert) ' Sekunde anzeigen
If Pause < 300 And Pause > 200 Then 'Minutenanfang
If Checker = 0 Then ' Checker-Flag setzen
Checker = 1
Else
Checker = 2
Gosub Check_parity
End If
Sekunde = 0 ' Sekunde 0 setzen
Locate 1 , 19
Lcd "00" ' und anzeigen
End If
If Checker = 2 Then
Gosub Dekoder
Checker = 1
End If
Impuls = 0
Pause = 0
Return

' Timer incrementiert die Zaehler
Tim0_isr:
Load Timer0 , Startwert
If Pind.2 = 0 Then
Incr Impuls
Set Porta.0
Else
Incr Pause
Reset Porta.0
End If
Return


' Ueberprufung der empfangenen Daten
Check_parity:
Locate 4 , 1
Lcd Sekunde ' Debug-Ausgabe bei schlechtem Empfaenger

' Stimmt die Zahl der Sekunden?
If Sekunde <> 59 Then
Checker = 1
End If

'pruefe Minutenparitaet
Paritaet = 0
For I = 4 To 10
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(11) Then
Checker = 1
End If

Paritaet = 0

'pruefe Stundenparitaet
For I = 12 To 17
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(18) Then
Checker = 1
End If
'Lcd Checker

'pruefe Rest
Paritaet = 0
For I = 19 To 40
Paritaet = Paritaet + Minute(i)
Next I
Paritaet = Paritaet And 1
If Paritaet <> Minute(41) Then
Checker = 1
End If
'Lcd Checker

Return



' Daten im Minuten-Array dekodieren und ausgeben.
Dekoder:
' Schleife, weil kompakter
For K = 1 To 6
Wert = 0
J = Werte_start(k) + Werte_bit(k)
For I = J To Werte_start(k) Step -1
Shift Wert , Left
Wert = Wert + Minute(i)
Next I
J = Werte_start(k)
Minute(j) = Wert
Next K

' Wochentag aus String schneiden.
K = Minute(25) * 2
K = K - 1
Temp = Mid(wochentag , K , 2)

' Raus damit, aufs LCD
Locate 1 , 1
Lcd Temp ; " " ; Bcd(minute(19)) ; "." ; Bcd(minute(28)) ; "." ; Bcd(minute(33))
Lcd " " ; Bcd(minute(12)) ; ":" ; Bcd(minute(4))

Return

Ich habe hier obrigen Code gefunden.

Was muss ich machen:
-wenn ich das ganze mit 10 MHz betreiben will?
-Stunde, Minute und Tag als Variable verwenden will mit denen ich z.B.
if hour = 10.35 then
...
machen will.


Mfg

EDE

Marco78
24.08.2005, 21:22
$crystal = 10000000 und


Config Timer0 = Timer , Prescale = 256 '4000000 / 256 = 15625 Hz
Const Startwert = 100 'Überlauf 256 - Startwert 100 = 156 ( 15625 Hz / 156 = 100,1 Hz ) => 10ms
Load Timer0 , Startwert

neu ausrechnen. Und alles andere was irgendwie die 4MHz als Grundlage hatte oder Werte die für 4MHz ausgerechnet waren.
Ich hab den Code mal flüchtig überschaut und nix weiter gefunden. Das ist aber keine Garantie. Du kannst ja nochmal genau schauen ob solche Werte nochmal vorkommen.
Die Anpassung aller anderen Zeitrelevanten Aufgaben übernimmt BASCOM selbst dadurch das du mit $crystal= 10000000 die 10MHz eingestellt hast. Das wären dann Aufgaben wie RS232 oder ähnliches was automatisch angepasst werden würde.

If stunden = 10 then
if minuten = 35 then
mach das
end if
end if
?

sebastian.heyn
25.08.2005, 20:34
hallo

ich würde
if hour=10 and minute=35 then
machen. sieht sauberer aus im code

EDatabaseError
26.08.2005, 11:13
danke is ja perfekt