PCF8583 Demo Code

Onderstaand programmaatje is geschreven voor de 18F25K22 in Proton Basic.
Het programma kijkt eerst of de PCF8583 “leeg” is.
Als dit zo is wordt “Do 28 Feb 2012 23:59:55” als start tijd gebruikt.
Verder blijft de klok “oneindig” doorlopen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
'****************************************************************
'*  Name    : PCF8583.BAS                                       *
'*  Author  : H. Zeeman                                         *
'*  Notice  : Copyright (c) 2012 Knutselaar.eu                  *
'*          : All Rights Reserved                               *
'*  Date    : mrt/23/2012                                       *
'*  Version : 1.0                                               *
'*  Notes   : Demo programma voor de PCF8583                    *
'*          : Voor 16 x 2 LCD met Proton default aanstluiting   *
'****************************************************************
;Device 18F25K20
Device 18F25K22
                                                               
CONFIG_START                                                    
     ;FOSC = HS           ;external oscillator For 18F25K20
     FOSC = HSMP                 ;external oscillator for 18F25K22
     ;FOSC = INTIO67             ;Internal oscillator block, port function on RA6 and RA7  
     FCMEN = Off                   ;Fail-Safe Clock Monitor disabled
     IESO = Off           ;internal external switchover mode
     ;PWRT = On           ;power-up timer For 18F25K20
     PWRTEN = On                   ;power-up timer For 18F25K22
     BOREN = On                   ;brown-out reset
     ;BORV = 27                   ;brown-out reset value (2,7V) For 18F25K20
     BORV = 285                   ;brown-out reset value (2,85V) for 18F25K22
     WDTEN = Off                  ;watchdog timer
     WDTPS = 128                  ;1:128 WDT prescalar
     PBADEN = Off                 ;analog port B<4:0>
     STVREN = On                  ;stack overflow reset
     LVP = Off                    ;low voltage programming
     XINST = Off                  ;Instruction set extension and Indexed Addressing mode disabled (Legacy mode)
     Debug = Off                  ;no debug
     ;CCP2MX = PORTBE             ;CCP2 input/output is multiplexed with RB3 For 18F25K20
     ;CCP2MX = PORTB3             ;CCP2 input/output is multiplexed with RB3 For 18F25K22
CONFIG_END

    XTAL 8
   
    ;ALL_DIGITAL TRUE            ;Werkt bij mij niet voor de 18F25K22 (moet met ANSELx)

    ANSELC = %00100111           ;Voor 18F25K22 Poort C RX,TX,SCL en SDA digitaal maken
    ANSELA = %11011111           ;Voor 18F25K22 Poort A5 (LED) digitaal maken

    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 Speaker     = PORTC.0
    Symbol LED         = PORTA.5
   
    Sound Speaker , [115,20]
   
    Cls
   
    Print At 1,1, "Knutselaar.eu"
   
    DelayMS 2000
   
    GoSub getTime
    If hrs = 0 And YearDays = 1 And WeekDayMonths = 1 Then ;reset status van de PCF8583. (PCF8583 is leeg)
        GoSub setTime                                      ;Stelt klok op "Do 28 Feb 2012  23:59:55" in.
    End If              
                                                                             
                                                                           
                                                                           
Loop:
    GoSub getTime
   
    Print At 1 , 1, Str WeekdagString, " ", DEC2 Dag," ",Str MaandString," ", DEC4 Jaar, "  "
    Print At 2 , 1 , @Uren, ":", DEC2 Minuten, ":", DEC2 Seconden, " "
   
    DelayMS 100
   
    Toggle LED
     
    GoTo Loop
   
   
getTime:
   
    HBusIn %10100000, $02, [secs, mins, hrs,YearDays,WeekDayMonths] ;haal tijd op vanuit de PCF8583
    HBusIn %10100000, $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 %10100000, $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 %10100000, $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"
    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 = 55          ;Waarden voor "Do 28 Feb 2012  23:59:55" (testen schrikkeldag)
    Minuten = 59
    Uren = 23
    Dag = 28
    Maand = 2
    Jaar = 2012
    Weekdag = 4           ; Donderdag                                              

    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 %10100000, $02, [ secs,mins,hrs, YearDays,WeekDayMonths ]
    HBusOut %10100000, $10, [ JaarDev4 ]
Return

Meer demo’s:
Demo code 1 Knops wekker(PCF8583).


Hit Counter by Digits