Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

Podprograma za preprosto pisanje in branje RTC PCF8583

 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Download
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jan 13, 2013 12:04 pm    Naslov sporočila: Podprograma za preprosto pisanje in branje RTC PCF8583 Odgovori s citatom

Kot RTC (Real Time Clock) uporabljam PCF8583.
Je pa prav zoprno vsakokrat sproti študirati, kje so v njem kaki podatki, zato sem si naredil dva podprograma, enega za zapis datuma in ure v RTC, in enega za branje teh istih podatkov.

Kaj morate narediti, predno uporabite ta dva podprograma?
Definirati morate I2C parametre po vaši shemi.
Tu je samo primer:
Koda:
Config Sda = Portd.7
Config Scl = Portd.5
Const Wrtc = &HA0   
Const Rrtc = &HA1

Definirati morate delovne spremenljivke
Koda:
Dim Reg14 As Iram Byte At 14 Overlay                        'register 14
Dim Dancas As String * 16
Dim I As Byte                                               'splošne delovne spremenljivke
Dim J As Byte
Dim K As Byte
Dim Dniz As String * 32                                     '  delovni niz
Dim Dnizi(33) As Byte At Dniz Overlay                       ' redefiniran kot polje

ki pa jih lahko po mili volji uporabljate tudi v svojem programu. Podprograma ju sicer uporabljata, a vam pred povratkom vrtneta prvotno vsebino, tako, da vaš glavni program tega niti ne opazi.

V spremenljivki Dniz boste dobili podatek o datumu in trenutni uri v formatu: danmesecleto uraminuta danvtednu. Primer 5. maj 2005 ura 08:11 Sobota:
Koda:
051105 0811 So

V spremenljivki Dancas pa podobno, le da sta leto in dan zamenjana, torej leto mesec dan, kar je ugodnejše če potrebujete sortiranje po datumu.

Uporaba je preprosta. Podprograma kličemo z ukazom gosub:
Koda:
Gosub Rrtcsr

in rezultat dobimo v spremneljivkah Dancas in Dniz

Pri vpisu datuma in ure pa moram najprej v spremenljivko dniz dati podatek, ki ga želimo vpisati in potem klicati podprogram

Koda:
Dniz  = "051106 0811 So"
Gosub wrtcsr


Voščim uspešno uporabo.

Podprograma sta v celoti tukaj:

Koda:

'         ---------------------RTC -------------------------------
' Podprograma za pisanje in branje RTC informacij preko skupnega I2C-vodila
' Vhodno/izhodna informacija je v spremenljivki Niz2 definirani kot:
' Dim DNIZI(1) As Byte
' tako da lahko preko spremenljivke y(x) pridemo do poljubnega bajta
' Format informacije je ddmmll uunn Ne

Wrtcsr:                                                     'Wrtcsr:   <------
       ' Iz spremenljivke Dniz v formatu "ddmmll uumm Ne" v RTC
       '                                  1...5...10....15

       ' Program verzija 2012
       ' v byte 16 zapišemo direktno letnico,
       ' v byte 5 (2 bita) pa leto Mod 4

       Reg14 = I : Push R14
       Reg14 = J : Push R14
       Reg14 = K : Push R14
       I = Dnizi(10) And &H0F                               ' minute
       Shift I , Left , 4
       J = Dnizi(11) And &H0F
       I = I + J
       I2cstart                                             ' Start sequence for I2CBUS
       I2cwbyte Wrtc                                        ' point address to write to PCF8583
       I2cwbyte 0                                           ' points to register 0
       I2cwbyte 0                                           ' set control register
       I2cwbyte 0                                           ' set hundreds
       I2cwbyte 0                                           ' set seconds
       I2cwbyte I                                           ' set minutes

       I = Dnizi(08) And &H0F                               ' ure
       Shift I , Left , 4
       J = Dnizi(09) And &H0F
       I = I + J
       I2cwbyte I                                           ' set hours

       I = Dnizi(1) And &H0F                                ' dan v mesecu
       Shift I , Left , 4
       J = Dnizi(2) And &H0F
       I = I + J
       J = Dnizi(5) And &H0F
       J = J * 10                                           'leto
       K = Dnizi(6) And &H0F
       J = J + K
       J = J Mod 4
       Shift J , Left , 6
       I = I Or J
       I2cwbyte I                                           ' dan in leto

       For I = 0 To 28 Step 2                               ' dan v tednu
           J = Lookup(i , Dnevi)
           Incr I
           K = Lookup(i , Dnevi)
           Decr I
           If J = Dnizi(13) And K = Dnizi(14) Then
              Exit For
           End If
       Next
       I = I / 4
       If I = 7 Then I = 6                                  ' če ni našel dneva!
       Shift I , Left , 1
       If Dnizi(3) = &H31 Then
          Incr I
       End If
       Shift I , Left , 4
       J = Dnizi(4) - &H30
       I = I Or J
       I2cwbyte I                                           ' dan v tednu in mesec
       I2cstop

    ' leto spravimo v dva polja, ker rtc šteje leta samo od 0 do 3, dodamo
    ' še en bajt, ki ga spravimo v eeprom rtc-a, da dobimo celo letnico

       I = Dnizi(5) - &H30                                  ' aditivna konstanta leta
       I = I * 10
       J = Dnizi(6) - &H30
       I = I + J
       ' I = I / 4   nič več količnik temveč cela leta
       I2cstart                                             ' Start sequence for I2CBUS
       I2cwbyte Wrtc                                        ' point address to write to PCF8583
       I2cwbyte 16                                          ' points to ram
       I2cwbyte I                                           ' year / 4                             '
       I2cstop
       Pop r14 : K = Reg14
       Pop r14 : J = Reg14
       Pop r14 : I = Reg14
Return

Rrtcsr:                                                     'Rrtcsr:   <-------------


                Push R14
    Reg14 = I : Push R14
    Reg14 = J : Push R14
    I2cstart                                                ' Start sequence for I2CBUS
    I2cwbyte Wrtc                                           ' point address to write to PCF8583
    I2cwbyte 2                                              ' point to register 2
    I2cstart                                                ' repeat start sequence for I2CBUS
    I2cwbyte Rrtc                                           ' point address to read
    I2crbyte I , 8                                          ' seconds and ignore
    I2crbyte I , 8                                          ' minutes



' V Dniz-u boste dobili rezultat recimo tako:
'       "051105 0811 So"
' '  x  1...5....0....5!
'       ddmmll uumm da
    Reg14 = I : Push R14
    I = I And &H0F
    I = I Or &H30
    Dnizi(12) = I
    pop r14 : i = reg14
    Shift I , Right , 4
    I = I And &H0F
    I = I Or &H30
    Dnizi(11) = I


    I2crbyte I , 8                                          ' hours
    Reg14 = I : Push R14
    I = I And &H0F
    I = I Or &H30
    Dnizi(10) = I
    pop r14 : i = reg14
    Shift I , Right , 4
    I = I And &H0F
    I = I Or &H30
    Dnizi(9) = I


    I2crbyte I , 8                                          ' year and day
    Reg14 = I : Push R14
    I = I And &H0F
    I = I Or &H30
    Dnizi(3) = I
    pop r14 : i = reg14
    Reg14 = I : Push R14
    Shift I , Right , 4
    I = I And &H03
    I = I Or &H30
    Dnizi(2) = I
    pop r14 : i = reg14
    Shift I , Right , 6
    Dnizi(7) = I                                            ' kasneje popravimo leta


    I2crbyte I , 9                                          ' week and month
    I2cstop
    Reg14 = I : Push R14
    I = I And &H0F
    I = I Or &H30
    Dnizi(5) = I
    pop r14 : i = reg14
    Reg14 = I : Push R14
    Shift I , Right , 4
    I = I And &H01
    I = I Or &H30
    Dnizi(4) = I
    pop r14 : i = reg14
    Shift I , Right , 5
    Shift I , Left , 2                                      'krat 4
' sledeči dve instrukciji opustimo, če želimo angleško verzijo dnevov tedna
    Incr I
    Incr I

    Dnizi(14) = Lookup(i , Dnevi)
    Incr I
    Dnizi(15) = Lookup(i , Dnevi)
    Dnizi(16) = 0                                           ' konec niza

    Dnizi(1) = &H20                                         'vstavimo blanko znake
    Dnizi(8) = &H20                                         'vstavimo blanko znake
    Dnizi(13) = &H20                                        ' Popravek za leto 4-številčno

    I2cstart
    I2cwbyte Wrtc
    I2cwbyte 16                                             ' point to ram
    I2cstart
    I2cwbyte Rrtc
    I2crbyte I , 9                                          ' beremo letnico
    I2cstop

    J = I
    I = I / 10
    Dnizi(6) = &H30 + I
    I = J Mod 10
    Dnizi(7) = &H30 + I
    I = J

    I2cstart
    I2cwbyte Wrtc
    I2cwbyte 5                                              ' point to ram
    I2cstart
    I2cwbyte Rrtc
    I2crbyte J , 9
    I2cstop

    Shift J , Right , 6
    I = I Mod 4
    If J <> I Then
       I2cstart
       I2cwbyte Wrtc
       I2cwbyte 16                                          ' point to ram
       I2cstart
       I2cwbyte Rrtc
       I2crbyte I , 9                                       ' beremo letnico
       I2cstop
    Incr I                                                  ' jo povečamo za ena
       I2cstart                                             '
       I2cwbyte Wrtc                                        ' in zapišemo nazaj
       I2cwbyte 16                                          '
       I2cwbyte I                                           '                           '
       I2cstop

      J = I
      I = I / 10
      Dnizi(6) = &H30 + I
      I = J Mod 10
      Dnizi(7) = &H30 + I
    End If

    Dnizi(1) = &H20                                         'vstavimo blanko znake
    Dnizi(8) = &H20                                         'vstavimo blanko znake
    Dnizi(13) = &H20

' V Dniz boste dobili rezultat recimo tako:
' Dniz = "051105 0811 So"
'         ddmmll uumm dt
    Dniz = Right(dniz , 14 )
' Dancas  llmmdd uumm dt

    Dancas = Mid(dniz , 5 , 2)
    Dancas = Dancas + Mid(dniz , 3 , 2)
    Dancas = Dancas + Left(dniz , 2)
    Dancas = Dancas + " "
    Dancas = Dancas + Mid(dniz , 8 , 8)


    pop r14 : j = reg14
    pop r14 : i = reg14
    pop r14

Return

Dnevi:
Data "SuNeMoPoTuToWeSrThCeFrPeSaSo"                         ' Dan v tednu

' -----------------------------RTC KONEC -------------------------------

Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Profesionalec


Pridružen/-a: Pon Jan 2004 11:54
Prispevkov: 805
Kraj: Ljubljana

PrispevekObjavljeno: Čet Jan 17, 2013 12:08 pm    Naslov sporočila: Odgovori s citatom

Pozabil sem povdariti, da na ta način RTC ne obvlada le leta 0,1,2, in 3, (kot je v datasheet-u) temveč vsa leta stoletja.
Podprograma uporabita še en bajt ERAMA v čipu RTC za zapis cele letnice.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Download Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group