Zamieszczony wcześniej kod jest sprawdzony - działa na atmega8
Również po pomyfikacjach portów działa na attiny2313 i zajmuje 65% flash, wiec jest jeszcze miejsce na jakieś "wodotryski".
Używam Bascom demo w wersji chyba najnowszej:
1.11.8.7 build 001
MS windows XP SP-2
Program pod attiny2313 na płytce uruchomieniowej ZL11AVR (Płytka ZL2AVR pod megę ma wszystko łączone kabelkami i porty mogą być praktycznie dowolne. ZL11AVR ma wszystko juz połączone "na sztywno" i trzeba się trzymać adresacji).
'************************
'Zegar DCF77
'by AIMEIZ aimeiz@o2.pl
'************************
$regfile = "2313def.dat"
$crystal = 8000000
'Sygnał z odbiornika DCF podłączony do Portb.2
Config Dcf77 = Pind.2 , Debug = 1 , Inverted = 0 , Check = 0 , Update = 0 , Updatetime = 0 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
'Można użyć zwiększonego poziomu sprawdzania poprawności sygnału,
'ale wtedy zegarek będzie synchronizowany nie częściej niż co 2 minuty,
'Config Dcf77 = Pinb.2 , Debug = 1 , Inverted = 0 , Check = 2 , Update = 0 , Updatetime = 0 , Switchpower = 0 , Secondticks = 50 , Timer1sec = 1 , Powerlevel = 1 , Timer = 1 , Gosub = Sectic
'Wyświetlacz LCD 16*2. Sygnały jak poniżej.
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
Config Lcd = 16 * 2
Cursor Off
Enable Interrupts
Config Date = Dmy , Separator = /
Do
Wait 5
Loop
'Co sekundę aktualizuje wyświetlacz
Sectic:
Cls
Upperline
Lcd Time$ ; " ";
If Pind.2 = 0 Then Lcd "Rcvr" Else Lcd " "
Lowerline
Lcd Date$
Return
End
Obecnie czekam na kit odbiornika DCF, ale przeniosłem na attiny 13 opublikowany gdzieś w sieci symulator DCF i na nim próbuję programy.
Symulator nadaje cały czas tę samą godzinę i datę, dlatego w wersji testowej, wykorzystuję tylko podstawowe sprawdzanie poprawności sygnały - suma kontrolna.
Dla rzeczywistego zegara można włączyć tryb porównywania dwóch kolejnych transmisji, który uznaje prawidłowo odebrany sygnał wtedy, gdy dwie kolejne transmisje różnią się tylko jedną minutą (zakomentowana linijka w programie).
Ponieważ w Bascomie praktycznie całość to kod assemblerowy, chyba nie warto się męczyć z pisaniem tego "na piechotę".
Symulator zrobiłem na płytce ZL4AVR - taka pod attiny 13, 25, 45, 85 lub attiny 26.
Poniżej kod do niego.
Nie jest to mój kod, napisany był na 89c2051.
Zrobiłem porting i dodałem na jednej z nóżek sygnał modulujący DCF.
Oryginalny kod dostępny na stronie wymienionej w programie.
Bardzo przydatne narzędzie do uruchamiania dekoderów DCF.
'kombo@klub.chip.pl >>>>>>>>>>>>>www.klub.chip.pl/kombo<<<<<<<<<<<<<<<<<
'Porting on attiny13 by AIMEIZ aimeiz@o2.pl
'Impulsy dcf są wyprowadzane na port Portb.3 w formacie TTL
'Na portb.0 jest generator modulacyjny - 1 khz
'Na portb.1 modulacja dcf
'Ustawiona data i czas 14:54 23 grudnia piątek 2052 roku
$regfile = "attiny13.dat"
$crystal = 9600000 '9.6Mhz
$hwstack = 8
$swstack = 8
$framesize = 8
Config Clockdiv = 1
Const Podzielnik = 72
Dim Flag As Bit , Licznik As Byte , Dane As Byte , Bity As Byte , Dzielnik As Byte
Dcf_pin Alias Portb.3
Generator Alias Portb.0
Modulacja Alias Portb.1
Config Timer0 = Timer , Prescale = 64
'Config Timer0 = Timer , Gate = Internal , Mode = 1
Config Portb = Output
Portb = 0
On Ovf0 Timer_0_int
Enable Timer0
Enable Interrupts
'Start Timer0
Do
Reset Dcf_pin 'pętla generująca przerwę w nadawaniu sygnalu 1000 ms
For Licznik = 1 To 100
Waitms 10
Bitwait Flag , Set
Reset Flag
Next
For Bity = 0 To 58 'pętla pobierająca dane z tabeli
Dane = Lookup(bity , Table)
If Dane = 1 Then Gosub Jedynka
If Dane = 0 Then Gosub Zero
Next
Loop
Jedynka: 'pdprogram generujący "jedynkę"
For Licznik = 1 To 100
Waitms 10
If Licznik > 0 And Licznik < 21 Then
Set Dcf_pin
Else
Reset Dcf_pin
End If
Bitwait Flag , Set
Reset Flag
Next
Return
Zero: 'podprogram generujący "zero"
For Licznik = 1 To 100
Waitms 10
If Licznik > 0 And Licznik < 11 Then
Set Dcf_pin
Else
Reset Dcf_pin
End If
Bitwait Flag , Set
Reset Flag
Next
Return
Timer_0_int:
'waitus 1
Load Timer0 , Podzielnik
Set Flag
Toggle Generator
If Dcf_pin = 1 Then Modulacja = Generator Else Reset Modulacja
Return
'Ustawiona data i czas 14:54 23 grudnia piątek 2052 roku
Table:
Data &B0 '1
Data &B0 '2
Data &B0 '3
Data &B0 '4
Data &B0 '5
Data &B0 '6
Data &B0 '7
Data &B0 '8
Data &B0 '9
Data &B0 '10
Data &B0 '11
Data &B0 '12
Data &B0 '13
Data &B0 '14
Data &B0 '15
Data &B0 '16 Typ anteny
Data &B0 '17 Zapowiedź zmiany czasu
Data &B1 '18 LSB Czas letni/zimowy
Data &B0 '19 MSB Czas letni/zimowy
Data &B0 '20 Korekta czasu
Data &B1 '21 Początek informacji
Data &B0 '22 LSB Jednostki minut
Data &B0 '23 Jednostki minut
Data &B1 '24 Jednostki minut
Data &B0 '25 MSB Jednostki minut
Data &B1 '26 LSB Dziesiątki minut
Data &B0 '27 Dziesiątki minut
Data &B1 '28 MSB Dziesiątki minut
Data &B1 '29 Bit parzystości minut
Data &B0 '30 LSB Jednostki godzin
Data &B0 '31 Jednostki godzin
Data &B1 '32 Jednostki godzin
Data &B0 '33 MSB Jednostki godzin
Data &B1 '34 LSB Dziesiątki godzin
Data &B0 '35 MSB Dziesiątki godzin
Data &B0 '36 Bit parzystości godzin
Data &B1 '37 LSB Jednostki dnia miesiąca
Data &B1 '38 Jednostki dnia miesiąca
Data &B0 '39 Jednostki dnia miesiąca
Data &B0 '40 MSB Jednostki dnia miesiąca
Data &B0 '41 LSB Dziesiątki dnia miesiąca
Data &B1 '42 MSB Dziesiątki dnia miesiąca
Data &B1 '43 LSB Dnia tygodnia
Data &B0 '44 Dnia tygodnia
Data &B1 '45 MSB Dnia tygodnia
Data &B0 '46 LSB Jednostki miesiąca
Data &B1 '47 Jednostki miesiąca
Data &B0 '48 Jednostki miesiąca
Data &B0 '49 MSB Jednostki miesiąca
Data &B1 '50 Dziesiątki miesiąca
Data &B0 '51 LSB Jednostki roku
Data &B1 '52 Jednostki roku
Data &B0 '53 Jednostki roku
Data &B0 '54 MSB Jednostki roku
Data &B1 '55 LSB Dziesiątki roku
Data &B0 '56 Dziesiątki roku
Data &B1 '57 Dziesiątki roku
Data &B0 '58 MSB Dziesiątki roku
Data &B0 '59 Bit parzystości bitów 37-58
'Wyliczenie bitu parzystości polega na: obliczeniu ilości jedynek w danych
'jeśli jest parzysta to bit parzystości jest zerem , jeśli nie jedynką