PCF8583 citanje datuma

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

PCF8583 citanje datuma

Post by febo26 »

Imam problem s citanjem datuma iz PCF8583 chipa.Upisivanje i citanje vremena mi funkcionira ali citanje datuma ne radi.
Svaki put kada sat dostigne vrijednost 23:59:59 i predje u vrijednost 00:00:00 u ispisu datuma se za jedan poveca vrijednost dana i godine dok mjesec ostaje nepromjenjen

recimo datum je 01:01:2000 i kada dođe pola noci datum se promjeni u ovaj oblik 02:01:2001 ,znaci dan i godina se uvecaju za jedan.

negdje ocito grijesim ali mi nije jasnoi gdje.

kod za taj chip je preradjeni kod za DS1337

Code: Select all

'Sat sa RTC pcf8583  kolom

       Include "Modedefs.Bas"
        DEFINE OSC 4 
	DEFINE  LCD_DREG PORTB
       	DEFINE  LCD_DBIT 0
    	DEFINE  LCD_BITS 4
    	DEFINE  LCD_RSREG PORTB
    	DEFINE  LCD_RSBIT 4
    	DEFINE  LCD_EREG PORTB
    	DEFINE  LCD_EBIT  5
    	DEFINE  LCD_LINES 2

       Symbol Taster0 = PORTA.0
       Symbol Taster1 = PORTA.1
       Symbol Taster2 = PORTA.2
       Symbol Taster3 = PORTA.3
   

       Symbol SCL = PORTC.3 ' I2C clock pin 
       Symbol SDA = PORTC.4 ' I2C data pin 

       I CON 254 'Kontrolni bajt LCD-a 
       Clr CON 1 'Brisi displej 
       Line1 CON 128 'Pocetak prve linije LCD-a 
       Line2 CON 192 'Pocetak druge linije LCD-a 

'Promenljive za citanje i upisivanje u pcf8583

   
       B0 var byte
       sat var byte
       min1 var byte
       dan var byte
       mje var byte
       god var byte
       cif1 var byte
       cif2 var byte
       broj var byte
       br var byte

S VAR BYTE
M VAR BYTE
H VAR BYTE
D var byte
Mn var byte
Y var byte
 
'----Inicijalne vrenosti----------------- 
       TRISA =%111111
       TRISB =%00000000 
       TRISC = %1111111
       TRISD =%00000000 
       TRISE= %000
       ADCON1 =7
       

       Lcdout $fe, 1		' Izbrisi ceo LCD displej
       Lcdout $fe, 2		' Pozicioniraj se na prvi red prvi karakter
       Lcdout "PROBA" 'Ispisi "PROBA" u prvom redu
       Lcdout $fe, $C0	    ' Podesi kursor na pocetak drugog reda
       Lcdout "PCF8583" 'Ispisi "DS1337" u drugom redu 
       Pause 1000           ' Pauza 1 sec
       I2CWrite SDA,SCL, $A1,$00,[ $09 ]  
Ciklus: 

'- - - Pritisnut B0 ulaz u glavni meni- - - - - - 

       B0 = 0
       button Taster0, 0, 100, 10, B0, 1, meni0


I2CREAD SDA,SCL,%10100001,2,[S]
I2CREAD SDA,SCL,%10100001,3,[M]
I2CREAD SDA,SCL,%10100001,4,[H]
I2CREAD SDA,SCL,%10100001,5,[D]
I2CREAD SDA,SCL,%10100001,6,[MN]
I2CREAD SDA,SCL,%10100001,7,[Y]



lcdout $fe,1 
lcdout $fe,2 
lcdout "VREME:", hex(H),":", hex2(M),":", hex2(S)
lcdout $fe,$c0 
lcdout "DATUM:", hex2(D),".", hex2(Mn),".20",hex2(Y)

 Pause 500  
             
GoTo Ciklus

'- - - - Meni izbora - - - - - - - - - - - - - - - -
meni0:
       LCdout i,Clr
       LCDout i, Line1,"     Vreme:    "
       LCDout i, Line2,"               "
       Pause 200

       button Taster0, 0, 100, 10, B0, 1, meni1
       button Taster1, 0, 100, 10, B0, 1, menisat0
       Goto Meni0

meni1:
       LCdout i,Clr
       LCDout i, Line1,"     Datum:    "
       LCDout i, Line2,"               "
       Pause 200

       button Taster1, 0, 100, 10, B0, 1, menidatum0
       Goto Meni1



'--------meni namestanja sata-----------------------------
menisat0:
       sat=0
       min1=0

menisat:
       button Taster0, 0, 100, 10, B0, 1, upisivreme
       button Taster1, 0, 100, 10, B0, 1, menisat1
       button Taster2, 0, 100, 10, B0, 1, menimin

       goto menisat:

menisat1:
       sat=sat+1
       If sat > 23 Then sat=0
       LCDOut I,Line2,"     ",dec2 sat, ":",  dec2 Min1
       Pause 200
       Goto menisat 

menimin:
       min1=min1+1
       If min1 > 59 Then min1=0
       LCDOut I,Line2,"     ",dec2 sat, ":",  dec2 Min1
       Pause 200
       Goto menisat 

upisivreme:
       br=sat
       Call Pretvori
       sat=Broj
       br=min1
       Call pretvori
       min1=Broj

    
      
I2cwrite SDA,SCL,%10100001,2,[0]
I2Cwrite SDA,SCL,%10100001,3,[min1]
I2Cwrite SDA,SCL,%10100001,4,[sat]

       pause 500
       Goto Ciklus

'--------meni namestanja datum--------------------------
menidatum0:
       dan=1
       mje=1
       god=7
menidatum:
       button Taster0, 0, 100, 10, B0, 1, upisidatum
       button Taster1, 0, 100, 10, B0, 1, menidan
       button Taster2, 0, 100, 10, B0, 1, menimje
       button Taster3, 0, 100, 10, B0, 1, menigod

       goto menidatum:

menidan:
       dan=dan+1
       If dan > 31 Then dan=1
       LCDOut I,Line2,"     ",dec2 dan, "/",  dec2 mje,"/", dec2 god
       Pause 200
       Goto menidatum 

menimje:
       mje=mje+1
       If mje > 12 Then mje=1
       LCDOut I,Line2,"     ",dec2 dan, "/",  dec2 mje,"/", dec2 god
       Pause 200
       Goto menidatum

menigod:
       god=god+1
       If god > 99 Then god=0
       LCDOut I,Line2,"     ",dec2 dan, "/",  dec2 mje,"/", dec2 god
       Pause 200
       Goto menidatum
 
upisidatum:

       br=dan
       Call Pretvori
       dan=broj
       br=mje
       Call Pretvori
       mje=broj
       br=god
       Call Pretvori
       god=broj

      
I2CWRITE SDA,SCL,%10100001,5,[dan]
I2CWRITE SDA,SCL,%10100001,6,[mje]
I2CWRITE SDA,SCL,%10100001,7,[god]
       pause 500
       Goto Ciklus




'-----pretvori iz dec u BCD kod-----------
Pretvori:
       cif1=br / 10
       cif2=br // 10
       broj=cif1 * 16 +  cif2
       Return
       End
       
       
       

User avatar
bob4
Stariji član
Stariji član
Posts: 2572
Joined: 31-01-2010, 16:12
Location: Kutina

Re: PCF8583 citanje datuma

Post by bob4 »

Ja nemam pojma o PIC-u, ali malo googla....
Ovo je viška
I2CREAD SDA,SCL,%10100001,7,[Y]

godina i dan u mjesecu je u jednom registru 05, a dan u tjednu i mjesec je u registru 06
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1725
Joined: 28-03-2012, 18:01
Location: Split

Re: PCF8583 citanje datuma

Post by Kukinjos »

Nisi dobro pogledao datasheet od PCF8583 i njegove memorijske lokacije 5 i 6. Gornja dva bita (7,6) u memoriji 5, su godina (zadnje dvije znamenke), a niži bitovi, od 5 do 0, su dani (datum) u BCD formatu. Slijedeća je memorijska lokacija 6, gdje su gornja 3 bita dan u tjednu, a donjih 5, mjesec u BCD formatu.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: PCF8583 citanje datuma

Post by febo26 »

prepravio sam naredbu za citanje izPCF8583 u ovaj oblik

I2CREAD SDA,SCL,%10100001,5,[Y,D]

i sada vise nemam taj problem krivog prikazivanja datuma kada dodje pola noci ali me nesto kopka da to nije pravi nacin citanja toga registra.

isto tako dok zelim upisati u PCF dan i godinu u ovom obliku naredbe

Code: Select all

upisidatum:

dan=1
mje=4
god=13

       br=dan
       Call Pretvori
       dan=broj

       br=mje
       Call Pretvori
       mje=broj

       br=god
       Call Pretvori
       god=broj


I2CWRITE SDA,SCL,%10100001,5,[god,dan]
I2CWRITE SDA,SCL,%10100001,6,[mje]
end
'-----pretvori iz dec u BCD kod-----------
Pretvori:
       cif1=br / 10
       cif2=br // 10
       broj=cif1 * 16 +  cif2
       Return
       End
       


onda ne mogu upisati mjesec u registru 6 vec je vrijednost godine u 5i 6 registru.

neznam kako da spojim godinu i dan u jedan byte i to upisem u registar broj 5 i to isto ponovim i za dan u tjednu i za mjesec i to upisem u registar broj 6....
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1725
Joined: 28-03-2012, 18:01
Location: Split

Re: PCF8583 citanje datuma

Post by Kukinjos »

Godina kod PCF8535 ide od 0 do 4, s tim da je 0 - prijestupna godina, kad računa veljaču s 29 dana. PCF8535 dakle nema tekuću godinu u nekom normalnom formatu. Ja bih tvoj soft ovako preradio:

Code: Select all

upisidatum:

dan=1
mje=4
god=1 ' 2012 - 0 (prijestupna), 2013 - 1, 2014 - 2, 2015 - 3, 2016 - 0 (prijestupna)

       br=dan
       Call Pretvori
       dan=broj

       br=mje
       Call Pretvori
       mje=broj

       god = god << 6       ' pomakni godinu na MSB
       god = god + dan 

I2CWRITE SDA,SCL,%10100001,5,[god]
I2CWRITE SDA,SCL,%10100001,6,[mje]
end
'-----pretvori iz dec u BCD kod-----------
Pretvori:
       cif1=br / 10
       cif2=br // 10
       broj=cif1 * 16 +  cif2
       Return
       End
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: PCF8583 citanje datuma

Post by febo26 »

zahvaljujem na odgovoru.
znaci PCF8583 i nije bas neki osobiti RTC posto mu godinu moram brojit sam i svaku prijestupnu mu upisat kao nulu da zna racunati veljaču kada ima 29 dana.
dobro s time cu se jos pozabaviti.

Da li se neko igrao s DS1337 chipom i kakva ima iskustva s njima.S njima sam izradi nekoliko satova po primjeru programa od Voje Milanovica i svi satovi mi se zure do 5 sekundi na dan.Probao sam razlicite quarz kristale i sa svima se isto ponasa.Cak sam u jednom plazma televizoru nasao isti taj chip i kristal izvadio ih i stavio na svoj sat i opet se zuri 5 sekundi po danu.Probao sam i drugacije plocicu nacrtati,koristiti baterijsko napajanje i opet isto.Kristali bi trebali biti od 6pF tako pise u datasheetu takvi su kao i kupljeni ali sa svima isto. Zato sada testiram PCF8583 da vidim kako ce se on ponasati.
User avatar
bob4
Stariji član
Stariji član
Posts: 2572
Joined: 31-01-2010, 16:12
Location: Kutina

Re: PCF8583 citanje datuma

Post by bob4 »

Ja oduvijek koristi taj PCF8583 i morao sam uvijek staviti promjenjivi kondenzator. (pogledaj blog). U zadnje vrijeme Kukinjos i ja provjeravamo na test pultu DS1307. Točan je bez kapaciteta pored sebe, ali je osjetljiviji na naponske smetnje i ima neke mane s kalendarom ( ? ).
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1725
Joined: 28-03-2012, 18:01
Location: Split

Re: PCF8583 citanje datuma

Post by Kukinjos »

febo26 wrote:znaci PCF8583 i nije bas neki osobiti RTC posto mu godinu moram brojit sam
Da
febo26 wrote:i svaku prijestupnu mu upisat kao nulu da zna racunati veljaču kada ima 29 dana.
Ne, jer on sam inkrementira taj registrar 31.12. u 24h, samo mu moraš inicijalno postavit broj od 0 do 3, zavisno koliko je godina prošlo od prijestupne godine, dakle 0 je prijestupna godina, 1 2 i 3 nisu, pa je opet 0 za prijestupnu godinu. Znači, prošla je bila prijestupna i u registar si trebao upisat početno 0, PCF je sam inkrementirao lani na novu godinu na 1, sad će opet inkrementirat na 2, pa slijedeću na 3 i onda opet se vratit na 0 u 2016. godini, koja je prijestupna.

Bob4 ti je odgovorio za DS1337, dosta je precizan, ali ako želiš manje odstupanje, moraš stavit trimer, ili ga svako toliko sinkronizirat s vanjskim izvorom, GPS, DCF77, ili preko net-a NTP-om
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: PCF8583 citanje datuma

Post by febo26 »

evo moje verzije sata s PCF8583 chipom.

Code: Select all

'Sat sa RTC pcf8583  kolom

        Include "Modedefs.Bas"
        DEFINE OSC 4 
	    DEFINE  LCD_DREG PORTB
       	DEFINE  LCD_DBIT 0
    	DEFINE  LCD_BITS 4
    	DEFINE  LCD_RSREG PORTB
    	DEFINE  LCD_RSBIT 4
    	DEFINE  LCD_EREG PORTB
    	DEFINE  LCD_EBIT  5
    	DEFINE  LCD_LINES 2

       Symbol Taster0 = PORTA.0
       Symbol Taster1 = PORTA.1
       Symbol Taster2 = PORTA.2
       Symbol Taster3 = PORTA.3
   

       Symbol SCL = PORTC.3 ' I2C clock pin 
       Symbol SDA = PORTC.4 ' I2C data pin 

       I CON 254 'Kontrolni bajt LCD-a 
       Clr CON 1 'Brisi displej 
       Line1 CON 128 'Pocetak prve linije LCD-a 
       Line2 CON 192 'Pocetak druge linije LCD-a 

'VARIJABLE ZA MENU POSTELAVANJE u pcf8583

       B0 var byte
       sat var byte
       min1 var byte
       dan var byte
       mje var byte
       god var byte
       cif1 var byte
       cif2 var byte
       broj var byte
       br var byte
       god1 var byte
       
       
       
       
'***************VARIJABLE ZA PRETVORBU IZ BCD U DEC OBLIK**********
       hr var byte
       mins var byte
       sec var byte
       date var byte
       mon var byte
'*****************PCF 8583 VARIJABLE***********************
S VAR BYTE
M VAR BYTE
H VAR BYTE
D var byte
Mn var byte
Y var byte
GOD2 VAR BYTE


'----Inicijalne vrenosti----------------- 
       TRISA =%111111
       TRISB =%00000000 
       TRISC = %1111111
       TRISD =%00000000 
       TRISE= %000
       ADCON1 =7
       

       Lcdout $fe, 1		' Izbrisi ceo LCD displej
	   Lcdout $fe, 2		' Pozicioniraj se na prvi red prvi karakter
       Lcdout "feric" 'Ispisi "PROBA" u prvom redu
       Lcdout $fe, $C0	    ' Podesi kursor na pocetak drugog reda
       Lcdout "feric zeljko" 'Ispisi "DS1337" u drugom redu 
       Pause 1000           ' Pauza 1 sec
       
       
       
'**********upis pocetnih vrijednosti status  registra++++++++++++++
   I2CWrite SDA,SCL, $A1,$00,[ $09 ] 
 
   
   
 '+++++++++++++glavni program++++++++++++++++++++++++++++
   
Ciklus: 

'- - - Pritisnut B0 ulaz u glavni meni- - - - - - 

   B0 = 0
   button Taster0, 0, 100, 10, B0, 1, meni0
'-------Citanje PCF8583-------------------------
I2CREAD SDA,SCL,%10100001,2,[S]
I2CREAD SDA,SCL,%10100001,3,[M]
I2CREAD SDA,SCL,%10100001,4,[H]
I2CREAD SDA,SCL,%10100001,5,[d]
I2CREAD SDA,SCL,%10100001,6,[MN]

'******************PRETVARANJE IZ BCD U DEC OBLIK ZA ISPIS NA DISPLAYU ********************************

      br = H
  Gosub Pretvori_iz_BCD
  hr = broj
  
  br = M
  Gosub Pretvori_iz_BCD
  mins = broj
               
br = S
Gosub Pretvori_iz_BCD
sec = broj

 br = D
 Gosub Pretvori_iz_BCD
 date = broj
 
   br = MN
   Gosub Pretvori_iz_BCD
   mon = broj 
   
'+++++++++++++++++++ispis na lcd- u+++++++++++++++++++++++
lcdout $fe,2 
lcdout "VREME:",dec2 hr,":",dec2 mins,":", dec2 sec
lcdout $fe,$c0 
lcdout "DATUM:", dec2 date,".", dec2 mon,".","20",dec god1


 '+++++++++++++++++povecan godinu za jedan  dok dojde nova godina+++++++++++++++++++++++
if hr=23 and mins=59 and sec=59 and date=31 and mon=12 then god1=god1+1 :pause 1000 

    
Pause 100             
GoTo Ciklus



'- - - - Meni izbora - - - - - - - - - - - - - - - -
meni0:
       LCdout i,Clr
       LCDout i, Line1,"     Vreme:    "
       LCDout i, Line2,"               "
       Pause 200

       button Taster0, 0, 100, 10, B0, 1, meni1
       button Taster1, 0, 100, 10, B0, 1, menisat0
       Goto Meni0

meni1:
       LCdout i,Clr
       LCDout i, Line1,"     Datum:    "
       LCDout i, Line2,"               "
       Pause 200

       button Taster1, 0, 100, 10, B0, 1, menidatum0
       Goto Meni1



'--------meni namestanja sata-----------------------------
menisat0:
       sat=22
       min1=59

menisat:
       button Taster0, 0, 100, 10, B0, 1, upisivreme
       button Taster1, 0, 100, 10, B0, 1, menisat1
       button Taster2, 0, 100, 10, B0, 1, menimin

       goto menisat:

menisat1:
       sat=sat+1
       If sat > 23 Then sat=0
       LCDOut I,Line2,"     ",dec2 sat, ":",  dec2 Min1
       Pause 200
       Goto menisat 

menimin:
       min1=min1+1
       If min1 > 59 Then min1=0
       LCDOut I,Line2,"     ",dec2 sat, ":",  dec2 Min1
       Pause 200
       Goto menisat 

upisivreme:
       br=sat
       Call Pretvori
       sat=Broj
       br=min1
       Call pretvori
       min1=Broj

    
      
I2cwrite SDA,SCL,%10100001,2,[0]
I2Cwrite SDA,SCL,%10100001,3,[min1]
I2Cwrite SDA,SCL,%10100001,4,[sat]

       pause 500
       Goto Ciklus

'--------meni namestanja datum--------------------------
menidatum0:
       dan=27
       mje=2
       god1=13
menidatum:
       button Taster0, 0, 100, 10, B0, 1, upisidatum
       button Taster1, 0, 100, 10, B0, 1, menidan
       button Taster2, 0, 100, 10, B0, 1, menimje
       button Taster3, 0, 100, 10, B0, 1, menigod

       goto menidatum:

menidan:
       dan=dan+1
       If dan > 31 Then dan=1
       LCDOut I,Line2,"     ",dec2 dan, "/",  dec2 mje,"/","20",dec god1
       Pause 200
       Goto menidatum 

menimje:
       mje=mje+1
       If mje > 12 Then mje=1
       LCDOut I,Line2,"     ",dec2 dan, "/",  dec2 mje,"/","20",dec god1
       Pause 200
       Goto menidatum

menigod:
       god1=god1+1
       If god1> 99 Then god1=00
       
'+++++++++++++++++upis vrijednosti godine  u PCF da bi znao kada je prestupna godina+++++++++++++++++++++++++
       IF GOD1 = 13  THEN GOD2 =  1
       IF GOD1 = 14  THEN GOD2 =  2
       IF GOD1 = 15  THEN GOD2 =  3
       IF GOD1 = 16  THEN GOD2 =  0
       IF GOD1 = 17  THEN GOD2 =  1
       IF GOD1 = 18  THEN GOD2 =  2 
       IF GOD1 = 19  THEN GOD2 =  3
       IF GOD1 = 20  THEN GOD2 =  0
       IF GOD1 = 21  THEN GOD2 =  1
       IF GOD1 = 22  THEN GOD2 =  2 
       IF GOD1 = 23  THEN GOD2 =  3
       IF GOD1 = 24  THEN GOD2 =  0
       IF GOD1 = 25  THEN GOD2 =  1
       IF GOD1 = 26  THEN GOD2 =  2 
       IF GOD1 = 27  THEN GOD2 =  3
       IF GOD1 = 28  THEN GOD2 =  0
       
       
        
       LCDOut I,Line2,"     ",dec2 dan, "/",  dec2 mje,"/","20",dec god1
       Pause 200
       Goto menidatum
       
       
 
upisidatum:
GOD=GOD2
 
       br=dan
       Call Pretvori
       dan=broj

       br=mje
       Call Pretvori
       mje=broj
       
       
       br=GOD
       Call Pretvori
       GOD=broj
       
     
       god = GOD << 6       ' pomakni godinu na MSB
       god = god + dan

I2CWRITE SDA,SCL,%10100001,5,[GOD]
I2CWRITE SDA,SCL,%10100001,6,[mje]

pause 500
Goto Ciklus


'-----pretvori iz dec u BCD kod-----------
Pretvori:
       cif1=br / 10
       cif2=br // 10
       broj=cif1 * 16 +  cif2
       Return
       End
       
       

'*********PRETVORI IZ BCD U DEC********
Pretvori_iz_BCD:
        cif1=br / 16
        cif2=br // 16
        broj=cif1 * 10 +  cif2
        Return
       

Post Reply