PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programmierung des PCF8583



tooltime
23.03.2005, 13:01
Hallo an alle,

ich spiele mich gerade mit einem Atmel Mega8515 und dem Uhr Clock-IC PCF8583.
Das schreiben und anschließende auslesen der Uhrzeit funktioniert einwandfrei. Jetzt würde ich gerne den Timer des 8583 programmieren und komme irgendwie garnicht zu schuß.
Daher meine Fragen:

- Kann ich eingentlich den 8583 als Uhr und Timer gleichzeitig verwenden?
- Was schreibe ich in die Register 07 bis 0F um z.B. nach 1 Std. den Timer auszulösen?
- Wie lange ist dann der INT-Ausgang aktiv?

Vielen Dank für eure Antworten

LuK-AS
23.03.2005, 19:58
Kannst Du mal den Code posten, würde gerne auch mal mit meinem PCF8583 rumspielen, habs aber noch net kapiert :(

Gruss Clemens

tooltime
23.03.2005, 21:33
So sieht im Moment das Programm für die Uhrzeit aus.
Funktioniert eigentlich ganz gut. Fehlt halt nur noch der Timer!

Wenn das Programm funktioniert, werde ich es natürlich auch veröffentlichen!!!


' -----[ Initialisierung ]------------------------------------------------------
$regfile = "8515DEF.dat" ' Chip auswählen
$crystal = 7372800 ' Quarzfrequenz festlegen

Config Sda = Portd.0 ' I2C-Port festlegen
Config Scl = Portd.1 ' I2C-Port festlegen

Config Lcdmode = Port
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
Config Lcd = 16 * 2 ' LCD-Typ festlegen
Cursor = Off ' Cursor ausschalten

Dim S As Byte , M As Byte , H As Byte , D As Byte
Dim Wm As Byte , Yd As Byte , Month As Byte ' Uhrvariablen

S = 0
M = 0
H = 0
D = 1
Month = 1
Wm = 1
Yd = 5

Ddrd = &B00010000

Cls

Settime:

S = Makebcd(s) 'Sekunden
M = Makebcd(m) 'Minuten
H = Makebcd(h) 'Stunden
D = Makebcd(d) 'Tag
Month = Makebcd(month) 'Monat

I2cstart 'I2C Start
I2cwbyte &HA0 'Schreibemodus
I2cwbyte 0 'select control register
I2cwbyte &HC 'set year and day bit for masking
I2cstop 'I2C Stop

I2cstart 'I2C Start
I2cwbyte &HA0 'Schreibemodus
I2cwbyte &H2 'Sekunden-Register auswählen
I2cwbyte S 'Sekunden schreiben
I2cwbyte M 'Minuten schreiben
I2cwbyte H 'Stunden schreiben
I2cwbyte D 'Tag schreiben
I2cwbyte Month 'Monat schreiben
I2cstop 'I2C Stop


'????????????????????????????????????????????????? ??????????????????????????????

I2cstart 'I2C Start
I2cwbyte &HA0 'Schreibemodus
I2cwbyte 8 'Alarm-Register auswählen
I2cwbyte &H4B '01001011 schicken

'hier sollte der Timer stehen

I2cstop 'I2C Stop

'????????????????????????????????????????????????? ??????????????????????????????


Gettime:

I2cstart 'I2C Start
I2cwbyte &HA0 'Schreibemodus
I2cwbyte 2 'Sekunden-Register auswählen
I2cstart 'I2C Start
I2cwbyte &HA1 'Lesemodus
I2crbyte S , Ack 'lese Sekunden
I2crbyte M , Ack 'lese Minuten
I2crbyte H , Ack 'lese Stunden
I2crbyte Yd , Ack 'lese Jahr und Tag
I2crbyte Wm , Nack 'lese Wochentag und Monat
I2cstop 'I2C Stop

S = Makedec(s)
M = Makedec(m)
H = Makedec(h)

If H >= 10 Then
Locate 1 , 5 : Lcd H
Else
Locate 1 , 5 : Lcd " " ; H
End If

Locate 1 , 7 : Lcd ":"

If M >= 10 Then
Locate 1 , 8 : Lcd M
Else
Locate 1 , 8 : Lcd "0" ; H
End If

Locate 1 , 10 : Lcd ":"

If S >= 10 Then
Locate 1 , 11 : Lcd S
Else
Locate 1 , 11 : Lcd "0" ; S
End If

If Pind.6 = 0 Then 'An Pind.6, der an INT des PCF8583 angeschlossen ist,
Portd = &B00010000 'soll eine LED leuchten, wenn der Timer abgelaufen ist
Else
Portd = &B00000000
End If

Goto Gettime

tooltime
29.03.2005, 09:49
Gibt es wirklich niemanden der bereits den Timer des PCF 8583 progammiert hat?

IngBo
29.03.2005, 15:16
hi tooltime,

ja das kannst du machen, indem du folgendes machst:
-> Reg 0x00 mit 0x84 beschreiben
-Alarm Enable
-32,768 kHz
-Stop counting (Uhr muss zuerst gestoppt werden)

-> Reg 0x01 bis 0x07 beschreiben
- Zeit schreiben 0x01..0x06
- Timer zurücksetzen Reg 0x07 mit 0x00 beschreiben

-> Reg 0x08 mit 0x0B
- Timer ON -- Minutes (99 Minuten)
- Timer Int. Enable

-> Reg 0x00 mit 0x04 beschreiben
- Alarm Enable
- 32,768 kHz
- Start Counting (Uhr/Timer läuft)

Timer-Flag muss per Software zurückgesetzt werden!!



folgend ein Bildausschnitt vom RS232-I2C-Adapter Software, da kannst du sehen wie die Register beschreiben sind:

IngBo
29.03.2005, 15:25
hallo,

in ein paar Tage kann die Software von meiner HomePage downgeloadet werden. Es ist eignetlich für den RS232-I2C-Adapter gedacht, aber damit kannst du auch die Inhalte der Register berechnen.


IngBo

edgar
01.04.2005, 09:04
is ja ne ganz nette uhr aber was macht das ding bei stromausfall bzw. wie kann man dafür sorgen dass die uhr weiter läuft und der speicher erhalten bleibt.
vielleicht weiß auch jemand einen anderen ic als alternative?
gruß werner...

IngBo
01.04.2005, 11:48
ich hoffe, mein googlen hilft dir weiter!!!

tooltime
07.04.2005, 12:11
Hallo IngBo,

danke für die Tips.
In welches Register schreibe ich aber jetzt die Minuten oder Stunden für den Timer?

Der Schwede
08.04.2005, 07:50
Hallo,
ich hab da auch mal eine Frage. Ich will den PCF8583 als Event-Counter benutzen - über Reflex-Lichtschranke die Umdrehungen einer Welle zählen. Ein Puls-Pausen-Verhältnis von 50-50% scheint nicht zu funktionieren. Weiss jemand wie ich das Eingangssignal aufbereiten muss?
Gruss Uwe

IngBo
08.04.2005, 16:39
Hi,

Register 0x07 (Timerinhalt) wird immer um 1 erhöht. je nachdem was du eingestellt hast. wenn
1. 1/100 --> wird bei 1/100 Sec. um 1 erhöht
2. Sec --> wird bei sekunden-takt um 1 erhöht
3. Min. --> wird bei Minuten-Takt um 1 erhöht
4. hrs --> wird bei Stunden-Takt um 1 erhöht.
5. Days --> wird jeden Tag um 1 erhöht
Diese werden in den ersten 3 Bits von Register 0x08 eingestellt.

wenn der Inhalt des Registers 0x07 von 99 auf 0 zurückgeht, wird das Flagbit Bit0 des Registers 0x00 auf 1 gesetzt. Das muss dann per Software gelöscht werden. Wenn das Timer-En-Bit gesetzt ist, dann wird ein Int. ausgelöst. Timer Enable Bit findest du in Register 0x08 bit3.


IngBo

IngBo
09.04.2005, 13:57
Hallo,

wie versprochen, die Software kann jetzt downgeloadet werden
http://www.channaa.com/html/rs232_i2c_adapter.html

damit kannst du die Registerinhalte des PCF8583 berechnen.
natürlich auch andere I2C-ICs


IngBo

Roberto
23.01.2006, 11:08
Hallo

Ich hätte dazu ein paar Fragen zur Programmierung von dem PCF8583
(Sind meine ersten Versuche mit i2c )

Habe jetzt den PCF8583 angeschlossen und mit dem Programm von Tooltime probiert.
Nachdem ich herrausgefunden habe, dass ich noch zwei Widerstände für die Datenleitungen brauche ;-), funktioniert es jetzt :-)

Nur möchte ich es jetzt auch verstehen..

Mir ist jetzt noch nicht ganz klar, wie das ansprechen von dem PCF.. jetzt wirklich funktioniert.
Mein Ziel ist eine normale Uhr mit Datum für das Loggen von Daten dann in ein EEprom.

Datenplatt von dem PCF8583 habe ich jetzt auch, aber wegen schlechtem englisch, blicke ich da nicht ganz durch.

Wenn Tooltime schreibt:


I2cstart 'I2C Start
I2cwbyte &HA0 'Schreibemodus
I2cwbyte 0 'select control register
I2cwbyte &HC 'set year and day bit for masking


Was passiert da eigentlich ?

I2cwbyte... ist Schreiben am I2C Bus (I2crbyte 0 lesen)
&HA0 = A0= 10100000
Das dürfte die Adresse von dem PCF8583 am Bus sein ?!
(Wobei 10100000 (A0) schreiben und 10100001 (A1) lesen sein dürfte ?!)

Nur was jetzt kommt, ist mir nicht klar:
I2cwbyte 0 'select control register
I2cwbyte &HC 'set year and day bit for masking


Genauso wie beim auslesen .
Was geschiet hier ?
Sehe zwar die Register im Datenblatt, aber wie komme ich dort hin ?
Da habe ich Register 0,4,5,6,8

Ist jemand vielleicht so lieb und kan mir das ein bisschen erklären ?

:-)

l.G. Roberto

Roberto
24.01.2006, 21:43
Hallo
Hat keiner einen Tip für mich ?

tooltime
30.01.2006, 12:21
Sorry, dass so lange keine Antwort kam.
Ich werde mir diese Woche noch einmal die Unterlagen zu dem damaligem Projekt raussuchen.
Ich hoffe dir dann auch weiterhelfen zu können, denn einige Abläufe des PCF8583 sind mir heute noch ein Rätsel.

Bitte hab noch etwas Geduld
tooltime

Roberto
05.02.2006, 13:22
Hallo Tooltime

Häte schon noch interesse :-)
Aber für mich ist derzeit eher nur die normale Uhr funktion wichtig.

Mir ist noch nicht ganz klar:
Auf Seite 7 im Datenblatt (links)
http://www.semiconductors.philips.com/acrobat_download/datasheets/PCF8583_5.pdf
Ist der Clock mode dargestellt.
(Register 0 habe dafür auf 00000000 gestellt)

Ist die Spalte da in 2*BCD aufgeteilt ?
links 10s, rechts 1s ?

Und mit
I2crbyte S , Ack
S = Makedec(s)
lese ich dann die rechten BCD's aus?

Kann man auch das Jahr irgendwie auslesen ?

Im Register 05 (Seite7)
steht da : Year/date
unterhalb aber 10 month /1 month ?
?

tooltime
08.02.2006, 21:20
Hallo Roberto,
ich habe gerade ein kleines Programm zusammengebastelt.
Wenn Du einen Mega 8 µC hast, kannst Du das Programm 1 zu 1 übernehmen und ein bischen experimentieren.

Gruß
tooltime


' ---------[ Initialisierung ]--------
$regfile = "m8def.dat" ' Chip auswählen
$crystal = 1000000 ' Quarzfrequenz festlegen
Config Scl = Portc.5 ' I2C-Clock festlegen
Config Sda = Portc.4 ' I2C-Data festlegen
Config Lcdmode = Port
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2 ' LCD-Typ festlegen
Cursor = Off ' Cursor ausschalten
Cls

Dim S As Byte , M As Byte , H As Byte , D As Byte , Month As Byte
Dim Wm As Byte , Yd As Byte


'-----[ Hauptprogramm ]----------------------------------------

Wm = 3
D = 8
Month = 2
Yd = 1
H = 22
M = 00
S = 00

Settime:
'values are stored as BCD values so convert the values first
S = Makebcd(s) 'seconds
M = Makebcd(m) 'minuts
H = Makebcd(h) 'hours
D = Makebcd(d) 'days
Month = Makebcd(month) 'months
Yd = Makebcd(yd) 'seconds
Wm = Makebcd(wm) 'minuts

I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte 0 'select control register
I2cwbyte 8 'set year and day bit for masking
I2cstop 'generate stop

I2cstart 'generate start
I2cwbyte &HA0 'write mode
I2cwbyte 2 'select seconds Register
I2cwbyte S 'write seconds
I2cwbyte M 'write minuts
I2cwbyte H 'write hours
I2cwbyte Yd 'write jear
I2cwbyte D 'write day
I2cwbyte Wm 'wirte weekday
I2cwbyte Month 'write month
I2cstop 'generate stop

Goto Gettime


Gettime:
I2cstart 'generate start
I2cwbyte &HA0 'write addres
I2cwbyte 2 'select second register
I2cstart 'generate repeated start
I2cwbyte &HA1 'write address for reading
I2crbyte S , Ack 'read seconds
I2crbyte M , Ack 'read minuts
I2crbyte H , Ack 'read hours
I2crbyte Yd , Ack 'read year
I2crbyte D , Ack 'read day
I2crbyte Wm , Ack 'read weekday
I2crbyte Month , Nack 'read month

I2cstop 'generate stop

Goto Zeit


Zeit:

S = Makedec(s)
M = Makedec(m)
H = Makedec(h)
Yd = Makedec(yd)
D = Makedec(d)
Wm = Makedec(wm)
Month = Makedec(month)

If H >= 10 Then
Locate 1 , 1 : Lcd H
Else
Locate 1 , 1 : Lcd " " ; H
End If

Locate 1 , 3 : Lcd ":"

If M >= 10 Then
Locate 1 , 4 : Lcd M
Else
Locate 1 , 4 : Lcd "0" ; M
End If

Locate 1 , 6 : Lcd ":"

If S >= 10 Then
Locate 1 , 7 : Lcd S
Else
Locate 1 , 7 : Lcd "0" ; S
End If

Locate 2 , 1 : Lcd D ; "." ; Month ; "." ; Yd ; " " ; Wm

Waitms 100

Goto Gettime

Roberto
08.02.2006, 21:59
Hallo tooltime

Danke dafür :-)

Werde es in den nächsten Tagen mal ausprobieren..

Wambly
21.03.2008, 20:24
Scheint bei Euch schon 2Y zu laufen?

Hallo tooltime
Danke auch dafür, nur LCD Quarz + m88 angepasst (nach montage der i2c pullup) läuft suuuuppper!!!!!! :-)

Jahr geht nur 0.1.2.3 ist für Schaltjahrberechnung. Notfalls eine Speicherzelle für 0-256 opfern. Wenn der yP im Jahr 2256 noch läuft, muss ein Softwareupdate einen Offset dazuzählen oder auf 16bit erweitern für die "Ewigkeit" ;-)

Teste syncronität mit 5V und 2pF seit ca. 30Minuten, noch ziemlich syncron(<1sec). Morgen werd ich dann die Initalisierung rausnehmen um auch die Sync auf CR2032 zu testen.

Gute Nacht Wambly