Pełna obsługa zegara PCF8583 w bascomie!


No więc, tak jak obiecałem jakiś czas temu postaram się przybliżyć i wytłumaczyć kwestię programowej obsługi popularnego układu RTC ? PCF8583.
Układ ten ma zarówno zwolenników jak i przeciwników, a jedni i drudzy mają swoje racje. Są układy prostsze w obsłudze programowej, posiadające wszystkie interesujące nas dane w osobnych rejestrach prostych do odczytania/zapisania, lecz często są one cięższe do kupienia w małych sklepach, czasem droższe i bardziej kapryśne niż stary, ale ciągle jary PCF8583. No ale temat ten nie ma na celu dyskutowania nad zaletami i wadami poszczególnych układów!
Postaram się w miarę jasny i przejrzysty sposób opisać moje boje z tym układem, które ostatecznie doprowadziły do wykorzystania prawie wszystkich jego możliwości. Prawie, dlatego, że układ ten ma jeszcze rejestry odpowiedzialne za alarm (budzik), które w pewnych zastosowaniach również mogą okazać się niezwykle przydatne!
Noty aplikacyjnej i sposobu podłączania układu do mikrokontrolera nie będę przytaczał, bo informacji na ten temat jest tak dużo, że nawet zupełny amator po obejrzeniu jakiegokolwiek schematu urządzenia około-zegarkowego wykorzystującego ten układ (a projektów takich na elektrodzie jest dużo) będzie wiedział ?z czym to się je?.
Zacznijmy od odrobiny teorii. Na początek proponuję przypomnienie (lub zapoznanie) sobie wiadomości na temat systemu dwójkowego (binarnego) i podstawowego kodu BCD ? BCD8421. Informacje na ten temat można znaleźć choćby na Wikipedii, np. w tym artykule: Kod BCD .
Teraz możemy przystąpić do właściwego tematu.
Zacznijmy od krótkiego fragmentu programu w BASCOMIE:

I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte Sekundy , Ack
  I2crbyte Minuty , Ack
  I2crbyte Godziny , Ack
  I2crbyte Dzien , Ack
  I2crbyte Miesiac , Nack
  I2cstop

Kod ten działał będzie tylko wtedy, kiedy nasz RTC jest jedynym układem pracującym i podłączonym do szyny I2C naszego mikrokontrolera. Ale początkujący raczej rzadko stosują więcej niż jeden taki układ i myślę że nie jest to problemem, a ci bardziej zaawansowani raczej nie będą czytać tych moich wypocin :P.

Przeanalizujmy ten krótki fragment. Poczynając od pierwszej lini:
1. Inicjujemy szynę I2C,
2. podajemy adres zapisu do naszego układu (162),
3. wpisujemy wartość 2, odpowiadającą numerowi rejestru który potem odczytamy, odczyt zacznie się od tego rejestru,
4. ponownie inicjujemy szynę,
5. podajemy adres odczytu (163)
6. odczytujemy wartość rejestru sekund, zapisujemy ją do zmiennej ?Sekundy? i kontynuujemy odczytywanie (Ack),
7. kontynuujemy odczytywanie dla Minut, Godzin, Dnia, Miesiąca ? analogicznie do punktu powyżej, po odczytaniu wartości rejestru Miesiąca kończymy transmisję (Nack),
8. ?zatrzymujemy? szynę I2C.

Po tej operacji mamy w pięciu zmiennych zapisane interesujące nas dane. I teraz przyda się przypomnienie systemu dwójkowego i BCD ;-). Układ PCF8583 operuje właśnie na kodzie BCD i wszystkie odczytywane/zapisywane do niego dane muszą być zapisane właśnie w tym kodzie.
Aby w pełni zrozumieć sposób działania tego układu, musimy sobie wyobrazić 5 rejestrów, każdy ma po 8 bitów. W trzech pierwszych zapisane są wartości sekund, minut i godzin, oczywiście w kodzie BCD. W rejestrze czwartym zapisany jest numer dnia miesiąca i ?zamaskowany? w nim numer roku. I tu uwaga: PCF8583 nie ma ?prawdziwego? licznika lat. Numer roku zapisywany jest jedynie na dwóch bitach i przyjmuje wartości od 0 (00) do 3 (11). ?Rok? 0 jest rokiem przestępnym, a kolejne 3 są kolejnymi latami w czteroletnim cyklu pomiędzy latami przestępnymi. Ale na razie się tym nie przejmujmy ? poradzimy sobie z tym.
W rejestrze piątym zapisany jest numer miesiąca w roku i również ?zamaskowany? numer dnia danego tygodnia. Numer dnia tygodnia przyjmuje wartości od 0 (000) dla poniedziałku do 6 (111) dla niedzieli.
Myślę że całą sprawę najlepiej wyjaśni prosty rysunek, który przedstawia przykładowe zawartości odczytanych rejestrów, którym przyporządkowałem umowne nazwy, odpowiadające nazwom zmiennym z naszego fragmentu programu:

Jak widać (mam nadzieję) rejestry sekund, minut i godzin zawierają po prostu ich wartości w kodzie BCD. W rejestrze dnia natomiast, na dwóch najstarszych bitach jest ukryty numer roku w czteroletnim cyklu o którym wspominałem wyżej. Na dwóch kolejnych bitach zapisane są dziesiętne części numeru dnia miesiąca, a na czterech najmłodszych jedności numeru dnia miesiąca.
Podobnie sprawa ma się w przypadku rejestru miesiąca. Na trzech najstarszych bitach zapisany jest numer dnia tygodnia, na następnym bicie części dziesiętne numeru miesiąca i na czterech najmłodszych jedności numeru miesiąca.
Aby teraz wyciągnąć z tego wszystkiego interesujące nas liczby w systemie dziesiętnym, wykonamy kilka prostych operacji. Oto następny fragment programu:

Sekundy = Makedec(sekundy)   
Minuty = Makedec(minuty)     
Godziny = Makedec(godziny)    
 
Rok = Dzien                  
Shift Rok , Right , 6       
Rok = Makedec(rok)              
Dzien.7 = 0 : Dzien.6 = 0        
Dzien = Makedec(dzien)           
Dzien_tygodnia = Miesiac         
Shift Dzien_tygodnia , Right , 5 
Dzien_tygodnia = Makedec(dzien_tygodnia) 
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0  
Miesiac = Makedec(miesiac)  

I przeanalizujmy:
1. Zmienną Sekundy konwertujemy z kodu BCD do systemu dziesiętnego,
2. analogicznie postępujemy ze zmiennymi Minuty i Godziny, ponieważ jak pamiętamy w tych rejestrach zapisane są tylko i wyłącznie te wartości,
3. pomocniczej zmiennej o nazwie Rok przypisujemy wartość zmiennej Dzien, zawierającej wartość rejestru dnia, w którym ukryty jest również numer roku,
4. przesuwamy teraz w prawo o 6 bitów naszą zmienną Rok, dzięki czemu ?zerujemy? 6 bitów zawierających numer dnia miesiąca i zostają nam 2 bity z numerem roku,
5. konwertujemy zmienną Rok na system dziesiętny,
6. teraz bierzemy ?na stół? zmienną Dzień, która do tej pory nie była ruszana ? zerujemy 2 najstarsze bity (siódmy i szósty) ? bity te, jak pamiętamy, zawierają numer roku i nie są nam już potrzebne,
7. konwertujemy teraz zmienną Dzien do systemu dziesiętnego,
8. do zmiennej pomocniczej Dzien_tygodnia wpisujemy zawartość zmiennej Miesiąc,
9. przesuwamy w prawo o pięć miejsc zmienną Dzien_tygodnia ? dzięki tej operacji, podobnie jak z numerem roku, zostają nam tylko 3 bity zawierające numer dnia tygodnia,
10. i ponownie: konwertujemy zmienną Dzien_tygodnia do systemu dziesiętnego,
11. zerujemy 3 najstarsze bity zmiennej Miesiąc ? wymazujemy z niej numer dnia tygodnia,
12. i możemy ją przekonwertować do systemu dziesiętnego ? otrzymujemy numer miesiąca.

Mam nadzieję że całość opisałem wystarczająco jasno, by każdy mógł zrozumieć. Po tych operacjach otrzymujemy w kilku zmiennych (Sekundy, Minuty, Godziny, Rok, Dzien, Dzien_tygodnia, Miesiąc) wszystko, co potrzebne do pełnej orientacji w czasie ;-).

A cały program odczytujący te dane z naszego układu i wyświetlający je na ekranie alfanumerycznego wyświetlacza LCD może wyglądać tak:

Dim Sekundy As Byte : Dim Minuty As Byte : Dim Godziny As Byte
Dim Dzien As Byte : Dim Miesiac As Byte
Dim Rok As Byte : Dim Dzien_tygodnia As Byte
 
Do
 
I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte Sekundy , Ack
  I2crbyte Minuty , Ack
  I2crbyte Godziny , Ack
  I2crbyte Dzien , Ack
  I2crbyte Miesiac , Nack
  I2cstop
 
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
 
 
Rok = Dzien
Shift Rok , Right , 6
Rok = Makedec(rok)
Dzien.7 = 0 : Dzien.6 = 0
Dzien = Makedec(dzien)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Right , 5
Dzien_tygodnia = Makedec(dzien_tygodnia)
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
Miesiac = Makedec(miesiac)
 
Cls
Lcd "Godzina: " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Lowerline
Lcd "Data: " ; Dzien ; "-" ; Miesiac ; "-" ; Rok ; " : " ; Dzien_tygodnia
Wait 1
 
Loop : End

Czy to takie trudne? Wydaje mi się że nie. Zachęcam do eksperymentowania!

A teraz zajmijmy się zapisem danych do układu ? w końcu jakoś ten czas i datę trzeba ustawić! ;-) Tak naprawdę jeśli do tej pory udało się nam do tej pory zrozumieć zasadę odczytu i rozgryźć ?co gdzie siedzi? to teraz wystarczy wszystko zrobić w drugą stronę! Zacznę więc od razu z grubej rury i podam fragment programu. Pomijam oczywiście wcześniejsze ustawienie odpowiednich wartości dla naszych zmiennych, ponieważ nie ma na to uniwersalnej reguły ? każdy robi to na swój sposób, zależnie od urządzenia nad którym pracujemy ? czy to podając wartości liczbowe z pilota/klawiatury, impulsatorem inkrementujemy czy dekrementujemy itp. itd?

Godziny = Makebcd(Godziny)
Minuty = Makebcd(Minuty)
Sekundy = Makebcd(Sekundy)
Rok = Rok Mod 4
Rok = Makebcd(Rok)
Shift Rok , Left , 6
Dzien = Makebcd(Dzien) 
Dzien = Rok Or Dzien
Miesiac = Makebcd(Miesiac)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Left , 5
Miesiac = Dzien_tygodnia Or Miesiac
I2cstart                                                    
   I2cwbyte 162                                             
   I2cwbyte 2                                               
   I2cwbyte Sekundy
   I2cwbyte Minuty
   I2cwbyte Godziny
   I2cwbyte Dzien
   I2cwbyte Miesiac
   I2cstop

I znowu przeanalizujmy:
1. Konwertujemy zmienną Godziny z systemu dziesiętnego na kod BCD,
2. analogicznie postępujemy ze zmiennymi Minuty i Sekundy
3. wartość roku (np. 2010) dzielimy przez 4. Reszta z tego działania odpowiada numerowi roku, jaki możemy wpisać do PCF?a ? łatwo zauważyć że dzielenie roku przestępnego przez 4 da 0 reszty, a kolejnych lat po nim po kolei da resztę 1, 2 i 3. Nie wierzysz? Sprawdź!
4. konwertujemy zmienną Rok do kodu BCD,
5. i przesuwamy ją 6 miejsc w lewo, robiąc miejsce dla numeru dnia w miesiącu,
6. zmienną Dzien konwertujemy na kod BCD,
7. teraz zmiennej Dzien przypisujemy sumę logiczną zmiennych Rok i Dzien. Jeśli nie wiesz jak działa suma logiczna (OR) to zapraszam na Wikipedię,
8. zmienną Miesiąc konwertujemy do BCD,
9. zmiennej Dzien_tygodnia przypisujemy wartość zmiennej Miesiąc,
10. i przesuwamy ją 5 miejsc w lewo, pownie ?robiąc miejsce? dla numeru miesiąca,
11. i na koniec znowu stosujemy sumę logiczną i ?łączymy? zmienne Dzien_tygodnia i Miesiąc,
12. dokonujemy zapisu naszych zmiennych do odpowiednich rejestrów PCF?a8583.

Trudne? Jeśli tylko nie zamąciłem Ci za bardzo w głowie to na pewno uznasz że nie ;-)

Jak widać nie taki diabeł straszny jak go malują. Tylko z pozoru wydaje się to trudne ? jeśli raz zrozumiesz ideę działania naszego bohatera to na pewno przyznasz mi rację. A mam nadzieję że te moje wypociny Ci w tym pomogą!
Jeśli tak będzie, to nie obrażę się, jeśli klikniesz przysłowiowe ?Pomógł? ? taka nagroda bardzo mnie ucieszy i zmobilizuje do dalszej pracy.
Na ?odkrycie? czekają jeszcze rejestry alarmu! ;)

Powodzenia we własnych eksperymentach!




Portret użytkownika gosc

Zegar

Co ma na celu stosowanie tego układu? możliwość stosowania podtrzymania zasilania samego zegara w przypadku zaniku zasilania? i prostszy kod? ostatnio zaczynam naukę bascoma i w książce mam kilka gotowych zegarów zrealizowanych programowo.. No ale właśnie z podtrzymaniem zasilania z baterii to chyba nie byłoby tak kolorowo, bo prądu trochę by ciągnął cały układ.

Portret użytkownika villen

Układy RTC stosuje się przede

Układy RTC stosuje się przede wszystkim w celu "odelżenia" procesorowi - nie w każdym urządzeniu mikrokontroler może jednocześnie odmierzać czas i zajmować się pozostałymi czynnościami.
Po drugie dokładność! Zegarki programowe zazwyczaj używają timerów procesora, które mogą zmieniać swoje parametry w zależności np. od warunków otoczenia (choćby temperatury), zasilania itp. I choć są sztuczki programowe i sprzętowe pomagające korygować ewentualne opóźnienia/przyśpieszenia to w przypadku układów RTC sprawa jest banalnie prosta: wystarczy zastosować przyzwoitej jakości kwarc zegarkowy i problemów być nie powinno.
Po trzecie: możliwości. Nawet taki PCF8583 choć już bardzo stary (BARDZO!) bez większych problemów udostępnia nam pełną godzinę, datę i możliwość zaprogramowania alarmu. Dodatkowo posiada wyjście INT (zbocze opadające jako aktywne) które generuje przerwanie z częstotliwością 1Hz - a takie cosekundowe przerwanie przydaje się w wielu konstrukcjach! A są układy nowsze, bardziej nowoczesne i oferujące jeszcze większe możliwości...
Po czwarte: właśnie kwestia podtrzymywania zasilania. Choć "większe" AVR'y mają wbudowany układ RTC, który jeszcze łatwiej obsłużyć z poziomu bascoma niż zewnętrzny, to pozostaje kwestia oszczędności prądu w razie zaniku zasilania z sieci. Można co prawda wykrywać zanik zasilania sieciowego programowo i wprowadzać procesor w stan power-down, ale mimo tego jego pobór prądu w tym stanie będzie kilka(dziesiąt) razy większy niż układów RTC. U mnie podtrzymywanie oparte jest na kondensatorku 4700uF i jest w stanie na nim "wytrzymać" bite 3 doby - wątpię by procesor w stanie power-down wytrzymał na tyle długo, by móc pod tym względem choćby troszkę konkurować. A PCF8583 w cale nie jest super-enerooszczędnym układem! Nowsze układy są pod tym względem jeszcze lepsze!

Czy muszę Cię jeszcze przekonywać? ;-)

Portret użytkownika mirley

Re: RTC

oprócz tego co kolega słusznie napisał, czasami konstrukcja programu uniemożliwia precyzyjne odmierzanie czasu. Np gdy chcemy używać układów na 1-wiere to procesor musi zapewnić ścisłe zależności czasowe przy nadawaniu. Gdy program przerywany jest timerem to może się okazać że ani układ na 1-wire nie chodzi, ani zegar nie jest w żaden sposób precyzyjny.

-

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 gosc

Przerwanie INT

Witam

W jaki sposób "zmusić" pcf-a do generowania przerwania co sekundę (generowania 1Hz) ?
Konkretnie chodzi mi o komendy w bascomie, i w którym miejscu je należy wpisać, odnosząc się do powyższych przykładów
Pozdrawiam

Portret użytkownika villen

PCF 8583 generuje cosekundowe

PCF 8583 generuje cosekundowe przerwanie od razu po włączeniu zasilania i nie trzeba tego w żaden sposób konfigurować.
Za to trzeba pamiętać o tym, że aktywnym zboczem jest zbocze opadające i odpowiednio skonfigurować mikrokontroler, np tak:

Config Int0 = Falling

Ten fragment nie wymaga chyba komentowania?

Z moich doświadczeń wynika, że dobrze jest też podciągnąć port mikrokontrolera na który chcemy podawać przerwanie do +Vcc, zwłaszcza jeśli łączy go z wyprowadzeniem PCF'a dosyć długa ścieżka. Opór >=10k jest w sam raz.

Portret użytkownika gosc

Wielkie dzięki :)))

Wielkie dzięki :)))

Portret użytkownika gosc

Punk 9 zapisu do rtc

W punkcie 9 zapisu jest chyba błąd. Nadpisanie dnia tygodnia miesiącem uniemożliwia poprawne wprowadzenie dnia tygodnia. Wg. mnie należy usunąć wpis

Dzien_tygodnia = Miesiac

i będzie dobrze. Mimo wszystko na dzień dzisiejszy jest to chyba jedyny tak dobrze opisany sposób obsługi tego PCF'a. Pozdrawiam

Portret użytkownika gosc

piękny opis

Bardzo ładnie opisane funkcje zegara, kalendarza
dziękuje, pozdrawiam

Portret użytkownika gosc

pytanie odnośnie odczytu daty

dobry opis, nie doczytałem się tylko w jaki sposób zapisać rok np 2011, jeżeli przy wyświetlaniu posłużymy się po prostu dodawaniem np 2008+3 to teraz się zgodzi, ale za rok będzie pokazywać z powrotem 2008 rok. Jak sobie poradzić z tym problemem. Proszę o jakąś podpowiedź.

Portret użytkownika mirley

Re: PCF

Niestety PCF nie pamięta tego. Ja osobiście bym w eepromie procka zapisywał rok np 2008 do którego dodawał bym 0... 3. Jak się licznik przekręci to do eeprom wpisał bym 2012 itd

-

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 gosc

dokładność pcf8583 vs ds1307

porównywałem dokładności obu układów pcf8583 (kwarc + trymer) ds1307 nie wymaga trymera i w zasadzie nie ma możliwości regulacji bo ich raczej nie potrzebuje, pcf8583 wypada bardzo kiepsko po "dostrojeniu" wydaje się że chodzi dokładnie ale wystarczy przenieść go do pomieszczenia o innej temperaturze i proces trymowania można rozpoczynać od początku - czy macie podobne spostrzeżenia ?

Portret użytkownika mirley

Re: PCF

Nie zauważyłem takiego problemu.... ale tak jak mówisz mam zegar w jednym pomieszczeniu i raczej go nie przenoszę do innego.

-

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 villen

Nigdy jeszcze nie stosowałem

Nigdy jeszcze nie stosowałem żadnej dodatkowej kalibracji do PCF'a 8583 i nigdy też nie narzekałem na jego dokładność. Być może kluczem do sukcesu są dwie, może trzy rzeczy: porządna filtracja zasilania, odpowiedniej jakości kwarc zegarkowy i poprawna aplikacja samego układu i jego elementów otaczających (czytaj: poprawny projekt PCB). Zaniedbując którąś z tych rzeczy sami prosimy się o kłopoty.

[edit] Za to DS jest baaaardzo wybredny jeśli chodzi o napięcie zasilania i podtrzymania! Następny zonk jest taki, że wartość i stabilność napięcia podtrzymania wpływa na pracę układu podczas normalnej pracy! Jeśli nie spełnimy wymagań opisanych w nocie katalogowej będziemy mieli przysłowiową orkę na ugorze podczas prób opanowania tego układu!

Portret użytkownika mirley

Re: Zasilanie PCF

Odnośnie zasilania i płytki to zgadzam się w 100%... nie da się tego złożyć na stykówce i oczekiwać że dobrze pójdzie. Kiedys widziałem w karcie katalogowej lub nocie aplikacyjnej layout płytki jaki powinien być. http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&ved=0CFMQFjAE&url=http%3A%2F%2Fwww.zlgmcu.com%2Fdownload%2Fdowns.asp%3FID%3D509&ei=LOzqTvX_NdPt8QOFyZWMCg&usg=AFQjCNH3n6UP0kjb-niASVyR5OMFaf96rg

-

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 gosc

Mario

Witam ,dlaczego adres 162 (mógłbyś wyjaśnić). Czy pod ten programik zadziała też DS1307??? ,a może inaczej się go adresuje??? ,pozdrawiam.

Portret użytkownika matrix

Re: Obsługa DS1307

gość wrote:
Czy pod ten programik zadziała też DS1307??? ,a może inaczej się go adresuje??? ,pozdrawiam

Z tego co wiem to DS1307 obsługuje się troszkę inaczej. Swego czasu bujnąłem zegar na tym RTC ale pamiętam że są z nim delikatne kłopoty.

Portret użytkownika gosc

OK ,a skąd te adresy?

OK ,a skąd te adresy?

I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163

Przeglądam PDF i widzę adresy rejestrów 01 - 0F ,próbowałem z szesnastkowego przeliczać na dziesiętny ,bo myślałem że chodzi o odczyt
danego rejestru ,ale to chyba nie to. Widzę jest jeszcze alarm i inne przydatne "cuda". Zależy by mi załapać skąd te adresy wtedy może jakoś
połapię się z DS1307, pozdrawiam.

Portret użytkownika matrix

Re: Obsługa DS1307

Po co będziesz wyważał otwarte drzwi? W samplach jest obsługa DS1307. Wiem tylko że jeszcze trzeba z tym troszkę powalczyć bo coś się dzieje, ale nie pamiętam co?

'-------------------------------------------------------------------------------
'                           DS1307.BAS
' shows how to use the ds1307 clock on the 2313 futurlec board
' it also shows the CONFIG CLOCK=USER option
'-------------------------------------------------------------------------------
$regfile = "2313def.dat"
$crystal = 8000000
$baud = 19200
$lib "mcsbyte.lbx"                                          ' for smaller code
$lib "ds1307clock.lib"                                      ' modified lib
$framesize = 16
$hwstack = 24
$swstack = 16
 
 
'configure the scl and sda pins
Config Sda = Portd.6
Config Scl = Portd.5
 
'address of ds1307
Const Ds1307w = &HD0                                        ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
 
Config Clock = User                                         ' this will dim the bytes automatic
'dim other needed variables
Dim Weekday As Byte
 
Print "DS1307"
Waitms 100
' assigning the time will call the SetTime routine
Time$ = "23:58:59"                                          ' to watch the day changing value
Date$ = "11-13-02"                                          ' 13 november 2002
Do
  Print "Date Time : " ; Date$ ; " " ; Time$
  Waitms 500
Loop
 
End
 
'called from ds1307clock.lib
Getdatetime:
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' start address in 1307
 
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307r                                          ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                                       ' MINUTES
  I2crbyte _hour , Ack                                      ' Hours
  I2crbyte Weekday , Ack                                    ' Day of Week
  I2crbyte _day , Ack                                       ' Day of Month
  I2crbyte _month , Ack                                     ' Month of Year
  I2crbyte _year , Nack                                     ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return
 
Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 4                                                ' starting address in 1307
  I2cwbyte _day                                             ' Send Data to SECONDS
  I2cwbyte _month                                           ' MINUTES
  I2cwbyte _year                                            ' Hours
  I2cstop
Return
 
Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                                                  ' Generate start code
  I2cwbyte Ds1307w                                          ' send address
  I2cwbyte 0                                                ' starting address in 1307
  I2cwbyte _sec                                             ' Send Data to SECONDS
  I2cwbyte _min                                             ' MINUTES
  I2cwbyte _hour                                            ' Hours
  I2cstop
Return

Portret użytkownika gosc

Mario

Ok ,dzięki. Czegoś takiego właśnie szukałem. Teraz już nie powinno być problemu!!! ,jeszcze raz dzięki!!! ;)

Portret użytkownika gosc

A ja mam pytanie co jest źle

A ja mam pytanie co jest źle w tym kodzie. Ustawiłem sobie do testów trzy przyciski i wszystko ładnie działa ale nie mogę zmienić wartości początkowej minuty.

Fragment 1
Do
    Odczyt_pcf8583 H , M , S , D , Mon
    If S <> S_old Then
    S_old = S
    Locate 1 , 1
    Lcd Bcd(h) ; ":" ; Bcd(m) ; ":" ; Bcd(s)
    Locate 2 , 1
    Lcd Bcd(d) ; "-" ; Bcd(mon)
    End If
 
    Debounce S1 , 0 , Zwieksz , Sub
    Debounce S2 , 0 , Zmniejsz , Sub
    Debounce S3 , 0 , Zatwierdz , Sub
 
 
Loop
 
Fragment 2
Sub Odczyt_pcf8583(byref Hour As Byte , Byref Minute As Byte , Byref Second As Byte , Byref Day As Byte , Byref Month As Byte)
    I2cstart
    I2cwbyte 162
    I2cwbyte 2
    I2cstart
    I2cwbyte 163
    I2crbyte Second , Ack
    I2crbyte Minute , Ack
    I2crbyte Hour , Ack
    I2crbyte Day , Ack
    I2crbyte Month , Nack
    I2cstop
    Day = Day And &B00111111
    Month = Month And &B00011111
End Sub
 
Sub Zapis_pcf8583(byval Hour As Byte , Byval Minute As Byte , Byval Second As Byte , Byval Day As Byte , Byval Month As Byte)
    Second = Makebcd(s)
    Minute = Makebcd(m)
    Hour = Makebcd(h)
    Day = Makebcd(d)
    Month = Makebcd(mon)
 
    I2cstart
    I2cwbyte 162
    I2cwbyte 2
    I2cwbyte Second
    I2cwbyte Minute
    I2cwbyte Hour
    I2cwbyte Day
    I2cwbyte Month
    I2cstop
End Sub
 
Fragment 3
 
Sub Zwieksz:
Incr A
End Sub
 
Sub Zmniejsz:
Decr A
End Sub
 
Sub Zatwierdz:
Incr P
If P = 1 Then
 M = A
Waitms 70
A = 0
Elseif P = 2 Then
H = A
Waitms 70
A = 0
Elseif P = 3 Then
D = A
Waitms 70
A = 0
Elseif P = 4 Then
Mon = A
Waitms 70
A = 0
End If
 
Zapis_pcf8583 H , M , S , D , Mon
End Sub

Dzięki za pomoc

Portret użytkownika mirley

Re: Pcf

Wydaje mi się że nie wywołujesz nigdzie procedury która wpisuje wartość zmiennej A do wartości godzin lub minut.... mogę się jednak mylić. Możesz sobie dopisać linijkę zaraz pod obsługą przycisków, która wyświetli niektóre zmienne na LCD i zobaczysz co się dzieje

-

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 gosc

Adres RTC

Może i moje pytanie jest banalne, ale znalazłem info że adres układu zmienia się, zależnie od podłączenia pinu AO
Jednak nigdzie nie znalazłem, jakie to adresy.
Wiem że rtc ma adresy r-162 w-163 i r-160 w-161. Teraz pytanie brzmi, który jest przy stanie wysokim na AO, a który przy niskim

Portret użytkownika mirley

PCF8583

Dla 8583. Karta katalogowa strona 17. Bit A0 bespośrednio trafia na bit 1 w adresie układu, czyli A0=1 daje adres +2, Z ustawionym A0 adresy będą 162 i 163

-

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 gosc

zmienione adresy zapisu i odczytu

Witam Mirley, ;)
próbowałem zaimpletować twój "gotowy" kod do odczytu czasu i daty i nie działało. Nie działało, dlatego, że podałeś adres odczytu i zapisu dla ds1307, nie wiem może na innych pcf'ach działa ale u mnie nie dlatego pozwole sobie wkleić zmodyfikowany kod (zmienione są tylko adresy odczytu i zapisu):

 Config Scl = Portc.5
Config Sda = Portc.4
 
Dim Sekundy As Byte : Dim Minuty As Byte : Dim Godziny As Byte
Dim Dzien As Byte : Dim Miesiac As Byte
Dim Rok As Byte : Dim Dzien_tygodnia As Byte
 
Do
 
I2cstart
  I2cwbyte &HA0
  I2cwbyte 2
  I2cstart
  I2cwbyte &HA1
  I2crbyte Sekundy , Ack
  I2crbyte Minuty , Ack
  I2crbyte Godziny , Ack
  I2crbyte Dzien , Ack
  I2crbyte Miesiac , Nack
  I2cstop
 
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
 
 
Rok = Dzien
Shift Rok , Right , 6
Rok = Makedec(rok)
Dzien.7 = 0 : Dzien.6 = 0
Dzien = Makedec(dzien)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Right , 5
Dzien_tygodnia = Makedec(dzien_tygodnia)
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
Miesiac = Makedec(miesiac)
 
Cls
Lcd "Godzina: " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Lowerline
Lcd "Data: " ; Dzien ; "-" ; Miesiac ; "-" ; Rok ; " : " ; Dzien_tygodnia
Wait 1
 
Loop
 End

Pozdrawiam,
feriar ;)

Portret użytkownika gosc

Mam pytanie odnośnie tego kodu

Dlaczego procedura Odczyt_pcf8583 jest z parametrami czy użycie procedury bez parametrów lub podprogramu i operowanie od razu na zmienych globalnych H, M, S, D , Mon nie jest bardziej optymalne?

declare sub od razu lokuje miejsce w pamięci na parametry, czy tak? Mósi zapamiętać adres zmienych?
Czyli bez tych parametrów zaoszczędzimy na ramie? Czy jednak jest to beznaczenia i objętość jest taka sama bo parametry i zmienne to te same obszary pamięci.

Czy szybkość wykonywania w obu przypadkach jest taka sama?
Co jest bardziej optymalne jeśli chodzi pamięć programu?

Portret użytkownika gosc

Witam. Mój problem dotyczy

Witam.

Mój problem dotyczy poprawności wyświeltania czasu na lcd.
Otóż sekundy zmieniają się nierównomiernie. przez 3-4sek czas leci szybciej po czym następuje chwila przerwy i znowu to samo - i tak w kółko.
Proszę o pomoc w czym tkw problem.
Poniżej fragment kodu dotyczący zegara :

Sub Settime()
S1 = Makebcd(s1)
M = Makebcd(m)
H = Makebcd(h)                                              
 
 
I2cstart                                                    
I2cwbyte 162                                                
I2cwbyte &H02                                               
I2cwbyte S1                                                 
I2cwbyte M                                                  
I2cwbyte H                                                  
I2cstop
End Sub
 
 
 
Sub Gettime()
   I2cstart
   I2cwbyte 162                                             
   I2cwbyte &H00
   I2cwbyte &H08                                            
   I2cstop
   I2cstart
   I2cwbyte 162                                             
   I2cwbyte &H02
   I2cstart
   I2cwbyte 163
   I2crbyte Ss , Ack                                        
   I2crbyte Mm , Ack                                        
   I2crbyte Hh , Nack                                       
   I2cstop
   S1 = Makedec(ss)
   M = Makedec(mm)                                          
   H = Makedec(hh)
   Czas = Bcd(hh) + ":" + Bcd(mm) + ":" + Bcd(ss)           
   Locate 1 , 1
   Lcd Czas
End Sub

Portret użytkownika mirley

Re: PCF

Co jaki odcinek czasu wywołujesz procedurę Gettime? nie czasem co 1s? wywołuj 10 razy na sekundę aby zauważyć zmianę czasu w liczniku Pcf albo skorzystaj z przerwania, które on generuje bo chyba da się to tak zrobić.

-

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 Pinky

Zegar na M32-dopisanie alarmu.

Witam wszystkich
Jestem w posiadania takiego zegara jak w temacie.Jestem baaardzo początkujący, ale udało mi się dodać termometr jednopunktowy do tego zegara.Zacząłem kombinować z dopisaniem alarmu ,ale po 2 dniach walki odpuściłem.Nie wiem jak zrobić kilka rzeczy:
Gdzie zacząć dopisywać kod?
Jak pod przyciski przypisać alarm ,które już są?
Jakie polecenia?
Przejrzałem dużo postów i kilka przykładów ,ale jakoś nie mogłem ich powiązać z moim zegarem.POMOŻECIE?

Pozdrawiam.

                  $regfile = "m32def.dat"
$crystal = 16000000
$hwstack = 64
$swstack = 64
$framesize = 64
 
$include "Config_PCF8583.bas"
 
Config Lcdpin = Pin , Rs = Portd.2 , E = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.0       'konfiguracja pinów LCD
Config Lcd = 16 * 2                                         'konfigruacja rodzaju LCD - 2 linie po 16 znak
 
Config 1wire = Portd.1
Config Pinb.7 = Input                                       ' enter
Config Pinb.6 = Input                                       ' up
Config Pinb.5 = Input                                       ' down
Config Pinb.4 = Input                                       ' cancel
Config Pinb.3 = Input                                       ' save
Config Pinb.0 = Input
Set Portb.7
Set Portb.6
Set Portb.5
Set Portb.4
Set Portb.3
Set Portb.0
S1 Alias Pinb.7
S2 Alias Pinb.6
S3 Alias Pinb.5
S4 Alias Pinb.4
S5 Alias Pinb.3
S6 Alias Pinb.0
 
Dim Cur_mode As Byte
 
Cur_mode = 0
 
                                          ' biblioteka obsługująca hardwarowe TWI
Config Sda = Portc.1
Config Scl = Portc.0
                                        ' 100KHz
I2cinit
 
Waitms 1
 
Dim Second As Byte
Dim Minute As Byte
Dim Hour As Byte
Dim Day As Byte
Dim Month As Byte
Dim Year As Word
Dim Weekday As Byte
 
 
' początkowe wartości
Second = 0                                                  ' 00:00:00
Minute = 0
Hour = 0
Day = 1                                                     ' 01.01.2000
Month = 1
Year = 2000
Weekday = 6                                                 ' sobota
 
Dim Blad As Byte
 
Dim Tmp As Byte
Dim Tmp1 As Byte
 
Declare Sub Displaytime()
Declare Sub Settime()
Declare Sub Cancel()
Declare Sub Plus()
Declare Sub Minus()
Declare Sub Saveandexit()
Declare Sub Enter()
Cursor Off Noblink
 
Cls
'-------------------------------------------------------------------
'                                  main
'-------------------------------------------------------------------
Do
 
'-------------------------------term
 
 Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32       ' definicja znaki stopnia
 Deflcdchar 2 , 4 , 10 , 10 , 14 , 14 , 31 , 14 , 32
 Deflcdchar 3 , 14 , 21 , 21 , 23 , 17 , 17 , 14 , 32
                                   ' konfiguracja portu PD.5 jako wej?cia magistrali 1-wire
 
Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5
'Deklaracja wszystkich zmiennych potrzebnych do pracy programu
  Do
 
  1wreset                                                   'reset
  1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
  1wwrite &H44                                              'dokonaj konwersji
  Waitms 750                                                'przeczekaj czas konwersji
  1wreset                                                   'reset
  1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
  1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
  Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
  T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
  Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
  T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt
    T1 = T * 0.0625                                         'wyra? w stopniach Celsjusza, wynik wpisz do zmiennej Single
 
Napis = Fusing(t1 , "#.#")
    Locate 1 , 12
    Lcd ; Napis ; Chr(1)                                    'wy?wietl wynik ze zmiennej Single
    Locate 1 , 11
    Lcd ; Chr(2)
    Locate 1 , 9
   Lcd ; Chr(3)
 'end term----------------------------------
 
 
 
 
 
 
 Waitms 200
 
   If Cur_mode = 0 Then
      Blad = Pcf8583_gettime()                              ' odczytaj godzinę i date z układu PCF8583 , funkcja zwraca kod błędu
      Call Displaytime
   End If
   'Debounce S1 , 0 , Settime , Sub
   If S1 = 0 Then                                           ' enter
      Waitms 25
      If S1 = 0 Then
         Call Settime
      End If
   End If
Loop
End
 
'-------------------------------------------------------------------
 
Sub Settime()
Disable Interrupts
   Cur_mode = 0
   Locate 1 , 1
   Cursor On Blink
   Do
      Debounce S1 , 0 , Enter , Sub
      Debounce S2 , 0 , Plus , Sub
      Debounce S3 , 0 , Minus , Sub
      Debounce S4 , 0 , Cancel , Sub
      Debounce S5 , 0 , Saveandexit , Sub
      If Cur_mode = 0 Then
         Cursor Off Blink
         Exit Do
      End If
   Loop
Enable Interrupts
End Sub
 
'-------------------------------------------------------------------
 
Sub Enter()
   Select Case Cur_mode
      Case 0:
         Locate 1 , 1
         Incr Cur_mode
      Case 1:
         Locate 1 , 4
         Incr Cur_mode
      Case 2:
         Locate 1 , 7
         Incr Cur_mode
      Case 3:
         Locate 2 , 1
         Incr Cur_mode
      Case 4:
         Locate 2 , 5
         Incr Cur_mode
      Case 5:
         Locate 2 , 8
         Incr Cur_mode
      Case 6:
         Locate 2 , 11
         Incr Cur_mode
      Case 7:
         Locate 1 , 1
         Cur_mode = 1
   End Select
End Sub
 
'-------------------------------------------------------------------
 
Sub Plus()
   Select Case Cur_mode
      Case 1:
         If Hour = 23 Then Hour = 0 Else Incr Hour
         Call Displaytime()
         Locate 1 , 1
      Case 2:
         If Minute = 59 Then Minute = 0 Else Incr Minute
         Call Displaytime()
         Locate 1 , 4
      Case 3:
         If Second = 59 Then Second = 0 Else Incr Second
         Call Displaytime()
         Locate 1 , 7
      Case 4:
         If Weekday = 6 Then Weekday = 0 Else Incr Weekday
         Call Displaytime()
         Locate 2 , 1
      Case 5:
         Tmp1 = Year Mod 4
         Tmp = Lookup(month , Monthlengths)
         If Tmp1 = 0 And Month = 2 Then Incr Tmp
         If Day = Tmp Then Day = 1 Else Incr Day
         Call Displaytime()
         Locate 2 , 5
      Case 6:
         If Month = 12 Then Month = 1 Else Incr Month
         Call Displaytime()
         Locate 2 , 8
      Case 7:
         Incr Year
         Call Displaytime()
         Locate 2 , 11
   End Select
End Sub
 
'-------------------------------------------------------------------
 
Sub Minus()
   Select Case Cur_mode
      Case 1:
         If Hour = 0 Then Hour = 23 Else Decr Hour
         Call Displaytime()
         Locate 1 , 1
      Case 2:
         If Minute = 0 Then Minute = 59 Else Decr Minute
         Call Displaytime()
         Locate 1 , 4
      Case 3:
         If Second = 0 Then Second = 59 Else Decr Second
         Call Displaytime()
         Locate 1 , 7
      Case 4:
         If Weekday = 0 Then Weekday = 6 Else Decr Weekday
         Call Displaytime()
         Locate 2 , 1
      Case 5:
         If Day = 1 Then
               Day = Lookup(month , Monthlengths)
               If Month = 2 Then
                  Tmp = Year Mod 4
                  If Tmp = 0 Then
                     Incr Day
                  End If
               End If
         Else
            Decr Day
         End If
         Call Displaytime()
         Locate 2 , 5
      Case 6:
         If Month = 1 Or Month = 0 Then Month = 12 Else Decr Month
         Call Displaytime()
         Locate 2 , 8
 
      Case 7:
         Decr Year
         Call Displaytime()
         Locate 2 , 11
   End Select
End Sub
 
'-------------------------------------------------------------------
 
Sub Saveandexit()
   Blad = Pcf8583_storetime(second , Minute , Hour , Day , Month , Year)
   Cur_mode = 0
End Sub
 
'-------------------------------------------------------------------
 
Sub Cancel()
   Cur_mode = 0
End Sub
 
'-------------------------------------------------------------------
 
Sub Displaytime()
   Locate 1 , 1
   If Hour < 10 Then Lcd "0" : Lcd Hour ; ":"
   If Minute < 10 Then Lcd "0" : Lcd Minute ; ":"
   If Second < 10 Then Lcd "0" : Lcd Second
   Locate 2 , 1
   Lcd Lookupstr(weekday , Weekdays) ; " "
   If Day < 10 Then Lcd "0" : Lcd Day ; "-"
   If Month < 10 Then Lcd "0" : Lcd Month ; "-" ; Year
End Sub
 
'-------------------------------------------------------------------
Weekdays:
Data "Nie" , "Pon" , "Wto" , "Sro" , "Czw" , "Pt " , "Sob"
 
'-------------------------------------------------------------------
Monthlengths:
Data 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31
 
'-------------------------------------------------------------------
 
$include "PCF8583.bas"
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'
 
Loop

Portret użytkownika gosc

Troche odgrzeję wątek tego

Troche odgrzeję wątek tego zegara.
Sam ostatnio uruchamiałem PCF8583 , który posiadał dopiętą dodatkową pamięć 24C16 - na tej samej magistrali I2C co PCF8583 - Po wielu podejściach zdecydowałem się wylutować 24C16, z którą niestety nie mogłem uruchomić zegara.
ps. Adresy READ/WRITE :
HA3,HA2 ---> A0 podpięte do +Vcc
HA1,HA0 ---> A0 podpięte do GND
------------

re. "Pinky"

Quote:
Przejrzałem dużo postów i kilka przykładów ,ale jakoś nie mogłem ich powiązać z moim zegarem.POMOŻECIE?

H....m, wymaga to dopisana kodu odpowiadającego za nastawy alarmów w rejestrach , które masz dokładnie opisane w notach katalogowych - zajrzyj także do dołączonych bibliotek $include "PCF8583.bas" w pokazanym kodzie.
Najlepiej zapytaj kolegów , którzy powyższy programik tworzyli - gdzie to Masz dopisać.

Portret użytkownika gosc

Witam, Nurtuje mnie jedno

Witam,

Nurtuje mnie jedno pytanie, czy z tego pcf'a muszę odczytywać wszystkie dane po kolei, czy mogę ominąć np jedną? Potrzebuję godziny, minuty (sekundy od biedy, ale nie muszą być) i numer dnia tygodnia. W jaki sposób mam ominąć zmienną "dzien" (nazwa z artykułu), żeby pobrać po niej zmienną "miesiac" w której zakodowany jest numer dnia tygodnia? Czy da się to jakoś ominąć? Myślałem jak to zrobić i ewentualnie ten sposób powinien się przyjąć. Zamiast do zmiennej "dzien" zapisze do zmiennej "Miesiac", później ją wyzeruje i właściwą linijkę zapisze do zmiennej miesiąc.

Czyli zamiast tak:

  I2crbyte Sekundy , Ack
  I2crbyte Minuty , Ack
  I2crbyte Godziny , Ack
  I2crbyte Dzien , Ack
  I2crbyte Miesiac , Nack
  I2cstop

zrobić tak:

  I2crbyte Sekundy , Ack
  I2crbyte Minuty , Ack
  I2crbyte Godziny , Ack
  I2crbyte Miesiac , Ack 'zamiast zmiennej dzien
  miesiac = 0
  I2crbyte Miesiac , Nack
  I2cstop

Nie sprawdzałem tego, ale wydaje mi się, że powinno dać radę. Proszę o jakieś wskazówki jak to inaczej rozwiązać, lub to czy tak może być (jeszcze chwile potrwa zanim skończę pisać obsługę PCF'a w dość rozbudowanym programie, gdzie sam pcf jest tylko dodatkiem.

Pozdrawiam
Dawid K.

Portret użytkownika mirley

RE: PCF

Najszybciej jest tak jak napisałeś.... nie ma sensu zerować zmienną miesiąc bo kolejny odczyt ją nadpisze

-

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 gosc

zapis dni tygodnia do zmiennej miesiac

Witam!
Strona świetna, porady super, ale ... niestety zawsze jakieś jest;)
Chodzi mi konkretnie o Twój kod do zapisu dni tygodnia w zmiennej miesiąca.

Miesiac = Makebcd(Miesiac)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Left , 5
Miesiac = Dzien_tygodnia Or Miesiac

Coś mi tu nie gra.
Przyjmijmy że
- dzień_tygodnia= 02 czyli środa
- miesiąc= 06 czyli czerwiec
dzień tygodnia to b00000010

miesiąc konwerujemy na kod BCD
miesiąc = 0000 0110
zmienną dzień tygodnia zastępujemy miesiącem i tym samym tracimy zawartość zmiennej dzień_tygodnia !
przesuwamy w lewo o 5 pozycji -> dzień_tygodnia=1100 0000 - i już tutaj jest zonk bo dzień tygodnia zamiast wartości 2 ma wartość (po odczycie) 6, a więc niedziela.
Albo ja czegoś nie rozumiem - w każdym razie taki kod wgrany do atmegi8 robi śmieci w stylu miesiąc 23 i dzień tygodnia przeskakujący o 2-3.
Mógłbyś pomóc w moim rozumowaniu? :)

Portret użytkownika matekogon

błąd w zapisie

Miesiac = Makebcd(miesiac)                                  
Dzien_tyg = Makebcd(dzien_tyg)                           
Shift Dzien_tyg , Left , 5
Miesiac = Dzien_tyg Or Miesiac

Teraz to działa z dniami tygodnia

Portret użytkownika matrix

Re: Pełna obsługa zegara PCF8583 w bascomie!

A jak obsłużyć tego pcf'a jeśli prócz niego na szynie mamy pamięć eeprom i inny procesor lub czujnik pojemnościowy z serii AT42QT1070 ?

Trzeba uważać tylko na adresowanie układów czy wchodzi w grę coś więcej ?

Portret użytkownika EDC

Odp. Pełna obsłucga zegara PCF8583 w bascomie

Kiedy weszła I2C Philipsa idea była jasna. Kilka układów na jednej szynie z możliwością sprzętowej konfiguracji adresu. Teraz nie jest tak różowo. W zalezności od producenta niektóre układy mają tylko jeden adres i nie da się go konfigurowac. Trzeba czytać note aplikacyjną producenta Twojej kostki. Nie raz jako elektronik samochodowy widziałem że układy pamięci nie pracują zamiennie. Wylut 24C04 i wlutowanie w to miejsce innej czasem kończy się fiaskiem bo na płycie adres jest skonfigurowany "nie domyślnie" np. A0 = 1 i A2 = 1 a nowa kośc nie obsługuje zmian. Stąd może wielu ma problemy i nie wie dlaczego nie działa To samo jest z popularnymi w samochodówce 93C46...niektóre układy nie obsługują pinu ORG (8 Bit lub 16 Bit)
Reasumując tania pamięć w układzie może bruździć na I2C i pewnie dlatego kolega kilka postów wyżej musiał ja wylutować.

Miłego dnia :D

-

BARTek
Moja strona

Portret użytkownika gosc

bascom?

A ja wam panowie powiem tak dajcie sobie spokój z BASCOM em tez dawniej bawiłem się w tym prymitywnym języku. Jezyk C wydawał mi się za trudny ale odkąd przerzuciłem się na C to już na pewno NIGDY nie wrócę do BASCOM . Polecam Eclipse bardzo fajny i darmowy program ewentualnie żeby było łatwiej oswoić się z C na początek można spróbować Arduino.
PS. W BASCOMIE robisz co wiesz... a w C wiesz co robisz ... ;)

Portret użytkownika EDC

Odp. bascom?

To, że o drugiej w nocy marnujesz czas na takie wypowiedzi nasuwa mi pewne podejrzenia co do Twojej osoby.
Nie Ty jeden "znasz" C, gościu, ale nie każdy tak się z tym obnosi...

Ps. Włącz kiedyś Atmel Studio6 na 5 minut i napisz kilka linijek kodu.
Chodzi mi o samą wygodę bo pomijam podejrzenie, że pewnie nie wiesz jak skonfigurować go by działał z Twoim USBasp.

Wrzuć na luz i koduj sobie a innym daj robić to co lubią.

-

BARTek
Moja strona

Portret użytkownika gosc

Pełna obsługa PCF8583

Odświeżę temat
obsługa tej kostki działa wyśmienicie sposobem podanym przez kolegę Villen (i tu moje osobiste podziękowania dla kolegi Villen za te opisy) należy pamiętać tylko o właściwym ustawieniu adresów (w przykładach podanych przez kolegę villen A0 mósi być podpięte do plusa). Jeżeli ktoś podpina A0 do minusa adresy odpowiednio 160 i 16

Portret użytkownika radom20

Błąd podczas kompilacji

Podczas kompilacji wywala mi takie błędy:

Quote:
Error : 31 Line : 822 Invalid data type [[0007]] , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik Domowy\SterownikDomowy Radom TEST.bas

Error : 46 Line : 823 Assignment error [ROK: 0 MAKEBCD(ROK): 200] , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik Domowy\SterownikDomowy Radom TEST.bas

O co w tym chodzi?

Portret użytkownika EDC

Odp. Błąd podczas kompilacji

Jeśli jeszcze nie masz to włącz numerowanie linii kodu. To, mi przynajmniej, pomaga szybciej orientować się w kodzie.
Włącza się to w ustawieniach Bascom->Options->Environment->Line numbers

Twój błąd oznacza najczęściej że nie zdefiniowano takiej zmiennej poprzez Dim
Zmiennej może tez brakować z powodu literówki. Na przykład zadeklarowano Dim Rol As Byte a w kodzie próbujesz użyć Rok

Po prostu się przyjrzyj. Albo czegoś brakuje albo jest zadeklarowane jako typ który nie przyjmuje takich wartosci.
Na przykład ktoś próbuje zapisać String tekstowy do zmiennej typu Bajt..

-

BARTek
Moja strona

Portret użytkownika radom20

Wygląda to

Wygląda to tak:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "m16def.dat"
$crystal = 16000000
 
Config Porta = &B11110011 : Porta = &B11111111
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00000011 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config 1wire = Pinc.7
 
Config Scl = Portb.0
Config Sda = Portb.1
I2cinit
 
Lcd_light Alias Portc.6
Sw_port Alias Pind                                          'nazwa portu
Tr1 Alias Portc.2
Tr2 Alias Portc.1
Tr_term Alias Portc.0
Buzz Alias Portc.5
Linia_no Alias Pina.2
Linia_nc Alias Pina.3
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'sw
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit       'Lcd
Dim Mig As Bit , Poz_ust As Byte
Dim Autosave As Byte , Autolight As Byte
 
 
Dim Ds1(8) As Byte , Ds2(8) As Byte , Ds3(8) As Byte , Ds(8) As Byte , Ds_adr As Byte , Ds_ok As Bit       'DS18B20
Dim Ktory_ds As Byte , Lsb As Byte , Msb As Byte , Minusy As Byte
Dim T(3) As Word
Dim T_ust As Word , T_his As Byte , Term_ena As Bit         'termostat
 
 
Dim Dzielnik(2) As Byte                                     'dzielniki timera
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwań
Dim Hbyte(2) As Byte , Hword(3) As Word , N As Byte , Hbit As Bit
 
Dim Sekundy As Byte : Dim Minuty As Byte : Dim Godziny As Byte
Dim Dzien As Byte : Dim Miesiac As Byte
Dim Rok As Byte : Dim Dzien_tygodnia As Byte
 
 
Dim G(4) As Byte , M(4) As Byte , Ar_tr1 As Bit , Ar_tr2 As Bit       'programtot czas
 
Dim Alarm As Byte , Salarm As Byte , A_g As Byte , A_m As Byte       'alarmy 0-wyl, 1-czuwa, 2-czas wtargniecia
Dim Alarm_licz As Byte
 
'*************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
Lcd_light = 0
Autolight = 40
 
Lcd "Sterownik Domowy"
Lowerline
Lcd " Wersja 1.05"
 
Wait 1
 
If Sw_port = &B01001111 Then
  Ds_adr = 30
  Gosub Ds_reg
  Cls
  Lcd "Ds1"
End If
If Sw_port = &B01010111 Then
  Ds_adr = 40
  Gosub Ds_reg
  Cls
  Lcd "Ds2"
End If
If Sw_port = &B01011011 Then
  Ds_adr = 50
  Gosub Ds_reg
  Cls
  Lcd "Ds term"
End If
 
 
For N = 1 To 8
  Hbyte(1) = 30 + N
  Readeeprom Ds1(n) , Hbyte(1)
  Hbyte(1) = 40 + N
  Readeeprom Ds2(n) , Hbyte(1)
  Hbyte(1) = 50 + N
  Readeeprom Ds3(n) , Hbyte(1)
Next N
 
 
For N = 10 To 13
  Readeeprom G(n -9) , N
  If G(n -9) > 23 Then G(n -9) = 0
Next N
For N = 14 To 17
  Readeeprom M(n -13) , N
  If M(n -13) > 59 Then M(n -13) = 0
Next N
Readeeprom Hbyte(1) , 18
Ar_tr1 = Hbyte(1).0
Ar_tr2 = Hbyte(1).1
Term_ena = Hbyte(1).2
 
Readeeprom T_ust , 19
Readeeprom T_his , 21
 
If T_ust > 1000 Or T_ust < 100 Then T_ust = 450
If T_his > 100 Or T_his < 5 Then T_his = 20
 
Readeeprom Alarm , 22
Readeeprom Salarm , 23
Readeeprom A_g , 24
Readeeprom A_m , 25
 
If Alarm > 2 Then Alarm = 0
If Salarm > 2 Then Salarm = 0
If A_g > 23 Then A_g = 0
If A_m > 59 Then A_m = 0
 
 
Wait 1
Wyswietlono = 1
Wyswietlanie = 1
Autosave = 5
 
'*******  Warunki Poczatkowe Koniec  ***********
 
'**************  Petla glowna ******************
'***********************************************
Do
  '***********************************************   co 4ms
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
 
    If Alarm = 1 Then
      If Linia_no = 0 Or Linia_nc = 1 Then
        Alarm = 2
        A_g = Godziny
        A_m = Minuty
      End If
    Else
      If Alarm = 2 Then
        Buzz = Mig
      Else
        Buzz = 1
      End If
    End If
 
    If Salarm = 1 Then
      If Linia_no = 0 Or Linia_nc = 1 Then
        Salarm = 2
        A_g = Godziny
        A_m = Minuty
      End If
    End If
 
    Gosub Przyciski
    If Wyswietlono = 1 Then Gosub Wysw_lcd
 
  End If
  '***********************************************
 
  '***********************************************   co 500ms
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
 
    If Autolight > 0 Then
      Decr Autolight
      Lcd_light = 0
    Else
      Lcd_light = 1
    End If
 
    Mig = Not Mig
 
    If Poz_wysw <> 1 Or Poz_ust = 0 Then
      If Zapisz_czas = 1 Then
        Gosub Zapis_rtc                                     'jednorazowo zapisuje po wyjściu z ustawień
        Zapisz_czas = 0
      Else
        Gosub Odczyt_rtc                                    'odczytuje czas
      End If
    Else
      Zapisz_czas = 1
    End If
 
    If Poz_wysw = 1 Then Wyswietlanie = 1                   'uaktualniaj czas jeśli jest pokazywany na LCD
    If Poz_wysw = 2 Then Wyswietlanie = 2
    If Poz_wysw = 4 Then Wyswietlanie = 4                   'jeśli wyswietlony termostat to uaktualnij.
    If Poz_wysw = 5 Then Wyswietlanie = 5
 
  End If
  '***********************************************
 
  '***********************************************   co 1s
  If Flaga_1s = 1 Then
    Flaga_1s = 0
 
    If Autosave < 5 Then
      Incr Autosave
      If Autosave = 5 Then
        For N = 10 To 13
          Writeeeprom G(n -9) , N
        Next N
        For N = 14 To 17
          Writeeeprom M(n -13) , N
        Next N
        Hbyte(1) = 0
        Hbyte(1).0 = Ar_tr1
        Hbyte(1).1 = Ar_tr2
        Hbyte(1).2 = Term_ena
        Writeeeprom Hbyte(1) , 18
 
        Writeeeprom T_ust , 19
        Writeeeprom T_his , 21
 
        Writeeeprom Alarm , 22
        Writeeeprom Salarm , 23
        Writeeeprom A_g , 24
        Writeeeprom A_m , 25
 
        Poz_ust = 0
      End If
    End If
 
    Gosub Temperatura
    If Poz_wysw = 3 Then Wyswietlanie = 3                   'jesli wysw temperatura to uaktualnij
 
    Gosub Sterowanie
 
  End If
  '***********************************************
 
Loop
End
'************ Petla glowna Koniec **************
 
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 5
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
    Dzielnik(1) = 0
    Set Flaga_500ms
    Incr Dzielnik(2)
    If Dzielnik(2) = 2 Then
      Dzielnik(2) = 0
      Set Flaga_1s
    End If
  End If
Return
'******** Przerwanie timer 0 Koniec ************
 
'***********************************************
'*****************  Przyciski     **************
Przyciski:
Sw = Sw_port And &B11111100                                 'And &B00001111                                 'maska na piny nieużywane jako sw
If Sw <> &B11111100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 68 Then
      Licznik_sw = 0
      Autolight = 40
 
      Select Case Stan_sw
        Case &B11101100:                                    'incr
        '***********************************************************
          Select Case Poz_wysw
            Case 1:
              Select Case Poz_ust
                Case 0:
                  'podczas wyswietania czasu
                  If Alarm = 2 Then Alarm = 0
                  'If Salarm = 2 Then Salarm = 0
                Case 1:
                  Incr Godziny
                  If Godziny = 24 Then Godziny = 0
                Case 2:
                  Incr Minuty
                  If Minuty = 60 Then Minuty = 0
                Case 3:
                  Incr Sekundy
                  If Sekundy = 60 Then Sekundy = 0
              End Select
 
            Case 2:
              Select Case Poz_ust
                Case 0:
                  Ar_tr1 = Not Ar_tr1
                Case 1:
                  Incr G(1)
                  If G(1) = 24 Then G(1) = 0
                Case 2:
                  Incr M(1)
                  If M(1) = 60 Then M(1) = 0
                Case 3:
                  Incr G(2)
                  If G(2) = 24 Then G(2) = 0
                Case 4:
                  Incr M(2)
                  If M(2) = 60 Then M(2) = 0
                Case 5:
                  Incr G(3)
                  If G(3) = 24 Then G(3) = 0
                Case 6:
                  Incr M(3)
                  If M(3) = 60 Then M(3) = 0
                Case 7:
                  Incr G(4)
                  If G(4) = 24 Then G(4) = 0
                Case 8:
                  Incr M(4)
                  If M(4) = 60 Then M(4) = 0
              End Select
              Autosave = 0
 
            Case 4:
              Select Case Poz_ust
                Case 0:
                   Term_ena = Not Term_ena
                   If Term_ena = 0 Then Tr_term = 1
                Case 1:
                  If T_ust < 1000 Then T_ust = T_ust + 10
                Case 2:
                  If T_his < 100 Then Incr T_his
              End Select
              Autosave = 0
            Case 5:
              Select Case Poz_ust
                Case 0:
                 ' podczas wysw alarmow
                Case 1:
                  If Alarm <> 0 Then Alarm = 0 Else Alarm = 1
                  Buzz = 1
                Case 2:
                  If Salarm <> 0 Then Salarm = 0 Else Salarm = 1
              End Select
              Autosave = 0
          End Select
 
        Case &B11111000:                                    'ustaw next
        '***********************************************************
          Select Case Poz_wysw
            Case 1:
              Incr Poz_ust
              If Poz_ust = 4 Then Poz_ust = 0
 
            Case 2:
              Incr Poz_ust
              If Poz_ust = 9 Then Poz_ust = 0
 
            Case 4:
              Incr Poz_ust
              If Poz_ust = 3 Then Poz_ust = 0
 
            Case 5:
              Incr Poz_ust
              If Poz_ust = 3 Then Poz_ust = 0
          End Select
 
        Case &B11110100:                                    'decr
        '***********************************************************
          Select Case Poz_wysw
            Case 1:
              Select Case Poz_ust
                Case 0:
                  'podczas wyswietania czasu
                  If Alarm = 2 Then Alarm = 0
                Case 1:
                  Decr Godziny
                  If Godziny = 255 Then Godziny = 23
                Case 2:
                  Decr Minuty
                  If Minuty = 255 Then Minuty = 59
                Case 3:
                  Decr Sekundy
                  If Sekundy = 255 Then Sekundy = 59
              End Select
 
            Case 2:
              Select Case Poz_ust
                Case 0:
                  Ar_tr2 = Not Ar_tr2
                Case 1:
                  Decr G(1)
                  If G(1) = 255 Then G(1) = 23
                Case 2:
                  Decr M(1)
                  If M(1) = 255 Then M(1) = 59
                Case 3:
                  Decr G(2)
                  If G(2) = 255 Then G(2) = 23
                Case 4:
                  Decr M(2)
                  If M(2) = 255 Then M(2) = 59
                Case 5:
                  Decr G(3)
                  If G(3) = 255 Then G(3) = 23
                Case 6:
                  Decr M(3)
                  If M(3) = 255 Then M(3) = 59
                Case 7:
                  Decr G(4)
                  If G(4) = 255 Then G(4) = 23
                Case 8:
                  Decr M(4)
                  If M(4) = 255 Then M(4) = 59
              End Select
              Autosave = 0
 
            Case 4:
              Select Case Poz_ust
                Case 0:
                  Term_ena = Not Term_ena
                  If Term_ena = 0 Then Tr_term = 1
                Case 1:
                  If T_ust > 100 Then T_ust = T_ust - 10
                Case 2:
                  If T_his > 5 Then Decr T_his
              End Select
              Autosave = 0
 
            Case 5:
              Select Case Poz_ust
                Case 0:
                 ' podczas wysw alarmow
                Case 1:
                  If Alarm <> 0 Then Alarm = 0 Else Alarm = 1
                  Buzz = 1
                Case 2:
                  If Salarm <> 0 Then Salarm = 0 Else Salarm = 1
              End Select
              Autosave = 0
          End Select
 
        Case &B11011100:                                    'next menu
        '***********************************************************
        Poz_ust = 0
        Wyswietlanie = Poz_wysw + 1
        If Wyswietlanie = 6 Then Wyswietlanie = 1
 
         Case &B10111100:                                   'triak 1
        '***********************************************************
         Select Case Poz_wysw
            Case 2:
             Ar_tr1 = 0
             Tr1 = Not Tr1
            Case 4:
             Term_ena = 0
             Tr_term = Not Tr_term
            Case 5:
             If Alarm = 2 Then Alarm = 0
             'If Salarm = 2 Then Salarm = 0
         End Select
 
         Autosave = 0
 
         Case &B01111100:                                   'triak 2
        '***********************************************************
         Select Case Poz_wysw
            Case 2:
             Ar_tr2 = 0
             Tr2 = Not Tr2
             Autosave = 0
            Case 4:
             Term_ena = 0
             Tr_term = Not Tr_term
            Case 5:
             If Alarm = 2 Then Alarm = 0
             If Salarm = 2 Then Salarm = 0
         End Select
 
         Autosave = 0
 
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 60
  End If
 
Return
'***********************************************
 
'***********************************************
'**************    LCD     ***********
Wysw_lcd:
 If Wyswietlanie <> 0 Then
   Wyswietlono = 0
   Select Case Wyswietlanie
     Case 1:                                                'aktualny czas
     '**************************************************************
       If Poz_wysw <> 1 Then
         Cls
         Lcd " Godzina "
       End If
        Locate 2 , 5
        If Poz_ust = 1 And Mig = 1 Then
          Lcd "  "
        Else
          If Godziny < 10 Then Lcd "0"
          Lcd Godziny
        End If
 
        If Poz_ust = 0 And Mig = 1 Then Lcd " " Else Lcd ":"
        If Poz_ust = 2 And Mig = 1 Then
          Lcd "  "
        Else
          If Minuty < 10 Then Lcd "0"
          Lcd Minuty
        End If
        If Poz_ust = 0 And Mig = 1 Then Lcd " " Else Lcd ":"
 
        If Poz_ust = 3 And Mig = 1 Then
          Lcd "  "
        Else
          If Sekundy < 10 Then Lcd "0"
          Lcd Sekundy
        End If
 
     Case 2:                                                'programator czasowy
     '**************************************************************
        If Poz_wysw <> 2 Then
         Cls
        End If
 
        Locate 1 , 1
        If Poz_ust = 1 And Mig = 1 Then
          Lcd "  "
        Else
          If G(1) < 10 Then Lcd "0"
          Lcd G(1)
        End If
 
        Lcd ":"
 
        If Poz_ust = 2 And Mig = 1 Then
          Lcd "  "
        Else
          If M(1) < 10 Then Lcd "0"
          Lcd M(1)
        End If
 
        Lcd " - "
 
        If Poz_ust = 3 And Mig = 1 Then
          Lcd "  "
        Else
          If G(2) < 10 Then Lcd "0"
          Lcd G(2)
        End If
 
        Lcd ":"
 
        If Poz_ust = 4 And Mig = 1 Then
          Lcd "  "
        Else
          If M(2) < 10 Then Lcd "0"
          Lcd M(2)
        End If
 
        Lcd "  "
 
        If Ar_tr1 = 1 Then Lcd "A" Else Lcd "R"
 
        Locate 2 , 1
 
        If Poz_ust = 5 And Mig = 1 Then
          Lcd "  "
        Else
          If G(3) < 10 Then Lcd "0"
          Lcd G(3)
        End If
 
        Lcd ":"
 
        If Poz_ust = 6 And Mig = 1 Then
          Lcd "  "
        Else
          If M(3) < 10 Then Lcd "0"
          Lcd M(3)
        End If
 
        Lcd " - "
 
        If Poz_ust = 7 And Mig = 1 Then
          Lcd "  "
        Else
          If G(4) < 10 Then Lcd "0"
          Lcd G(4)
        End If
 
        Lcd ":"
 
        If Poz_ust = 8 And Mig = 1 Then
          Lcd "  "
        Else
          If M(4) < 10 Then Lcd "0"
          Lcd M(4)
        End If
 
        Lcd "  "
 
        If Ar_tr2 = 1 Then Lcd "A" Else Lcd "R"
 
 
     Case 3:
     '**************************************************************
        If Poz_wysw <> 3 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "Dw" ; Chr(1) ; "r:"
         Lowerline
         Lcd "Dom:"
       End If
 
       For N = 1 To 2
         Hword(1) = T(n) / 10
         Hword(2) = 11
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         Locate N , Hword(2)
         Hword(2) = T(n) Mod 10
         Lcd " "
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
       Next N
 
     Case 4:
     '**************************************************************
        If Poz_wysw <> 4 Then
         Deflcdchar 2 , 4 , 4 , 31 , 4 , 4 , 32 , 31 , 32   '+-
         Cls
         Lcd "Term:"
       End If
 
       Hword(1) = T(3) / 10
       Hword(2) = 8
       If Hword(1) >= 10 Then Decr Hword(2)
       If Hword(1) >= 100 Then Decr Hword(2)
       If Minusy.3 = 1 Then Decr Hword(2)
       Locate 1 , Hword(2)
       Hword(2) = T(3) Mod 10
       Lcd " "
       If Minusy.3 = 1 Then Lcd "-"
       Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C  "
 
       If Term_ena = 1 Then Lcd "A" Else Lcd "R"
 
       If Poz_ust = 1 And Mig = 1 Then
          Locate 2 , 1
          Lcd "        "
       Else
       'tust
         Hword(1) = T_ust / 10
         Hword(2) = 3
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 2 , Hword(2)
         Hword(2) = T_ust Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C " ; Chr(2)
       End If
 
       If Poz_ust = 2 And Mig = 1 Then
          Locate 2 , 11
          Lcd "      "
       Else
       'thist
         Hbyte(1) = T_his / 10
         Hbyte(2) = 12
         If Hbyte(1) >= 10 Then Decr Hbyte(2)
         If Hbyte(1) >= 100 Then Decr Hbyte(2)
         Locate 2 , Hbyte(2)
         Hbyte(2) = T_his Mod 10
         Lcd Hbyte(1) ; "." ; Hbyte(2) ; Chr(0) ; "C"
       End If
 
     Case 5:
     '**************************************************************
        If Poz_wysw <> 5 Then
         Cls
         Lcd "Alarm: "
         Lowerline
         Lcd "C. Alarm: "
        End If
 
         Locate 1 , 8
         If Poz_ust = 1 And Mig = 1 Then
           Lcd "       "
         Else
           If Alarm = 0 Then Lcd "Wyl. "
           If Alarm = 1 Then Lcd "Czuwa"
           If Alarm = 2 Then
             If A_g < 10 Then Lcd "0"
             Lcd A_g ; ":"
             If A_m < 10 Then Lcd "0"
             Lcd A_m
           End If
         End If
 
         Locate 2 , 11
         If Poz_ust = 2 And Mig = 1 Then
           Lcd "       "
         Else
           If Salarm = 0 Then Lcd "Wyl. "
           If Salarm = 1 Then Lcd "Czuwa"
           If Salarm = 2 Then
             If A_g < 10 Then Lcd "0"
             Lcd A_g ; ":"
             If A_m < 10 Then Lcd "0"
             Lcd A_m
           End If
         End If
 
   End Select
   Poz_wysw = Wyswietlanie
   Wyswietlanie = 0
   Wyswietlono = 1
 End If
Return
'************** LCD Koniec ***********
 
'**********  rejestracja DS *********
Ds_reg:
  Disable Interrupts
  1wreset
  1wwrite &H33
  Ds(1) = 1wread(8):
  Enable Interrupts
  If Ds(1) <> 255 Or Ds(2) <> 255 Or Ds(3) <> 255 Or Ds(4) <> 255 Or Ds(5) <> 255 Or Ds(6) <> 255 Or Ds(7) <> 255 Or Ds(8) <> 255 Then
    Ds_ok = 1
    For N = 1 To 8
      Hbyte(1) = Ds_adr + N
      Writeeeprom Ds(n) , Hbyte(1)
    Next N
  Else
    Ds_ok = 0
  End If
Return
'******  rejestracja DS Koniec ******
 
'*************  Temperatura   ***********
Temperatura:
  Disable Interrupts
  1wreset
  Select Case Ktory_ds
    Case 0:
      1wwrite &HCC
      1wwrite &H44
    Case 1:
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 2:
      1wwrite &H55
      1wwrite Ds2(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 3:
      1wwrite &H55
      1wwrite Ds3(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
  End Select
 
  Enable Interrupts
 
  If Ktory_ds > 0 Then
    T(ktory_ds) = Msb * 256
    T(ktory_ds) = T(ktory_ds) + Lsb
    Minusy.ktory_ds = Msb.7
 
    If Minusy.ktory_ds = 1 Then
      T(ktory_ds) = Not T(ktory_ds)
      T(ktory_ds) = T(ktory_ds) + 1
    End If
 
    T(ktory_ds) = T(ktory_ds) * 10
    T(ktory_ds) = T(ktory_ds) / 16
   Else
    If Poz_wysw = 1 And Wyswietlono = 1 Then Wyswietlanie = 1
  End If
 
  Incr Ktory_ds
  If Ktory_ds = 4 Then Ktory_ds = 0
 
Return
'**********  Temperatura  Koniec *********
 
 
'****************** Zapis RTC ********************
Zapis_rtc:
Godziny = Makebcd(godziny)
Minuty = Makebcd(minuty)
Sekundy = Makebcd(sekundy)
Rok = Rok Mod 4
Rok = Makebcd(rok)
Shift Rok , Left , 6
Dzien = Makebcd(dzien)
Dzien = Rok Or Dzien
Miesiac = Makebcd(miesiac)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Left , 5
Miesiac = Dzien_tygodnia Or Miesiac
 
 
 I2cstart
  I2cwbyte 162
  I2cwbyte 0                                                'rejestr kontrolny
  I2cwbyte 8                                                'ustawienie rejestru zapisu daty
 
  I2cstop
I2cstart
I2cwbyte 162
   I2cwbyte 2
   I2cwbyte Sekundy
   I2cwbyte Minuty
   I2cwbyte Godziny
   I2cwbyte Dzien
   I2cwbyte Miesiac
   I2cstop
'************* Zapis RTC Koniec *****************
 
'****************** Odczyt RTC ********************
Odczyt_rtc:
 
Do
 
I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte Sekundy , Ack
  I2crbyte Minuty , Ack
  I2crbyte Godziny , Ack
  I2crbyte Dzien , Ack
  I2crbyte Miesiac , Nack
  I2cstop
 
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
 
 
Rok = Dzien
Shift Rok , Right , 6
Rok = Makedec(rok)
Dzien.7 = 0 : Dzien.6 = 0
Dzien = Makedec(dzien)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Right , 5
Dzien_tygodnia = Makedec(dzien_tygodnia)
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
Miesiac = Makedec(miesiac)
 
Cls
Lcd "Godzina: " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Lowerline
Lcd "Data: " ; Dzien ; "-" ; Miesiac ; "-" ; Rok ; " : " ; Dzien_tygodnia
Wait 1
 
Loop : End
 
Return
'************** Odczyt RTC Koniec *****************
 
'************   Sterowanie       ***************
'***********************************************
Sterowanie:
  Hword(1) = Godziny * 60
  Hword(1) = Hword(1) + Minuty                              'czas w minutach
 
  'prog czasowy
  For N = 1 To 3 Step 2
    Hword(2) = G(n) * 60
    Hword(2) = Hword(2) + M(n)                              'czas w minutach
    Hword(3) = G(1 + N) * 60
    Hword(3) = Hword(3) + M(1 + N)                          'czas w minutach
    Hbit = 1
    If Hword(3) >= Hword(2) Then
      If Hword(1) >= Hword(2) Then If Hword(1) < Hword(3) Then Hbit = 0
    Else
      If Hword(1) >= Hword(2) Then Hbit = 0
      If Hword(1) < Hword(3) Then Hbit = 0
    End If
    If N = 1 Then
      If Ar_tr1 = 1 Then Tr1 = Hbit
    Else
      If Ar_tr2 = 1 Then Tr2 = Hbit
    End If
  Next N
 
  'termostat
 
  If Term_ena = 1 Then
     Hword(1) = T_ust + T_his
     Hword(2) = T_ust - T_his
     If T(3) >= Hword(1) Then Tr_term = 1
     If T(3) <= Hword(2) Then Tr_term = 0
  End If
 
 
Return
'********    Sterowanie      Koniec ************

Ok. To poprawiłem.

Teraz mam takie błędy:

Quote:
Error : 31 Line : 195 Invalid data type [[0006]] , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik Domowy\SterownikDomowy Radom TEST.bas
Error : 46 Line : 197 Assignment error [ZAPISZ_CZAS: 0 0: 112] , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik Domowy\SterownikDomowy Radom TEST.bas
Error : 7 Line : 197 IF THEN expected [ 197] , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik Domowy\SterownikDomowy Radom TEST.bas
Error : 123 Line : 197 END IF expected , in File : C:\Documents and Settings\Admin\Pulpit\Sterownik Domowy\SterownikDomowy Radom TEST.bas

Portret użytkownika gosc

Pełna obsługa PCF8583

Poprawię samego siebie
Jeżeli ktoś podpina A0 do minusa adresy odpowiednio 160 i 161

Portret użytkownika EDC

Odp. Wygląda to tak..

Znajdź w kodzie ten kawałek i dopisz, jak ja, zmienną "Zapisz_czas" (z podkreślnikiem)

Dim Alarm_licz As Byte , Zapisz_czas As Byte
 
'*************  Zmienne Koniec  ****************

...i będzie malina :D

Miłego dnia

-

BARTek
Moja strona

Portret użytkownika radom20

Dzięki. Skompilował

Dzięki. Skompilował się.

Tylko mam jeszcze problem. Po wgraniu pokazuje godzinę w miejscu daty, a daty nie. Tylko godzinę mogę ustawić
Teraz kod tak wygląda:

'************* Konfiguracja uC *****************
'***********************************************
$regfile = "m16def.dat"
$crystal = 16000000
 
Config Porta = &B11110011 : Porta = &B11111111
Config Portb = &B11111111 : Portb = &B11111111
Config Portc = &B11111111 : Portc = &B11111111
Config Portd = &B00000011 : Portd = &B11111111
 
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.1 , Rs = Porta.0
Config Lcd = 16 * 2
Cls
Cursor Off Noblink
 
Config 1wire = Pinc.7
 
Config Scl = Portb.0
Config Sda = Portb.1
I2cinit
 
Lcd_light Alias Portc.6
Sw_port Alias Pind                                          'nazwa portu
Tr1 Alias Portc.2
Tr2 Alias Portc.1
Tr_term Alias Portc.0
Buzz Alias Portc.5
Linia_no Alias Pina.2
Linia_nc Alias Pina.3
 
Config Timer0 = Timer , Prescale = 256
Enable Timer0 : On Timer0 Prztimer0
 
 
Enable Interrupts
'********** Konfiguracja uC Koniec  ************
 
'******************  Zmienne *******************
'***********************************************
Dim Stan_sw As Byte , Sw As Byte , Licznik_sw As Byte       'sw
Dim Wyswietlanie As Byte , Poz_wysw As Byte , Wyswietlono As Bit       'Lcd
Dim Mig As Bit , Poz_ust As Byte
Dim Autosave As Byte , Autolight As Byte
 
 
Dim Ds1(8) As Byte , Ds2(8) As Byte , Ds3(8) As Byte , Ds(8) As Byte , Ds_adr As Byte , Ds_ok As Bit       'DS18B20
Dim Ktory_ds As Byte , Lsb As Byte , Msb As Byte , Minusy As Byte
Dim T(3) As Word
Dim T_ust As Word , T_his As Byte , Term_ena As Bit         'termostat
 
 
Dim Dzielnik(2) As Byte                                     'dzielniki timera
Dim Flaga_4ms As Bit , Flaga_500ms As Bit , Flaga_1s As Bit 'flagi przerwań
Dim Hbyte(2) As Byte , Hword(3) As Word , N As Byte , Hbit As Bit
 
Dim Sekundy As Byte : Dim Minuty As Byte : Dim Godziny As Byte
Dim Dzien As Byte : Dim Miesiac As Byte
Dim Rok As Byte : Dim Dzien_tygodnia As Byte
 
 
Dim G(4) As Byte , M(4) As Byte , Ar_tr1 As Bit , Ar_tr2 As Bit       'programtot czas
 
Dim Alarm As Byte , Salarm As Byte , A_g As Byte , A_m As Byte       'alarmy 0-wyl, 1-czuwa, 2-czas wtargniecia
Dim Alarm_licz As Byte , Zapisz_czas As Byte
 
'*************  Zmienne Koniec  ****************
 
'************ Warunki Poczatkowe ***************
'***********************************************
Lcd_light = 0
Autolight = 40
 
Lcd "Sterownik Domowy"
Lowerline
Lcd " V1.5"
 
Wait 1
 
If Sw_port = &B01001111 Then
  Ds_adr = 30
  Gosub Ds_reg
  Cls
  Lcd "Ds1"
End If
If Sw_port = &B01010111 Then
  Ds_adr = 40
  Gosub Ds_reg
  Cls
  Lcd "Ds2"
End If
If Sw_port = &B01011011 Then
  Ds_adr = 50
  Gosub Ds_reg
  Cls
  Lcd "Ds term"
End If
 
 
For N = 1 To 8
  Hbyte(1) = 30 + N
  Readeeprom Ds1(n) , Hbyte(1)
  Hbyte(1) = 40 + N
  Readeeprom Ds2(n) , Hbyte(1)
  Hbyte(1) = 50 + N
  Readeeprom Ds3(n) , Hbyte(1)
Next N
 
 
For N = 10 To 13
  Readeeprom G(n -9) , N
  If G(n -9) > 23 Then G(n -9) = 0
Next N
For N = 14 To 17
  Readeeprom M(n -13) , N
  If M(n -13) > 59 Then M(n -13) = 0
Next N
Readeeprom Hbyte(1) , 18
Ar_tr1 = Hbyte(1).0
Ar_tr2 = Hbyte(1).1
Term_ena = Hbyte(1).2
 
Readeeprom T_ust , 19
Readeeprom T_his , 21
 
If T_ust > 1000 Or T_ust < 100 Then T_ust = 450
If T_his > 100 Or T_his < 5 Then T_his = 20
 
Readeeprom Alarm , 22
Readeeprom Salarm , 23
Readeeprom A_g , 24
Readeeprom A_m , 25
 
If Alarm > 2 Then Alarm = 0
If Salarm > 2 Then Salarm = 0
If A_g > 23 Then A_g = 0
If A_m > 59 Then A_m = 0
 
 
Wait 1
Wyswietlono = 1
Wyswietlanie = 1
Autosave = 5
 
'*******  Warunki Poczatkowe Koniec  ***********
 
'**************  Petla glowna ******************
'***********************************************
Do
  '***********************************************   co 4ms
  If Flaga_4ms = 1 Then
    Flaga_4ms = 0
 
    If Alarm = 1 Then
      If Linia_no = 0 Or Linia_nc = 1 Then
        Alarm = 2
        A_g = Godziny
        A_m = Minuty
      End If
    Else
      If Alarm = 2 Then
        Buzz = Mig
      Else
        Buzz = 1
      End If
    End If
 
    If Salarm = 1 Then
      If Linia_no = 0 Or Linia_nc = 1 Then
        Salarm = 2
        A_g = Godziny
        A_m = Minuty
      End If
    End If
 
    Gosub Przyciski
    If Wyswietlono = 1 Then Gosub Wysw_lcd
 
  End If
  '***********************************************
 
  '***********************************************   co 500ms
  If Flaga_500ms = 1 Then
    Flaga_500ms = 0
 
    If Autolight > 0 Then
      Decr Autolight
      Lcd_light = 0
    Else
      Lcd_light = 1
    End If
 
    Mig = Not Mig
 
    If Poz_wysw <> 1 Or Poz_ust = 0 Then
      If Zapisz_czas = 1 Then
        Gosub Zapis_rtc                                     'jednorazowo zapisuje po wyjściu z ustawień
        Zapisz_czas = 0
      Else
        Gosub Odczyt_rtc                                    'odczytuje czas
      End If
    Else
      Zapisz_czas = 1
    End If
 
    If Poz_wysw = 1 Then Wyswietlanie = 1                   'uaktualniaj czas jeśli jest pokazywany na LCD
    If Poz_wysw = 2 Then Wyswietlanie = 2
    If Poz_wysw = 4 Then Wyswietlanie = 4                   'jeśli wyswietlony termostat to uaktualnij.
    If Poz_wysw = 5 Then Wyswietlanie = 5
 
  End If
  '***********************************************
 
  '***********************************************   co 1s
  If Flaga_1s = 1 Then
    Flaga_1s = 0
 
    If Autosave < 5 Then
      Incr Autosave
      If Autosave = 5 Then
        For N = 10 To 13
          Writeeeprom G(n -9) , N
        Next N
        For N = 14 To 17
          Writeeeprom M(n -13) , N
        Next N
        Hbyte(1) = 0
        Hbyte(1).0 = Ar_tr1
        Hbyte(1).1 = Ar_tr2
        Hbyte(1).2 = Term_ena
        Writeeeprom Hbyte(1) , 18
 
        Writeeeprom T_ust , 19
        Writeeeprom T_his , 21
 
        Writeeeprom Alarm , 22
        Writeeeprom Salarm , 23
        Writeeeprom A_g , 24
        Writeeeprom A_m , 25
 
        Poz_ust = 0
      End If
    End If
 
    Gosub Temperatura
    If Poz_wysw = 3 Then Wyswietlanie = 3                   'jesli wysw temperatura to uaktualnij
 
    Gosub Sterowanie
 
  End If
  '***********************************************
 
Loop
End
'************ Petla glowna Koniec **************
 
'************ Przerwanie timer 0 ***************
'***********************************************
Prztimer0:
  Timer0 = 5
  Set Flaga_4ms
  Incr Dzielnik(1)
  If Dzielnik(1) = 125 Then
    Dzielnik(1) = 0
    Set Flaga_500ms
    Incr Dzielnik(2)
    If Dzielnik(2) = 2 Then
      Dzielnik(2) = 0
      Set Flaga_1s
    End If
  End If
Return
'******** Przerwanie timer 0 Koniec ************
 
'***********************************************
'*****************  Przyciski     **************
Przyciski:
Sw = Sw_port And &B11111100                                 'And &B00001111                                 'maska na piny nieużywane jako sw
If Sw <> &B11111100 And Stan_sw = Sw Then
    Incr Licznik_sw
    If Licznik_sw = 68 Then
      Licznik_sw = 0
      Autolight = 40
 
      Select Case Stan_sw
        Case &B11101100:                                    'incr
        '***********************************************************
          Select Case Poz_wysw
            Case 1:
              Select Case Poz_ust
                Case 0:
                  'podczas wyswietania czasu
                  If Alarm = 2 Then Alarm = 0
                  'If Salarm = 2 Then Salarm = 0
                Case 1:
                  Incr Godziny
                  If Godziny = 24 Then Godziny = 0
                Case 2:
                  Incr Minuty
                  If Minuty = 60 Then Minuty = 0
                Case 3:
                  Incr Sekundy
                  If Sekundy = 60 Then Sekundy = 0
                Case 4
                  Incr Dzien
                  If Dzien = 7 Then Dzien = 0
                Case 5
                  Incr Rok
                  If Rok = 7 Then Rok = 0
              End Select
 
            Case 2:
              Select Case Poz_ust
                Case 0:
                  Ar_tr1 = Not Ar_tr1
                Case 1:
                  Incr G(1)
                  If G(1) = 24 Then G(1) = 0
                Case 2:
                  Incr M(1)
                  If M(1) = 60 Then M(1) = 0
                Case 3:
                  Incr G(2)
                  If G(2) = 24 Then G(2) = 0
                Case 4:
                  Incr M(2)
                  If M(2) = 60 Then M(2) = 0
                Case 5:
                  Incr G(3)
                  If G(3) = 24 Then G(3) = 0
                Case 6:
                  Incr M(3)
                  If M(3) = 60 Then M(3) = 0
                Case 7:
                  Incr G(4)
                  If G(4) = 24 Then G(4) = 0
                Case 8:
                  Incr M(4)
                  If M(4) = 60 Then M(4) = 0
              End Select
              Autosave = 0
 
            Case 4:
              Select Case Poz_ust
                Case 0:
                   Term_ena = Not Term_ena
                   If Term_ena = 0 Then Tr_term = 1
                Case 1:
                  If T_ust < 1000 Then T_ust = T_ust + 10
                Case 2:
                  If T_his < 100 Then Incr T_his
              End Select
              Autosave = 0
            Case 5:
              Select Case Poz_ust
                Case 0:
                 ' podczas wysw alarmow
                Case 1:
                  If Alarm <> 0 Then Alarm = 0 Else Alarm = 1
                  Buzz = 1
                Case 2:
                  If Salarm <> 0 Then Salarm = 0 Else Salarm = 1
              End Select
              Autosave = 0
          End Select
 
        Case &B11111000:                                    'ustaw next
        '***********************************************************
          Select Case Poz_wysw
            Case 1:
              Incr Poz_ust
              If Poz_ust = 4 Then Poz_ust = 0
 
            Case 2:
              Incr Poz_ust
              If Poz_ust = 9 Then Poz_ust = 0
 
            Case 4:
              Incr Poz_ust
              If Poz_ust = 3 Then Poz_ust = 0
 
            Case 5:
              Incr Poz_ust
              If Poz_ust = 3 Then Poz_ust = 0
          End Select
 
        Case &B11110100:                                    'decr
        '***********************************************************
          Select Case Poz_wysw
            Case 1:
              Select Case Poz_ust
                Case 0:
                  'podczas wyswietania czasu
                  If Alarm = 2 Then Alarm = 0
                Case 1:
                  Decr Godziny
                  If Godziny = 255 Then Godziny = 23
                Case 2:
                  Decr Minuty
                  If Minuty = 255 Then Minuty = 59
                Case 3:
                  Decr Sekundy
                  If Sekundy = 255 Then Sekundy = 59
              End Select
 
            Case 2:
              Select Case Poz_ust
                Case 0:
                  Ar_tr2 = Not Ar_tr2
                Case 1:
                  Decr G(1)
                  If G(1) = 255 Then G(1) = 23
                Case 2:
                  Decr M(1)
                  If M(1) = 255 Then M(1) = 59
                Case 3:
                  Decr G(2)
                  If G(2) = 255 Then G(2) = 23
                Case 4:
                  Decr M(2)
                  If M(2) = 255 Then M(2) = 59
                Case 5:
                  Decr G(3)
                  If G(3) = 255 Then G(3) = 23
                Case 6:
                  Decr M(3)
                  If M(3) = 255 Then M(3) = 59
                Case 7:
                  Decr G(4)
                  If G(4) = 255 Then G(4) = 23
                Case 8:
                  Decr M(4)
                  If M(4) = 255 Then M(4) = 59
              End Select
              Autosave = 0
 
            Case 4:
              Select Case Poz_ust
                Case 0:
                  Term_ena = Not Term_ena
                  If Term_ena = 0 Then Tr_term = 1
                Case 1:
                  If T_ust > 100 Then T_ust = T_ust - 10
                Case 2:
                  If T_his > 5 Then Decr T_his
              End Select
              Autosave = 0
 
            Case 5:
              Select Case Poz_ust
                Case 0:
                 ' podczas wysw alarmow
                Case 1:
                  If Alarm <> 0 Then Alarm = 0 Else Alarm = 1
                  Buzz = 1
                Case 2:
                  If Salarm <> 0 Then Salarm = 0 Else Salarm = 1
              End Select
              Autosave = 0
          End Select
 
        Case &B11011100:                                    'next menu
        '***********************************************************
        Poz_ust = 0
        Wyswietlanie = Poz_wysw + 1
        If Wyswietlanie = 6 Then Wyswietlanie = 1
 
         Case &B10111100:                                   'triak 1
        '***********************************************************
         Select Case Poz_wysw
            Case 2:
             Ar_tr1 = 0
             Tr1 = Not Tr1
            Case 4:
             Term_ena = 0
             Tr_term = Not Tr_term
            Case 5:
             If Alarm = 2 Then Alarm = 0
             'If Salarm = 2 Then Salarm = 0
         End Select
 
         Autosave = 0
 
         Case &B01111100:                                   'triak 2
        '***********************************************************
         Select Case Poz_wysw
            Case 2:
             Ar_tr2 = 0
             Tr2 = Not Tr2
             Autosave = 0
            Case 4:
             Term_ena = 0
             Tr_term = Not Tr_term
            Case 5:
             If Alarm = 2 Then Alarm = 0
             If Salarm = 2 Then Salarm = 0
         End Select
 
         Autosave = 0
 
 
      End Select
    End If
  Else
    Stan_sw = Sw
    Licznik_sw = 60
  End If
 
Return
'***********************************************
 
'***********************************************
'**************    LCD     ***********
Wysw_lcd:
 If Wyswietlanie <> 0 Then
   Wyswietlono = 0
   Select Case Wyswietlanie
     Case 1:                                                'aktualny czas
     '**************************************************************
       If Poz_wysw <> 1 Then
     Cls
Lcd "Godzina: " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Lowerline
Lcd "Data: " ; Dzien ; "-" ; Miesiac ; "-" ; Rok ; " : " ; Dzien_tygodnia
Wait 1
 
       End If
        Locate 2 , 5
        If Poz_ust = 1 And Mig = 1 Then
          Lcd "  "
        Else
          If Godziny < 10 Then Lcd "0"
          Lcd Godziny
        End If
 
        If Poz_ust = 0 And Mig = 1 Then Lcd " " Else Lcd ":"
        If Poz_ust = 2 And Mig = 1 Then
          Lcd "  "
        Else
          If Minuty < 10 Then Lcd "0"
          Lcd Minuty
        End If
        If Poz_ust = 0 And Mig = 1 Then Lcd " " Else Lcd ":"
 
        If Poz_ust = 3 And Mig = 1 Then
          Lcd "  "
        Else
          If Sekundy < 10 Then Lcd "0"
          Lcd Sekundy
        End If
 
     Case 2:                                                'programator czasowy
     '**************************************************************
        If Poz_wysw <> 2 Then
         Cls
        End If
 
        Locate 1 , 1
        If Poz_ust = 1 And Mig = 1 Then
          Lcd "  "
        Else
          If G(1) < 10 Then Lcd "0"
          Lcd G(1)
        End If
 
        Lcd ":"
 
        If Poz_ust = 2 And Mig = 1 Then
          Lcd "  "
        Else
          If M(1) < 10 Then Lcd "0"
          Lcd M(1)
        End If
 
        Lcd " - "
 
        If Poz_ust = 3 And Mig = 1 Then
          Lcd "  "
        Else
          If G(2) < 10 Then Lcd "0"
          Lcd G(2)
        End If
 
        Lcd ":"
 
        If Poz_ust = 4 And Mig = 1 Then
          Lcd "  "
        Else
          If M(2) < 10 Then Lcd "0"
          Lcd M(2)
        End If
 
        Lcd "  "
 
        If Ar_tr1 = 1 Then Lcd "A" Else Lcd "R"
 
        Locate 2 , 1
 
        If Poz_ust = 5 And Mig = 1 Then
          Lcd "  "
        Else
          If G(3) < 10 Then Lcd "0"
          Lcd G(3)
        End If
 
        Lcd ":"
 
        If Poz_ust = 6 And Mig = 1 Then
          Lcd "  "
        Else
          If M(3) < 10 Then Lcd "0"
          Lcd M(3)
        End If
 
        Lcd " - "
 
        If Poz_ust = 7 And Mig = 1 Then
          Lcd "  "
        Else
          If G(4) < 10 Then Lcd "0"
          Lcd G(4)
        End If
 
        Lcd ":"
 
        If Poz_ust = 8 And Mig = 1 Then
          Lcd "  "
        Else
          If M(4) < 10 Then Lcd "0"
          Lcd M(4)
        End If
 
        Lcd "  "
 
        If Ar_tr2 = 1 Then Lcd "A" Else Lcd "R"
 
 
     Case 3:
     '**************************************************************
        If Poz_wysw <> 3 Then
         Deflcdchar 0 , 7 , 5 , 7 , 32 , 32 , 32 , 32 , 32  'stopien
         Deflcdchar 1 , 4 , 32 , 14 , 17 , 17 , 17 , 14 , 32       ' o kreskowane
 
         Cls
         Lcd "Dw" ; Chr(1) ; "r:"
         Lowerline
         Lcd "Dom:"
       End If
 
       For N = 1 To 2
         Hword(1) = T(n) / 10
         Hword(2) = 11
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         If Minusy.n = 1 Then Decr Hword(2)
         Locate N , Hword(2)
         Hword(2) = T(n) Mod 10
         Lcd " "
         If Minusy.n = 1 Then Lcd "-"
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C"
       Next N
 
     Case 4:
     '**************************************************************
        If Poz_wysw <> 4 Then
         Deflcdchar 2 , 4 , 4 , 31 , 4 , 4 , 32 , 31 , 32   '+-
         Cls
         Lcd "Term:"
       End If
 
       Hword(1) = T(3) / 10
       Hword(2) = 8
       If Hword(1) >= 10 Then Decr Hword(2)
       If Hword(1) >= 100 Then Decr Hword(2)
       If Minusy.3 = 1 Then Decr Hword(2)
       Locate 1 , Hword(2)
       Hword(2) = T(3) Mod 10
       Lcd " "
       If Minusy.3 = 1 Then Lcd "-"
       Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C  "
 
       If Term_ena = 1 Then Lcd "A" Else Lcd "R"
 
       If Poz_ust = 1 And Mig = 1 Then
          Locate 2 , 1
          Lcd "        "
       Else
       'tust
         Hword(1) = T_ust / 10
         Hword(2) = 3
         If Hword(1) >= 10 Then Decr Hword(2)
         If Hword(1) >= 100 Then Decr Hword(2)
         Locate 2 , Hword(2)
         Hword(2) = T_ust Mod 10
         Lcd Hword(1) ; "." ; Hword(2) ; Chr(0) ; "C " ; Chr(2)
       End If
 
       If Poz_ust = 2 And Mig = 1 Then
          Locate 2 , 11
          Lcd "      "
       Else
       'thist
         Hbyte(1) = T_his / 10
         Hbyte(2) = 12
         If Hbyte(1) >= 10 Then Decr Hbyte(2)
         If Hbyte(1) >= 100 Then Decr Hbyte(2)
         Locate 2 , Hbyte(2)
         Hbyte(2) = T_his Mod 10
         Lcd Hbyte(1) ; "." ; Hbyte(2) ; Chr(0) ; "C"
       End If
 
     Case 5:
     '**************************************************************
        If Poz_wysw <> 5 Then
         Cls
         Lcd "Alarm: "
         Lowerline
         Lcd "C. Alarm: "
        End If
 
         Locate 1 , 8
         If Poz_ust = 1 And Mig = 1 Then
           Lcd "       "
         Else
           If Alarm = 0 Then Lcd "Wyl. "
           If Alarm = 1 Then Lcd "Czuwa"
           If Alarm = 2 Then
             If A_g < 10 Then Lcd "0"
             Lcd A_g ; ":"
             If A_m < 10 Then Lcd "0"
             Lcd A_m
           End If
         End If
 
         Locate 2 , 11
         If Poz_ust = 2 And Mig = 1 Then
           Lcd "       "
         Else
           If Salarm = 0 Then Lcd "Wyl. "
           If Salarm = 1 Then Lcd "Czuwa"
           If Salarm = 2 Then
             If A_g < 10 Then Lcd "0"
             Lcd A_g ; ":"
             If A_m < 10 Then Lcd "0"
             Lcd A_m
           End If
         End If
 
   End Select
   Poz_wysw = Wyswietlanie
   Wyswietlanie = 0
   Wyswietlono = 1
 End If
Return
'************** LCD Koniec ***********
 
'**********  rejestracja DS *********
Ds_reg:
  Disable Interrupts
  1wreset
  1wwrite &H33
  Ds(1) = 1wread(8):
  Enable Interrupts
  If Ds(1) <> 255 Or Ds(2) <> 255 Or Ds(3) <> 255 Or Ds(4) <> 255 Or Ds(5) <> 255 Or Ds(6) <> 255 Or Ds(7) <> 255 Or Ds(8) <> 255 Then
    Ds_ok = 1
    For N = 1 To 8
      Hbyte(1) = Ds_adr + N
      Writeeeprom Ds(n) , Hbyte(1)
    Next N
  Else
    Ds_ok = 0
  End If
Return
'******  rejestracja DS Koniec ******
 
'*************  Temperatura   ***********
Temperatura:
  Disable Interrupts
  1wreset
  Select Case Ktory_ds
    Case 0:
      1wwrite &HCC
      1wwrite &H44
    Case 1:
      1wwrite &H55
      1wwrite Ds1(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 2:
      1wwrite &H55
      1wwrite Ds2(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
    Case 3:
      1wwrite &H55
      1wwrite Ds3(1) , 8
      1wwrite &HBE
      Lsb = 1wread():
      Msb = 1wread():
  End Select
 
  Enable Interrupts
 
  If Ktory_ds > 0 Then
    T(ktory_ds) = Msb * 256
    T(ktory_ds) = T(ktory_ds) + Lsb
    Minusy.ktory_ds = Msb.7
 
    If Minusy.ktory_ds = 1 Then
      T(ktory_ds) = Not T(ktory_ds)
      T(ktory_ds) = T(ktory_ds) + 1
    End If
 
    T(ktory_ds) = T(ktory_ds) * 10
    T(ktory_ds) = T(ktory_ds) / 16
   Else
    If Poz_wysw = 1 And Wyswietlono = 1 Then Wyswietlanie = 1
  End If
 
  Incr Ktory_ds
  If Ktory_ds = 4 Then Ktory_ds = 0
 
Return
'**********  Temperatura  Koniec *********
 
 
'****************** Zapis RTC ********************
Zapis_rtc:
Godziny = Makebcd(godziny)
Minuty = Makebcd(minuty)
Sekundy = Makebcd(sekundy)
Rok = Rok Mod 4
Rok = Makebcd(rok)
Shift Rok , Left , 6
Dzien = Makebcd(dzien)
Dzien = Rok Or Dzien
Miesiac = Makebcd(miesiac)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Left , 5
Miesiac = Dzien_tygodnia Or Miesiac
 
 
   I2cstart
   I2cwbyte 162
   I2cwbyte 2
   I2cwbyte Sekundy
   I2cwbyte Minuty
   I2cwbyte Godziny
   I2cwbyte Dzien
   I2cwbyte Miesiac
   I2cstop
'************* Zapis RTC Koniec *****************
 
'****************** Odczyt RTC ********************
Odczyt_rtc:
 
 
 
I2cstart
  I2cwbyte 162
  I2cwbyte 2
  I2cstart
  I2cwbyte 163
  I2crbyte Sekundy , Ack
  I2crbyte Minuty , Ack
  I2crbyte Godziny , Ack
  I2crbyte Dzien , Ack
  I2crbyte Miesiac , Nack
  I2cstop
 
Sekundy = Makedec(sekundy)
Minuty = Makedec(minuty)
Godziny = Makedec(godziny)
 
 
Rok = Dzien
Shift Rok , Right , 6
Rok = Makedec(rok)
Dzien.7 = 0 : Dzien.6 = 0
Dzien = Makedec(dzien)
Dzien_tygodnia = Miesiac
Shift Dzien_tygodnia , Right , 5
Dzien_tygodnia = Makedec(dzien_tygodnia)
Miesiac.7 = 0 : Miesiac.6 = 0 : Miesiac.5 = 0
Miesiac = Makedec(miesiac)
 
 
 
Return
'************** Odczyt RTC Koniec *****************
 
'************   Sterowanie       ***************
'***********************************************
Sterowanie:
  Hword(1) = Godziny * 60
  Hword(1) = Hword(1) + Minuty                              'czas w minutach
 
  'prog czasowy
  For N = 1 To 3 Step 2
    Hword(2) = G(n) * 60
    Hword(2) = Hword(2) + M(n)                              'czas w minutach
    Hword(3) = G(1 + N) * 60
    Hword(3) = Hword(3) + M(1 + N)                          'czas w minutach
    Hbit = 1
    If Hword(3) >= Hword(2) Then
      If Hword(1) >= Hword(2) Then If Hword(1) < Hword(3) Then Hbit = 0
    Else
      If Hword(1) >= Hword(2) Then Hbit = 0
      If Hword(1) < Hword(3) Then Hbit = 0
    End If
    If N = 1 Then
      If Ar_tr1 = 1 Then Tr1 = Hbit
    Else
      If Ar_tr2 = 1 Then Tr2 = Hbit
    End If
  Next N
 
  'termostat
 
  If Term_ena = 1 Then
     Hword(1) = T_ust + T_his
     Hword(2) = T_ust - T_his
     If T(3) >= Hword(1) Then Tr_term = 1
     If T(3) <= Hword(2) Then Tr_term = 0
  End If
 
 
Return
'********    Sterowanie      Koniec ************

Portret użytkownika mirley

RTC uwagi

Jak słusznie poinformował mnie jeden z użytkowników w treści:

Quote:

I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy , Ack
I2crbyte Minuty , Ack
I2crbyte Godziny , Ack
I2crbyte Dzien , Ack
I2crbyte Miesiac , Nack
I2cstop

Kod ten działał będzie tylko wtedy, kiedy nasz RTC jest jedynym układem pracującym i podłączonym do szyny I2C naszego mikrokontrolera. Ale początkujący raczej rzadko stosują więcej niż jeden taki układ i myślę że nie jest to problemem, a ci bardziej zaawansowani raczej nie będą czytać tych moich wypocin :P.

Jest nieprawdziwe stwierdzenie - dlaczego kod ma działać tylko jak RTC jest jedynym układem na magistrali?

Proszę o korektę lub komentarz

-

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.