RTC (pcf 8583) się spieszy, Obsługa PCF


Witam.
Mam taki mały problem.
Używam zegara PCF 8385 do wyświetlania czasu i wykorzystuje jego wolną pamięć do przechowywania danych.
Wszystko chodzilo bez zarzutu do czasu gdy podlaczylem do niego bateryjke 3 V w celu podtrzymania czasu i tych danych.
Uklad zaczal sie spieszyc ok 15 min na dobe.
Podlaczylem ja przez uklad 2 diod prostowniczych.
prosze o pomoc.
p.s
sorki gdzies mi wcielo polskie litery
A moze daloby sie dodawac do postow rysunki lub schematy.bylo by fajnie




Portret użytkownika mirley

Re: RTC

Dolutuj pod podstawkę układu PCF kondensator 100nF jak najbliżej jego nóżek, u mnie załatwiło to problem.

Ps. Rysunki mozna dodawać tylko za pomocą zewnętrznych serwisów

-

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 McGiver1

PCF 8583/8563

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
 
Config Scl = Portd.4
Config Sda = Portd.3
 
Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
Declare Sub Odczyt_czasu
Do
 
Sub Odczyt_czasu
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy_bcd , Ack
I2crbyte Minuty_bcd , Ack
I2crbyte Godziny_bcd , Nack
I2cstop
 
Sekundy = Makedec(sekundy_bcd)
Minuty = Makedec(minuty_bcd)
Godziny = Makedec(godziny_bcd)
 
Cls
Lcd "Czas " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Wait 1
End Sub
 
Loop
End

Witam nie chciałem tworzyć nowego tematu.
Mam prośbę szczególnie do Mirka o sprawdzenie powyższego programu. Jest to program wyświetlający ,przynajmniej powinien, czas na lcd 16x2. Niestety zegar ,albo zaczyna od 0:0:80 do 165:165:165 ,albo zaczyna od 165:165:165 i nic się nie dzieje.
Linie SDA i SCL połączyłem przez rezystory 4,7k. Chyba ,że koniecznie muszą być 3,3k.

Prosiłbym o wypowiedzi i sugestie na temat tego programu.
Pozdrawiam i liczę na odpowiedź. Sławek ;]

Portret użytkownika mirley

Re: Program

Wywal linijki :

Declare Sub Odczyt_czasu
....
Sub Odczyt_czasu
....
End Sub

podprogramy nie są tu konieczne a jeśli nawet będą konieczne to ta deklaracja jest zła. Podprogram, etykieta, czy tez funkcja ma leżeć poza pętlą główną programu i może być z niej ewentualnie wywoływana. Nie wiem czym skutkuje wstawienie podprogramu do pętli głównej i jak się wtedy uC zachowuje. Popatrz na moje programy, nie mam nigdzie czegos takiego, szczerze mówiąc nigdy nie używam w bascomie funkcji i Declare Sub

-

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 McGiver1

$regfile =

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
 
Config Scl = Portd.4
Config Sda = Portd.3
 
Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
 
Do
 
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy_bcd , Ack
I2crbyte Minuty_bcd , Ack
I2crbyte Godziny_bcd , Nack
I2cstop
 
Sekundy = Makedec(sekundy_bcd)
Minuty = Makedec(minuty_bcd)
Godziny = Makedec(godziny_bcd)
 
Cls
Lcd "Czas " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Wait 1
 
Loop
End

Tak wywaliłem te linijki ,ale wiadomo było ,że się nic nie zmieni, jedynie program jest mniejszy trochę.
I co Mirek mógłbyś sprawdzić ten program u siebie? Masz taką ładną płytkę testową i jakby zadziałało to bym wiedział ,że mam coś namieszane technicznie. Choć myślę ,ze technicznie to może być ,że zegar się późni czy śpieszy ,a tu niestety zegar ,albo zaczyna od 0:0:80 do 165:165:165 ,albo zaczyna od 165:165:165 i nic się nie dzieje.
Tak jak mówiłem linie SCL SDA są przez rezystrory 4,7k w piątek zmienie na 3,3k.

A może już wiesz gdzie jest błąd. Najgorsze jest to ,że ja nie wiem co mam odczytać i jak to zrobić.
Szczególnie zastanawia mnie ta linijka co ja przez to robię ;]

I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163

Wiem jedynie ,że poprzez wpisanie 163 to odczytuje a 162 zapisuje. 2 (02H) oznacza jakby sekundy ,ale nadal nie łapię ;]
Liczę na pomoc i pozdrawiam Sławek :)

Portret użytkownika mirley

Re: PCF


I2cwbyte 162      'wyslij na magistralę adres 162, uklad który ma taką wartość zostanie właczony do komunikacji
I2cwbyte 2        'wyslij do aktywnego układu 2, PCF ustawi że operacje będą wykonywane na rejestrze o tym numerze (adresie wewnętrznym)
I2cstart
I2cwbyte 163      'wyslij 163, przełącza PCF na tryb odczytu danych, teraz on będzie wysyłał żądane bajty
 
I2crbyte Sekundy_bcd , Ack  'odczyt bajtu do zmiennej , ACK = będzie kolejny bajt
I2crbyte Minuty_bcd , Ack   'odczyt bajtu do zmiennej , ACK = będzie kolejny bajt
I2crbyte Godziny_bcd , Nack  'odczyt bajtu do zmiennej , NACK = koniec odczytu

Ustawiłeś fusebity tak aby mikrokontroler działał na te 8MHz które zadeklarowałeś na początku? jeśli częstotliwość pracy nie zgadza się z tą zadeklarowaną to I2C na pewno nie pójdzie

-

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 McGiver1

Działa!

Nareście działa ,moimi adresami ,były 160 i 161 ;]
Pozdrawiam ,troche potestuje i zdam relacje ;]

Portret użytkownika mirley

Re: Adres

Pin adresowy miałeś pewnie zwarty inaczej niż jest domyślnie podłączony.

-

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 McGiver1

Teraz pozostało zabrać się za

Teraz pozostało zabrać się za wyświetlenie pozostałych parametrów ,a szczególnie wykonać zmienianie godziny. Masz jakiś pomysł?
Pośrednio już wiem jak za to się wziąć:

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
 
Config Scl = Portd.4
Config Sda = Portd.3
Config Pinb.0 = Input
 
Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
Dim H As Byte , Hbcd As Byte
H = 19
Hbcd = Makebcd(h)
 
I2cstart
I2cwbyte 160
I2cwbyte 4
I2cwbyte Hbcd
I2cstop
 
Do
 
I2cstart
I2cwbyte 160
I2cwbyte 2
I2cstart
I2cwbyte 161
I2crbyte Sekundy_bcd , Ack
I2crbyte Minuty_bcd , Ack
I2crbyte Godziny_bcd , Nack
I2cstop
 
Sekundy = Makedec(sekundy_bcd)
Minuty = Makedec(minuty_bcd)
Godziny = Makedec(godziny_bcd)
 
Cls
Lcd "Czas " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
Waitms 900
 
Loop
End

Ale nie wiem jak to zrobię z przyciskami ,jakoś się to zrobi.
W tym programie zrobiłem ,by przy włączeniu do pcf-a wpisywał w godziny 19 ,zrobiłem to w ramach testu i działa zegar startuje od 19:0:0 :)
Pozdrawiam

Portret użytkownika mirley

Re: PCF

Zapis i odczyt pcf'a zamknij w procedurki , aby wywoływać je jedną linijką. Obsługę przycisków znajdziesz w kodach źródłowych u mnie na stronie. Popatrz do mojego programu w projekcie prostego sterownika domowego. Tam wszystko napisałem to co chcesz 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 McGiver1

Nie no niemogę się z tym

Nie no niemogę się z tym uporać ,bo właśnie niezbyt znam się na procedurach ,a do tego same się ona włączają nie wiem czemu :/

Portret użytkownika mirley

Re; PCF

A gdzie wstawiłeś te procedurki? Ma to wyglądać tak

'****************** Zapis RTC ********************
Zapis_rtc:                                                  'zapisuje czas g,m i s do uk?adu RTC
  Godziny_bcd = Makebcd(godziny)
  Minuty_bcd = Makebcd(minuty)
  Sekundy_bcd = Makebcd(sekundy)
 
  I2cstart
  I2cwbyte 160
  I2cwbyte 0                                                'rejestr kontrolny
  I2cwbyte 8                                                'ustawienie rejestru zapisu daty
 
  I2cstop
  I2cstart
  I2cwbyte 160
  I2cwbyte 2
 
  I2cwbyte Sekundy_bcd
  I2cwbyte Minuty_bcd
  I2cwbyte Godziny_bcd
  I2cstop
Return
'************* Zapis RTC Koniec *****************
 
'****************** Odczyt RTC ********************
Odczyt_rtc:                                                 'odczytuje czas z RTC do zmiennych
  I2cstart
  I2cwbyte 160                                             'adres zapisu
  I2cwbyte 2                                                'rejestr sekund
  I2cstart
  I2cwbyte 161                                              'adres odczytu
  I2crbyte Sekundy_bcd , Ack
  I2crbyte Minuty_bcd , Ack
  I2crbyte Godziny_bcd , Nack
  I2cstop
  Sekundy = Makedec(sekundy_bcd)
  Minuty = Makedec(minuty_bcd)
  Godziny = Makedec(godziny_bcd)
Return
'************** Odczyt RTC Koniec *****************

Ten fragmenty kodu mają być umieszczone poniżej pętli głównej do loop. Wywołujesz gdzieś wcześniej w programie Gosub zapis_rtc i sekundy, minuty i godziny są zapisywane. podobnie po wykonaniu Gosub odczyt_rtc, czas zostanie wpisany do zmiennych Sekundy, minuty, Godziny. W programie trzeba zrobić jeszcze obsługę timera żeby to było sensowne i odliczać opóźnienia za jego pomocą

-

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 McGiver1

$regfile =

$regfile = "attiny2313.dat"
$crystal = 8000000
 
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7 , E = Portb.3 , Rs = Portb.2
 
Config Scl = Portd.4
Config Sda = Portd.3
 
Config Pinb.0 = Input
Portb.0 = 1
Config Pind.1 = Input
Portd.1 = 1
 
I2cinit
Cursor Off Noblink
'------------------------------------Zmienne------------------------------------
 
Dim Godziny_bcd As Byte , Minuty_bcd As Byte , Sekundy_bcd As Byte
Dim Godziny As Byte , Minuty As Byte , Sekundy As Byte
'------------------------------------Petla_Głowna-------------------------------
Do
   Cls
 
   Lcd "Czas  " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy
   Lowerline
   Lcd "- RTC PCF_8583 -"
   Waitms 250
 
   Gosub Odczyt_rtc
 
    If Pinb.0 = 0 Then
   Waitms 50
   If Pinb.0 = 0 Then
   Incr Godziny
 
End If
End If
 
   If Pind.1 = 0 Then
   Waitms 50
   If Pind.1 = 0 Then
   Incr Minuty
 
End If
End If
 
Gosub Zapis_rtc
Loop
 
End
'****************** Zapis RTC ********************
Zapis_rtc:
  Godziny_bcd = Makebcd(godziny)
  Minuty_bcd = Makebcd(minuty)
  Sekundy_bcd = Makebcd(sekundy)
 
  I2cstart
  I2cwbyte 160
  I2cwbyte 0
  I2cwbyte 8
 
  I2cstop
  I2cstart
  I2cwbyte 160
  I2cwbyte 2
 
  I2cwbyte Sekundy_bcd
  I2cwbyte Minuty_bcd
  I2cwbyte Godziny_bcd
  I2cstop
Return
'************* Zapis RTC Koniec *****************
 
'****************** Odczyt RTC ********************
Odczyt_rtc:
  I2cstart
  I2cwbyte 160
  I2cwbyte 2
  I2cstart
  I2cwbyte 161
  I2crbyte Sekundy_bcd , Ack
  I2crbyte Minuty_bcd , Ack
  I2crbyte Godziny_bcd , Nack
  I2cstop
  Sekundy = Makedec(sekundy_bcd)
  Minuty = Makedec(minuty_bcd)
  Godziny = Makedec(godziny_bcd)
Return
'************** Odczyt RTC Koniec *****************

Nareście działa długo nie mogłem dojść z przyskami ,bo wartość godziny i minut sama się zwiększałam ,ale już jest ok ;]
Nie mam jeszcze pojęcia jak zrobić to ,że gdy sekundy i minuty są <10 to z przodu dopisujemy 0.

Portret użytkownika mirley

Re: Zegar PCF

Z tym akurat nie powinno byc problemu, trzeba tylko rozbić linijkę z wyświetlaniem czasu na kilka poleceń, zamień:

Lcd "Czas  " ; Godziny ; ":" ; Minuty ; ":" ; Sekundy

na:

Lcd "Czas  " 
if Godziny < 10 then Lcd "0"     'tu można dać zamiast zero poprostu spacje " "
Lcd Godziny ; ":"
if Minuty < 10 then Lcd "0"    
Lcd Minuty ; ":"
if Sekundy < 10 then Lcd "0"    
Lcd Sekundy

-

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 McGiver1

Dzięki bardzo, teraz

Dzięki bardzo, teraz pozostaje mi zakup trymerka i kombinowanie ,by zegarek chodził równiuśko :)
Pozdrawiam ;]

Portret użytkownika gosc

drobna sugestia - wariujące cyferki

dzięki za dokładną rozpiskę PCF'a !

Ja spotkałem się jeszcze z problemem przeskakującej godziny, np z 22 na 40 i to samo z datą.
Rozwiązaniem było dodanie do procedurki odczytu maski - to zalatwiło sprawę

p. tadi

Odczyt_rtc:
I2cstart
I2cwbyte 162
I2cwbyte 2
I2cstart
I2cwbyte 163
I2crbyte Sekundy_bcd , Ack
I2crbyte Minuty_bcd , Ack
I2crbyte Godziny_bcd , Nack
I2cstop

Sekundy_bcd = Sekundy_bcd And &B01111111
Minuty_bcd = Minuty_bcd And &B01111111
Godziny_bcd = Godziny_bcd And &B00111111

Sekundy = Makedec(sekundy_bcd)
Minuty = Makedec(minuty_bcd)
Godziny = Makedec(godziny_bcd)
Return