|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Ned Jan 13, 2013 12:04 pm Naslov sporočila: Podprograma za preprosto pisanje in branje RTC PCF8583 |
|
|
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:
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:
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 |
|
|
vilko Profesionalec
Pridružen/-a: Pon Jan 2004 11:54 Prispevkov: 807 Kraj: Ljubljana
|
Objavljeno: Čet Jan 17, 2013 12:08 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|