mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC18F2320 mit PCF8563


Autor: Frank Breitbarth (beatmatte)
Datum:

Bewertung
0 lesenswert
nicht 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.
'Controllerkonfiguration für E/A
ADCON1 = 14         'PortA.1 bis PortA.3 digitale Ein- und Ausgänge
TrisB  = %11111100  'B.0 Ausgang für serielle Anzeige
                    'B.1 Taktausgang
                    'B.2 Ein- oder Ausgang durch I2CREAD/I2CWRITE festgelegt

'Definitionen
include "modedefs.bas"

'Variablendeklarationen
'Pindeklarationen
SCL VAR PortB.1     'PortB.1 Taktausgang I2C
SDA VAR PortB.2     'PortB.2 Datenausgang I2C
'Registeradressen für Uhr
reg_kontroll_status_1   con $00
reg_kontroll_status_2   con $01
reg_sekunde             CON $02
reg_minute              CON $03
reg_stunde              CON $04
reg_tag                 CON $05
reg_wochentag           con $06
reg_monat               CON $07
reg_jahr                con $08
reg_minuten_alarm       con $09
reg_stunden_alarm       con $0A
reg_tag_alarm           con $0B
reg_wochentag_alarm     con $0C
reg_takt                con $0d
'Slaveadressen
rtc_schreiben           CON $a2
rtc_lesen               CON $a2
'Zeitvariablen
sekunde_bcd             var byte
minute_bcd              var byte
stunde_bcd              var byte
tag_bcd                 var byte
wochentag_bcd           var byte
monat_bcd               var byte
jahr_bcd                var byte
sekunde                 var byte
minute                  var byte
stunde                  var byte
tag                     var byte
wochentag               var byte
monat                   var byte
jahr                    var byte
'Steuervariablen
kontroll_status_1       var byte

'Initialisierungen
'Uhrzeitinitialisierung
'stunde_bcd          = %00001001
'minute_bcd          = %00011000
'sekunde_bcd         = %00000000
'tag_bcd             = %00011001
'monat_bcd           = %00000101
'jahr_bcd            = %00001010
'kontroll_status_1   = %00000000

stunde          = 9
minute          = 26
sekunde         = 0
tag             = 19
monat           = 5
jahr            = 10
kontroll_status_1   = %00000000

'Hauptprogramm
Haupt:
gosub Dezimal_zu_BCD
'i2cwrite SDA, SCL, rtc_schreiben, reg_takt, %10000000    
'pause 10
'Schreiben des Datums und der Uhrzeit sowie Starten der Uhr über I2C
gosub Schreibe_Datum
'Zyklisches Lesen des Datums und der Uhrzeit über I2C
marke:
gosub Lese_Datum
gosub BCD_zu_Dezimal

include "LCD\lcd.bas"
pause 10
goto marke
GOTO Haupt

'----Unterprogramme-------------------------------------------------------------
'----Schreiben des Datums und der Uhrzeit über I2C------------------------------
Schreibe_Datum:
'Einstellung Stunden
i2cwrite SDA, SCL, rtc_schreiben, reg_stunde, [stunde_bcd]    
pause 10
'Einstellung Minuten
i2cwrite SDA, SCL, rtc_schreiben, reg_minute, [minute_bcd]    
pause 10
'Einstellung Sekunden
i2cwrite SDA, SCL, rtc_schreiben, reg_sekunde, [sekunde_bcd]  
pause 10
'Einstellung Tag
i2cwrite SDA, SCL, rtc_schreiben, reg_tag, [tag_bcd]  
pause 10
'Einstellung Monat
i2cwrite SDA, SCL, rtc_schreiben, reg_monat, [monat_bcd]    
pause 10
'Einstellung Jahr
i2cwrite SDA, SCL, rtc_schreiben, reg_jahr, [jahr_bcd]    
pause 10
'Uhr starten
i2cwrite SDA, SCL, rtc_schreiben, reg_kontroll_status_1, [kontroll_status_1]    
pause 10
return

'----Lesen des Datums und der Uhrzeit über I2C----------------------------------
Lese_Datum:
'Stunden lesen
i2cread SDA, SCL, rtc_lesen, reg_stunde, [stunde_bcd]         
pause 10
'Minuten lesen
i2cread SDA, SCL, rtc_lesen, reg_minute, [minute_bcd]         
pause 10
'Sekunden lesen
i2cread SDA, SCL, rtc_lesen, reg_sekunde, [sekunde_bcd]       
pause 10
'Tag lesen
i2cread SDA, SCL, rtc_lesen, reg_tag, [tag_bcd]       
pause 10
'Monat lesen
i2cread SDA, SCL, rtc_lesen, reg_monat, [monat_bcd]         
pause 10
'Jahr lesen
i2cread SDA, SCL, rtc_lesen, reg_jahr, [jahr_bcd]         
pause 10
return

'----Umwandlung von Dezimal zu BCD----------------------------------------------
Dezimal_zu_BCD:
stunde_bcd  = (stunde Dig 1) * $10 + (stunde dig 0)
minute_bcd  = (minute Dig 1) * $10 + (minute dig 0)
sekunde_bcd = (sekunde Dig 1) * $10 + (sekunde dig 0)
tag_bcd     = (tag Dig 1) * $10 + (tag dig 0)
monat_bcd   = (monat Dig 1) * $10 + (monat dig 0)
jahr_bcd    = (jahr Dig 1) * $10 + (jahr dig 0)
return

'----Umwandlung von BCD zu Dezimal----------------------------------------------
BCD_zu_Dezimal:
stunde  = ((stunde_bcd >> 4) * 10) + (stunde_bcd & $f)
minute  = ((minute_bcd >> 4) * 10) + (minute_bcd & $f)
sekunde = ((sekunde_bcd >> 4) * 10) + (sekunde_bcd & $f)
tag     = ((tag_bcd >> 4) * 10) + (tag_bcd & $f)
monat  = ((monat_bcd >> 4) * 10) + (monat_bcd & $f)
jahr   = ((jahr_bcd >> 4) * 10) + (jahr_bcd & $f)
return

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.