Forum: Mikrocontroller und Digitale Elektronik PIC18F2320 mit PCF8563


von Frank B. (beatmatte)


Lesenswert?

Hallo zusammen,

im Rahmen meiner Bachelorarbeit soll als Teilaufgabe eine Echtzeituhr 
des Typs PCF8563 in Verbindung mit dem PIC 18F2320 zum Laufen gebracht 
werden. Versuchsaufbau ist schon komplett, Programm in PIC BASIC ist 
auch schon geschrieben, jedoch funktioniert die Uhr noch nicht richtig.
Mit dem von mir eingestellten Werten (also Stunden, Minuten, Sekunden 
etc) läuft die Uhr los. Beim Sprung von der 19. auf die 20. Sekunde wird 
jedoch komischerweise mein Wert für den Monat um 20 erhöht. Springt die 
Sekunde von 59 auf 0, dann steht der alte Wert wieder drin. Ähnlich 
verhält es sich mit den Stunden. Dort wird beim Sprung von der 39. auf 
die 40. Sekunde die Stunde um 40 erhöht, der alte Werte steht ebenfalls 
beim Wechsel von der 59. auf die 0. Sekunde wieder drin.
Die jeweiligen Werte für die Sekunden, Minuten etc. werden im BCD-Code 
in der Uhr gespeichert.
Anbei mal der Code in Pic Basic. Hoffe, es kann mir jemand helfen, der 
ein ähnliches Problem zumindest mit der Echtzeituhr schon hatte.
1
'Controllerkonfiguration für E/A
2
ADCON1 = 14         'PortA.1 bis PortA.3 digitale Ein- und Ausgänge
3
TrisB  = %11111100  'B.0 Ausgang für serielle Anzeige
4
                    'B.1 Taktausgang
5
                    'B.2 Ein- oder Ausgang durch I2CREAD/I2CWRITE festgelegt
6
7
'Definitionen
8
include "modedefs.bas"
9
10
'Variablendeklarationen
11
'Pindeklarationen
12
SCL VAR PortB.1     'PortB.1 Taktausgang I2C
13
SDA VAR PortB.2     'PortB.2 Datenausgang I2C
14
'Registeradressen für Uhr
15
reg_kontroll_status_1   con $00
16
reg_kontroll_status_2   con $01
17
reg_sekunde             CON $02
18
reg_minute              CON $03
19
reg_stunde              CON $04
20
reg_tag                 CON $05
21
reg_wochentag           con $06
22
reg_monat               CON $07
23
reg_jahr                con $08
24
reg_minuten_alarm       con $09
25
reg_stunden_alarm       con $0A
26
reg_tag_alarm           con $0B
27
reg_wochentag_alarm     con $0C
28
reg_takt                con $0d
29
'Slaveadressen
30
rtc_schreiben           CON $a2
31
rtc_lesen               CON $a2
32
'Zeitvariablen
33
sekunde_bcd             var byte
34
minute_bcd              var byte
35
stunde_bcd              var byte
36
tag_bcd                 var byte
37
wochentag_bcd           var byte
38
monat_bcd               var byte
39
jahr_bcd                var byte
40
sekunde                 var byte
41
minute                  var byte
42
stunde                  var byte
43
tag                     var byte
44
wochentag               var byte
45
monat                   var byte
46
jahr                    var byte
47
'Steuervariablen
48
kontroll_status_1       var byte
49
50
'Initialisierungen
51
'Uhrzeitinitialisierung
52
'stunde_bcd          = %00001001
53
'minute_bcd          = %00011000
54
'sekunde_bcd         = %00000000
55
'tag_bcd             = %00011001
56
'monat_bcd           = %00000101
57
'jahr_bcd            = %00001010
58
'kontroll_status_1   = %00000000
59
60
stunde          = 9
61
minute          = 26
62
sekunde         = 0
63
tag             = 19
64
monat           = 5
65
jahr            = 10
66
kontroll_status_1   = %00000000
67
68
'Hauptprogramm
69
Haupt:
70
gosub Dezimal_zu_BCD
71
'i2cwrite SDA, SCL, rtc_schreiben, reg_takt, %10000000    
72
'pause 10
73
'Schreiben des Datums und der Uhrzeit sowie Starten der Uhr über I2C
74
gosub Schreibe_Datum
75
'Zyklisches Lesen des Datums und der Uhrzeit über I2C
76
marke:
77
gosub Lese_Datum
78
gosub BCD_zu_Dezimal
79
80
include "LCD\lcd.bas"
81
pause 10
82
goto marke
83
GOTO Haupt
84
85
'----Unterprogramme-------------------------------------------------------------
86
'----Schreiben des Datums und der Uhrzeit über I2C------------------------------
87
Schreibe_Datum:
88
'Einstellung Stunden
89
i2cwrite SDA, SCL, rtc_schreiben, reg_stunde, [stunde_bcd]    
90
pause 10
91
'Einstellung Minuten
92
i2cwrite SDA, SCL, rtc_schreiben, reg_minute, [minute_bcd]    
93
pause 10
94
'Einstellung Sekunden
95
i2cwrite SDA, SCL, rtc_schreiben, reg_sekunde, [sekunde_bcd]  
96
pause 10
97
'Einstellung Tag
98
i2cwrite SDA, SCL, rtc_schreiben, reg_tag, [tag_bcd]  
99
pause 10
100
'Einstellung Monat
101
i2cwrite SDA, SCL, rtc_schreiben, reg_monat, [monat_bcd]    
102
pause 10
103
'Einstellung Jahr
104
i2cwrite SDA, SCL, rtc_schreiben, reg_jahr, [jahr_bcd]    
105
pause 10
106
'Uhr starten
107
i2cwrite SDA, SCL, rtc_schreiben, reg_kontroll_status_1, [kontroll_status_1]    
108
pause 10
109
return
110
111
'----Lesen des Datums und der Uhrzeit über I2C----------------------------------
112
Lese_Datum:
113
'Stunden lesen
114
i2cread SDA, SCL, rtc_lesen, reg_stunde, [stunde_bcd]         
115
pause 10
116
'Minuten lesen
117
i2cread SDA, SCL, rtc_lesen, reg_minute, [minute_bcd]         
118
pause 10
119
'Sekunden lesen
120
i2cread SDA, SCL, rtc_lesen, reg_sekunde, [sekunde_bcd]       
121
pause 10
122
'Tag lesen
123
i2cread SDA, SCL, rtc_lesen, reg_tag, [tag_bcd]       
124
pause 10
125
'Monat lesen
126
i2cread SDA, SCL, rtc_lesen, reg_monat, [monat_bcd]         
127
pause 10
128
'Jahr lesen
129
i2cread SDA, SCL, rtc_lesen, reg_jahr, [jahr_bcd]         
130
pause 10
131
return
132
133
'----Umwandlung von Dezimal zu BCD----------------------------------------------
134
Dezimal_zu_BCD:
135
stunde_bcd  = (stunde Dig 1) * $10 + (stunde dig 0)
136
minute_bcd  = (minute Dig 1) * $10 + (minute dig 0)
137
sekunde_bcd = (sekunde Dig 1) * $10 + (sekunde dig 0)
138
tag_bcd     = (tag Dig 1) * $10 + (tag dig 0)
139
monat_bcd   = (monat Dig 1) * $10 + (monat dig 0)
140
jahr_bcd    = (jahr Dig 1) * $10 + (jahr dig 0)
141
return
142
143
'----Umwandlung von BCD zu Dezimal----------------------------------------------
144
BCD_zu_Dezimal:
145
stunde  = ((stunde_bcd >> 4) * 10) + (stunde_bcd & $f)
146
minute  = ((minute_bcd >> 4) * 10) + (minute_bcd & $f)
147
sekunde = ((sekunde_bcd >> 4) * 10) + (sekunde_bcd & $f)
148
tag     = ((tag_bcd >> 4) * 10) + (tag_bcd & $f)
149
monat  = ((monat_bcd >> 4) * 10) + (monat_bcd & $f)
150
jahr   = ((jahr_bcd >> 4) * 10) + (jahr_bcd & $f)
151
return

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.