Schema: RTC PCF8583 op een IC

Onderstaande code controleert of de RTC leeg is , indien ja word deze ingesteld op de waarde die bij SETTIME staan, zo niet kun je dit doen door eerst een verwijzing te maken naar SETTIME.

Dim Minuten As Byte ; minuten (decimaal)
Dim Seconden As Byte ; seconden (decimaal)
Dim Uren As Byte ; uren (decimaal
Dim Dag As Byte ; datum v/d maand (decimaal
Dim Maand As Byte ; maand (decimaal)
Dim JaarVier As Byte ; jaar zoals in PCF8583 (hoogste 2 bits in YearDays)
Dim Jaar As Word ; jaar
Dim Weekdag As Byte

Dim WeekdagString[2] As Byte
Dim MaandString[3] As Byte

;Het jaar wordt in de PCF8385 alleen bijgehouden in een vier
;jaars tijdvak (0 tot 3) waarbij 0 het schrikkeljaar is.
;De software waarin de PCF8385 opgenomen is moet zelf een
;variable bijhouden waaruit het uiteindelijke jaar berekend kan worden.
;In dit voorbeeld wordt daar JaarDev4 voor gebruikt. JaarDev4
;moet met 1 verhoogd worden wanneer het jaar in de PCF8583
;van 3 naar 0 verandert.
Dim YearDays As Byte ;bit 0 tot 3 voor dag eenheden, bit 4
;en 5 voor dag tientallen (0-3), bit 6 en 7 jaar (0-3).
Dim WeekDayMonths As Byte ;bit 0 tot 3 voor maand eenheden, bit 4 voor maand
;tientallen (0-1), bit 5 tot 7 weekdagen (0-6).
Dim secs As Byte ;bit 0 tot 3 voor seconden eenheden, bit 4 tot 6
;voor seconden tientallen (0-5), bit 7 niet gebruikt.
Dim mins As Byte ;bit 0 tot 3 voor minuten eenheden, bit 4 tot 6
;voor minuten tientallen (0-5), bit 7 niet gebruikt.
Dim hrs As Byte ;bit 0 t0t 3 voor uren eenheden, bit 4 en 5
;voor uren tientallen (0-2), bit 6 0=AM 1=PM , bit 7 0=24
;uur mode, 1=12 uur mode(AM/PM).
Dim JaarDev4 As Byte ;hoogste 7 bits = jaar - 2000 gedeeld door 4
;(wordt niet door PCF8583 geupdate), laagste bit is jaar3 flag
Dim jaar3 As Byte ;flag om de jaar overgang van 3 naar 0
;(schrikkeljaar)te kunnen detecteren voor update van JaarDev4
Dim dummy As Byte ;hulp variable.


Symbol PCF8583r = $A0 ;Adres om PCF8583 uit te lezen (r = read)
Symbol PCF8583w = $A1 ;Adres om naar PCF8583 te schrijven (w = write)
Symbol PCF8574A_ADDR =$70 ;$70 is schrijf $71 is lezen

Clear
DelayMS 200 'stabilizza LCD
Cls

If hrs = 0 And YearDays = 1 And WeekDayMonths = 1 Then ;reset status van de PCF8583. (PCF8583 is leeg)
GoSub setTime ;Stelt klok in
End If
GoSub getTime

Loop:
GoSub WerkingIC
GoSub getTime

Print At 1 , 1, Str WeekdagString, " ", Dec2 Dag," ",Str MaandString," ", Dec4 Jaar, " "
Print At 2 , 1 , @Uren, ":", Dec2 Minuten, ":", Dec2 Seconden, " "
Print At 3,5,Dec Weekdag

DelayMS 100

GoTo Loop

getTime:
HBusIn PCF8583r, $02, [secs, mins, hrs,YearDays,WeekDayMonths] ;haal tijd op vanuit de PCF8583
HBusIn PCF8583r, $10, [ JaarDev4 , jaar3] ;haal jaar op (-2000 / 4)

Seconden = ((secs >> 4) * 10) + (secs & 15) ;zie proton help "Math Operators"
Minuten = ((mins >> 4) * 10) + (mins & 15)
Uren = ((hrs >> 4) * 10) + (hrs & 15)
Dag = (((YearDays >> 4 ) & 3 ) * 10) + (YearDays & 15)
Maand = (((WeekDayMonths >> 4) & 1 ) * 10) + (WeekDayMonths & 15)
JaarVier = (YearDays >> 6)
Weekdag = (WeekDayMonths >> 5)

Jaar = 2000 + JaarVier + (JaarDev4*4)

If JaarVier = 3 Then ;Twee if statements om JaarDev4 eens in de 4 jaar te verhogen
jaar3 = 1 ;Bij overgang naar schrikkeljaar
HBusOut PCF8583w, $11, [ jaar3 ]
End If

If JaarVier = 0 And jaar3 = 1 Then ; omslag naar jaar 0 (schrikkeljaar)
jaar3 = 0
JaarDev4 = JaarDev4 + 1 ; JaarDev ophogen met 1
HBusOut PCF8583w, $10, [ JaarDev4, jaar3 ]
End If

Select Case Weekdag
Case 0
Str WeekdagString = "Zo"
Case 1
Str WeekdagString = "Ma"
Case 2
Str WeekdagString = "Di"
Case 3
Str WeekdagString = "Wo"
Case 4
Str WeekdagString = "Do"
Case 5
Str WeekdagString = "Vr"
Case 6
Str WeekdagString = "Za"
Case 7
Str WeekdagString = "Zo"
End Select

Select Case Maand
Case 1
Str MaandString = "Jan"
Case 2
Str MaandString = "Feb"
Case 3
Str MaandString = "Mar"
Case 4
Str MaandString = "Apr"
Case 5
Str MaandString = "Mei"
Case 6
Str MaandString = "Jun"
Case 7
Str MaandString = "Jul"
Case 8
Str MaandString = "Aug"
Case 9
Str MaandString = "Sep"
Case 10
Str MaandString = "Okt"
Case 11
Str MaandString = "Nov"
Case 12
Str MaandString = "Dec"
End Select
Return

setTime: ;Wordt in dit voorbeeld alleen gebruikt om lege PCF8583 te vullen

Seconden = 00 ;Waarden voor "Do 28 Feb 2012 23:59:55" (testen schrikkeldag)
Minuten = 10
Uren = 9
Dag = 23
Maand = 2
Jaar = 2014
Weekdag = 7 ; Zondag

dummy=Seconden/10 ;dummy is tientallen van Seconden
dummy=dummy*16 ;waarde doorschuiven naar de vier MSB
secs=Seconden//10 ;secs is eenheden van Seconden
secs=secs | dummy ;Bitwise OR combineert beide waarden in een byte

dummy=Minuten/10
dummy=dummy*16
mins=Minuten//10
mins=mins | dummy

dummy=Uren/10
dummy=dummy*16
hrs=Uren//10
hrs=hrs | dummy

JaarVier = (Jaar - 2000) // 4 'rest van Jaar-2000 gedeelt door 4
YearDays = (JaarVier << 6) + ((Dag / 10) << 4) + (Dag // 10)
JaarDev4 = ((Jaar - 2000) / 4) ;Integer van Jaar-2000 gedeeld door 4

WeekDayMonths = (Weekdag << 5) + ((Maand/10) << 4) + (Maand //10)

HBusOut PCF8583w, $02, [ secs,mins,hrs, YearDays,WeekDayMonths ]
HBusOut PCF8583w, $10, [ JaarDev4 ]
Return

Ingestuurd door: pascalbianca

Een reactie achterlaten

Your email address will not be published.