dekodowanie dcf [bascom]-timer1


Witam.Na początek chce powiedzieć że jestem tu nowy i całkiem zielony więc prosze o wyrozumiałość bo topiero zaczynam "przygode" z pockami.A więc tak,zacznijmy iż że chciałbym zbudować zegar na PCF8583 gdzie sygnał byłby co jakiś tam czas synchronizowany dcf-em(chodzi mi tu o dokładność zegara).Obecnie w bascomie jest "gotowa procetura" do odczytu sygnału i po jej użyciu zegar działa poprawnie tzn. czas i data się same synchronizują.W tym przypadku data jest podawana (DD-MM-RR).a mnie zależy jeszcze na tym żeby była dekodowana "wartość" dnia tygodnia tzn. poniedziałek,wtorek itd..Chcę zrobić zegar który to będzie pokazywał "pełną datę"(oczywiście z godziną)i dlatego chciałem napisać własną proceturkę do odczytu dcf-a,alemam problem z dekodowaniem sygnału(wiem jak jest zakodowany,i nietrza mi infa na ten temat),wiem jak go odkodować(tzn. trzeba mierzyć timerem1 odcinki czasowe),ale próbuje-kombinuje (już prawie dwa miesiące)i nic.Może ktoś z was mógłby podpowiedzieć-nakierować lub dać jakiś przykład jak "wyciągnąć"z sygnału te "zera" i "jedynki" oraz "synchronizację".Z góry dziękuję




Portret użytkownika mirley

Re: DCF

A jakie dokładnie informacje dasz radę uzyskać na podstawie tej procedury z bascoma? Masz: dzień, miesiąc, rok, godziny, minuty, sek? Szczerze mówiąc jeszcze się tym nie bawiłem

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mcgyver26

jest to typowa proceturka

jest to typowa proceturka bascomowa i ja osobiście zrobiłem "podstawowy"zegarek który to pokazywał czas(GG:MM:SS)i datę(DD/MM/RR),np:taki programik:

$regfile = "M8def.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portb.2 , Rs = Portb.
 
 
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
 
Cursor Off
Enable Interrupts
Config Date = Dmy , Separator = /
Do
Wait 5
Loop
 
'Co sekundę aktualizuje wyświetlacz
Sectic:
   Cls
   Upperline
   Lcd Time$
   Lowerline
   Lcd Date$
Return
End

taki zegarek ustawia mi sie ok.1:32sek. ok godz: 22:15(wieczorem) a w dzień(ok. godz: 14:00),tak do czterech minut-wszystko zależy od sygnału-anteny.
Dlatego pisze tu bo chciałbym "wyciągnąć"z dcf-a jeszcze "nazwe dnia tygodnia"i wszyswtko to pouporządkować wg. swoich potrzeb,więc chciałbym napisać własną proceturkę na timerze1 który to zliczał by impulsy z anteny dcfa(od impulsu dodatniego do impulsu ujemnego)przez co by można "wyłonić""zera" i "jedynki"+synch.Ale mam już w głowie taki mętlik że szok!!!.Wiem że logiczne "zero"ma 100ms ,alogiczna "jedynka" ma 200ms, no i synchro 2sek.(0 impulsu-przerwa),ale nie kumam jak to "odpalić by zadziałało bo zawsze coś mi źle wychodzi.Dlatego prosze pomoc

Portret użytkownika mirley

Re: Procedura DCF

Dlaczego walczysz z odczytem dnia tygodnia jak można go obliczyć mając dzień, miesiąc rok, który juz odczytujesz... w helpie do bascoma znalazłem:

Quote:
'The clock routine does use the following internal variables:

'_day , _month, _year , _sec, _hour, _min

'These are all bytes. You can assign or use them directly

_day = 1

Czyli masz wszystko co potrzeba tylko trzeba zaimplementować algorytm przeliczania http://pl.wikipedia.org/wiki/Kalendarz_wieczny i potestować całość. Nie rozumiem dlaczego uparłeś się na pisanie własnej procedury, która nie wiadomo jak będzie działała skoro masz działający odczyt daty i czasu

Ps. Na podstawie jakiego schematu (opisu) zrobiłeś antenę do DCF?

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mcgyver26

Co to tej proceturki to

Co to tej proceturki to chciałbym napisać swoją ponieważ ta gotowa ma "troche wad",a mianowicie: pierwsza z nich to taka że "sekundnik"raz "przyśpiesza",a raz "spowalnia"-ogólnie mówiąc sekundnik niechodzi "równomiernie"co sekunde-co da się zauważyć .Druga sprawa to taka że niemam możliwości "przypisania"wartości (danych) z dcf-a do zmiennych. A co do budowy anteny to:(niebawiłem się w żadne "scalaki,kwarce"bo o wiele drożej wychodzi kasy, więc kupiłem na allegro godowy zegarek(na części)za 28zeta czyli taniej niż układ,kwarc i inne elementy potrzebne(duuuża zaleta to to że jest baaardzo czuły odbiornik-nawet po włożeniu go do obudowy kompa chodzi).Ponieważ modół ze zegarka jest zasilany na 3V a ja używam 5V to zrobiłem tylko dotatkowo taki"bufor"-bajer(na inwerterach z przerzutnikami Schmitta(7414)).Cała antena(bufor) jest zasilana 5V,a modół anteny dcf jest zasilany przez stabilizator 3,3V(oczywiście te napięcie 3,3V idzie na modół dcf-a przez tranzystor).Dodam że jest zrobiony "układ"osobny modół wykrywający przekroczenie wartości napięcia(dzielnik nap. z diodą zenera+tranzystor)i tu z tego jest podawany sygnał na "bufor"tam jest już odpowiednio sterowane.Ogólnie mówiąc jest tak że: włańczam antene(zasilanie)-zapala się zielona led(oczywiście może się zapalić "czasowo"-np:2sek.i zgasnąć(jest dwu kolorowa),po zapodaniu sygnału "ST-BY" zielona "dioda" gaśnie,a zaczyna migać w takt odbieranego sygn.("pomarańczowa-żółta"-jak kto "odbiera" kolory),po przekroczeniu napięcia zasilającego (ustalane diodą zenera-ja mam 6,8V)"bufor"-układ blokuje tranzystor jednocześnie odcinając napięcie 3,3V modółowi dcf i informuje o "wyłączeniu" anteny świecąc diodą led na czerwono.Po "ustabilizowaniu"się-powrocie napięcia do normy antena się włańcza.Ma to na celu "uchronienie" anteny przed pomyłkowym podłączeniem lub podaniem złych napięć.Sygnał z dcf-a idzie przez rezystor do CNY-17 gdzie "łączy się z "buforem" i tam jest już sygnał "wyciągnięty""bezpośredni" i "zanegowany"

Portret użytkownika mirley

DCF

Przecież masz zmienne w programie '_day , _month, _year , _sec, _hour, _min określające wszystkie potrzebne parametry po odczycie z DCF. Spróbuj przypisać taką zmienną do innej zrobionej przez ciebie i wyświetlić, co pokaże. Nikt też nie powiedział że odczyt z DCF masz podawać bezpośrednio na wyświetlacz. Zrób normalny zegar a tylko synchronizuj sekundy np 30 sekund po pełnej godzinie albo raz dziennie o 3 w nocy i po problemie. Sekundnik pójdzie ci równo.

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mcgyver26

Te zmienne bym miał jak bym

Te zmienne bym miał jak bym robił "zwykły zegar" a tej "proceturce bascomowej"do doczytu dcf-a ja tych zmiennych niewidze :/ chyba że ja jestem aż tak tempy że niekumam?!. Tu "dane"z dcf-a są odrazu przypisane "time$" i "date$"

Portret użytkownika mirley

Re: DCF

Poczytaj sobie helpa do bascoma na temat CONFIG DATE .... nie sprawdzałem tego ale masz wyraźnie napisane:

'The clock routine does use the following internal variables:
 
'_day , _month, _year , _sec, _hour, _min
 
'These are all bytes. You can assign or use them directly
 
_day = 1

Na to wygląda że jak robisz obiekt typu Data to od razu robia ci sie takie zmienne w pamięci. Nie widze problemu tutaj....

Co to znaczy że nie widzisz tych zmiennych.. a próbowałeś wpisac zamiast twojego:

Lcd Time$

np:

Lcd _sec

lub

a = _sec
lcd a

gdzie a jest zmienna byte

Zmienne te są automatycznie modyfikowane przez timer działający w trybie zegara....

Nawet gdyby to nie zadziałało to jest funkcja Date wyciągająca z date$ wszystkie te zmienne.... dodatkowo, co teraz znalazłem w bascomie jest funkcja Dayofweek ktora oblicza dzień tygodnia na podstawie daty w różnych formatach -> patrz help, wszystko tam jest

Rozumiem żebyś pisał własną procedurę bo np programujesz w C i chcesz żeby było to optymalne, w bascomie nie ma to większego sensu, chyba że wiesz jak sobie to dobrze napisać i bedzie ci to zajmowało mniej pamięci to wtedy jest to zrozumiałe

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika mcgyver26

Ten rodzaj wyświetlania

Ten rodzaj wyświetlania czasu(godziny) to znam,ale chodzi mi tu o date więc sie staram "poduczyć"by zrobić zegarek z dniem tygodnia,synchronizowany dcf-em i budzikiem.Znalazłem takie coś w helpie:

Enable Interrupts
Config Clock = Soft
Config Date = YMD , Separator = .            ' format ANSI
 
Dim bWeekDay As Byte , strWeekDay As String * 10
Dim strDate As String * 8
Dim bDay As Byte , bMonth As Byte , bYear As Byte
Dim wSysDay As Word
Dim lSysSec As Long
 
 
' Przykład 1 z wewnętrznym zegarem RTC
 
_Day = 24 : _Month = 10 : _Year = 2     ' ustaw zegar ? dla przykładu i testów 
bWeekDay = DayOfWeek()
strWeekDay = Lookupstr(bWeekDay , WeekDays)
Print "Dzień " ; Date$ ; " zwraca " ; bWeekday ; " czyli " ; strWeekday
' Dzień 02.10.24 zwraca 3 czyli Czwartek
 
 
' Przykład 2 z zdefiniowanym ciągiem 3 bajtów (Dzień / Miesiąc / Rok )
 
bDay = 26 : bMonth = 11 : bYear = 2
bWeekDay = DayOfWeek(bDay)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
Print "Dla składników Dzień="; bDay ; " Miesiąc="; bMonth ; " Rok=" ; bYear ; " zwraca " ; bWeekday ; " czyli " ; strWeekday
' Dla składników Dzień=26 Miesiąc=11 Rok=2 zwraca 1 czyli Wtorek
 
' Przykład 3 z liczbą dni od początku wieku
wSysDay = 2000                               ' to jest 2005-06-23
bWeekDay = DayOfWeek(wSysDay)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
Print "Dla " ; wSysDay ; " dnia wieku zwraca " ; bWeekday ; " czyli " ; strWeekday
' Dla 2000 dnia wieku zwraca 3 czyli Czwartek
 
' Przykład 4 z liczbą sekund od początku wieku
lSysSec = 123456789
bWeekDay = DayOfWeek(lSysSec)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
Print "Dla liczby " ; lSysSec ; " sekund zwraca " ; bWeekday ; " czyli " ; strWeekday
' Dla liczby 123456789 sekund zwraca 5 czyli Sobota
 
 
' Przykład 5 z ciągiem zawierającym datę
 
strDate = "02.11.26"                  ' używamy formatu daty wg ANSI
bWeekDay = DayOfWeek(strDate)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
Print "Dla dnia " ; strDate ; " zwraca " ; bWeekday ; " czyli " ; strWeekday
' Dla dnia 02.11.26 zwraca 1 czyli Wtorek
 
End
 
WeekDays:
  Data "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"

czy mógłbyś jeśli jesteś w stanie wytłumaczyć jak dla "matoła"mniej-więcej co i jak bo w książce p.wiązany są "skąpo"opisane "komendy(jest ich brak) jak np:ta która tu widnieje w pierwszym przykładzie:"Lookupstr"

Portret użytkownika mirley

Re: lookup

Polecenie Lookupstr to polecenie odczytu wartości z tabeli wgranej w pamięć programu. Tabela jest na końcu programu:

WeekDays:
  Data "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"

a polecenie

strWeekDay = Lookupstr(bWeekDay , WeekDays)

przypisuje do zmiennej tekstowej strWeekDay wartość z pozycji bWeekDay w tabeli WeekDays. Jeśli np bWeekDay = 0 to na pozycji 0 w tabeli jest poniedziałek i taka wartość przyjmie zmienna string

-

UWAGA! Możliwy jest zakup zaprogramowanych uC i zestawów elementów itp. do niektórych projektów. O dostępność proszę pytać via email. Konkretne oferty pojawiają się w cenniku.

Portret użytkownika Wieslaw.S

DCF

Może tu ktoś mi pomoże.Bo wszelkie przykłady są na ten przeklęty LCD, a ja chcę to na LED ( 7 segm.).

Znalazłem na jakiejś niemieckiej stronie listing, zmieniłem w nim
tylko porty, do których mam podłączone wyświetlacze.
Kompiluje się bez problemu, ale nie odczytuje godziny z DCF.
Gdzie jest błąd ?
Wydaje mnie się, że powiniem być jakiś Timer do pomiaru impulsów z DCF
ale nie wiem jak to ugryźć.
Oto kod.

$regfile = "m8def.dat"
$crystal = 1000000
$swstack = 10
$hwstack = 40
 
Config Dcf77 = Pinc.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts
 
Config Portb = Output
Config Portd = Output
Config Portc.2 = Output
Config Portc.3 = Input
 
Segment1 Alias Portb.2
Segment2 Alias Portb.3
Segment3 Alias Portb.4
Segment4 Alias Portb.5
 
Led_dcf Alias Portc.2
 
Segment_anoden Alias Portd
 
 
'Timer für Multiplex
 
Config Timer0 = Timer , Prescale = 256
On Timer0 Anzeige
Const Timervorgabe_0 = 237
 
Enable Timer0
Enable Interrupts
 
 
Dim Hhh As Byte
Dim Mmm As Byte
Dim Ziffer As Byte
Dim Dezimalpunkt As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Stelle As Byte
 
Do
 
Led_dcf = Dcf_status.0
 
Loop
 
End
 
Anzeige:
 
Timer0 = Timervorgabe_0
 
    Mmm = Makedec(_min)
    Hhh = Makedec(_hour)
 
 
Einer = Mmm Mod 10
Zehner = Mmm / 10
 
 
Hunderter = Hhh Mod 10
Tausender = Hhh / 10
 
 
If Stelle < 4 Then
Incr Stelle
Else
Stelle = 1
End If
 
If Stelle = 1 Then Ziffer = Tausender
If Stelle = 2 Then Ziffer = Hunderter
If Stelle = 3 Then Ziffer = Zehner
If Stelle = 4 Then Ziffer = Einer
 
Segment1 = 1
Segment2 = 1
Segment3 = 1
Segment4 = 1
 
Select Case Ziffer
Case 0 : Segment_anoden = 192
Case 1 : Segment_anoden = 249
Case 2 : Segment_anoden = 164
Case 3 : Segment_anoden = 176
Case 4 : Segment_anoden = 153
Case 5 : Segment_anoden = 146
Case 6 : Segment_anoden = 130
Case 7 : Segment_anoden = 248
Case 8 : Segment_anoden = 128
Case 9 : Segment_anoden = 144
 
End Select
 
 
Select Case Stelle
Case 1 : Segment1 = 0
Case 2 : Segment2 = 0
Case 3 : Segment3 = 0
Case 4 : Segment4 = 0
 
End Select
 
Return
 
Sectic:

Pozdrawiam.

Portret użytkownika matrix

Re: DCF

Rodzi się jedno podstawowe pytanie:
Gdzie w tym kodzie jest odczyt z DCF'a? Bo ja tego odczytu nie widzę.

Portret użytkownika Wieslaw.S

dodałem zmienne

dodałem zmienne, patrzyłem na post #2 .
Jednak nadal nie działa, dioda dcf status miga.

$regfile = "m8def.dat"
$crystal = 1000000
$swstack = 10
$hwstack = 40
 
Config Dcf77 = Pinc.3 , Inverted = 0 , Timer = 1 , Debug = 0 , Check = 1 , Gosub = Sectic
Config Date = Dmy , Separator = .
Enable Interrupts
 
Config Portb = Output
Config Portd = Output
Config Portc.2 = Output
Config Portc.3 = Input
 
Segment1 Alias Portb.2
Segment2 Alias Portb.3
Segment3 Alias Portb.4
Segment4 Alias Portb.5
 
Led_dcf Alias Portc.2
 
Segment_anoden Alias Portd
 
 
'Timer für Multiplex
 
Config Timer0 = Timer , Prescale = 256
On Timer0 Anzeige
Const Timervorgabe_0 = 237
 
Enable Timer0
Enable Interrupts
 
 
Dim Hhh As Byte
Dim Mmm As Byte
Dim Ziffer As Byte
Dim Dezimalpunkt As Byte
Dim Einer As Byte
Dim Zehner As Byte
Dim Hunderter As Byte
Dim Tausender As Byte
Dim Stelle As Byte
Dim Minuty As Word
Dim Godziny As Word
 
 
 
Do
 
Led_dcf = Dcf_status.0
 
Loop
 
End
 
Anzeige:
 
 
Minuty = _min
Godziny = _hour
 
 
Timer0 = Timervorgabe_0
 
    Mmm = Makedec(minuty)
    Hhh = Makedec(godziny)
 
 
Einer = Mmm Mod 10
Zehner = Mmm / 10
 
 
Hunderter = Hhh Mod 10
Tausender = Hhh / 10
 
 
If Stelle < 4 Then
Incr Stelle
Else
Stelle = 1
End If
 
If Stelle = 1 Then Ziffer = Tausender
If Stelle = 2 Then Ziffer = Hunderter
If Stelle = 3 Then Ziffer = Zehner
If Stelle = 4 Then Ziffer = Einer
 
Segment1 = 1
Segment2 = 1
Segment3 = 1
Segment4 = 1
 
Select Case Ziffer
Case 0 : Segment_anoden = 192
Case 1 : Segment_anoden = 249
Case 2 : Segment_anoden = 164
Case 3 : Segment_anoden = 176
Case 4 : Segment_anoden = 153
Case 5 : Segment_anoden = 146
Case 6 : Segment_anoden = 130
Case 7 : Segment_anoden = 248
Case 8 : Segment_anoden = 128
Case 9 : Segment_anoden = 144
 
End Select
 
 
Select Case Stelle
Case 1 : Segment1 = 0
Case 2 : Segment2 = 0
Case 3 : Segment3 = 0
Case 4 : Segment4 = 0
 
End Select
 
Return
 
Sectic:

P.S.

Jakby co , to piszę tu prosząc o pomoc.

Portret użytkownika Grzeniu 73

nie robiłem nic z dcf,bo nie

nie robiłem nic z dcf,bo nie mam takiego układu,ale z tego co widziałem to jest pełno przykładów.Zresztą kaktus juz Ci powiedział w innym temacie jak się za to wziasc.