
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
Hallo Michael, Mit den PCF8583 RTC habe ich auch viel zeit gebraucht bis es endlich klappte... Dein RTC-modul mit Goldcap kenne ich nicht...ich habe meine eigene hardware mit lithiumzellen pufferung gebaut, aber es ist sicher Ă€nlich. Der PCF8583 hĂ€ngt an das I2C Bus, und da ist noch ein LCD modul zur anzeige an die dafĂŒr vorgesehene ports. Achtung ! das LCD Backlight liegt nicht am C-Control gewohnten port ! Hiermit schicke ich dir ein programm dass dieses baustein per DCF einstellt und dann die Werte zurĂŒckliest und auf das LCD Display wiedergibt. Entschuldige dass der text und variablen auf Französich sind, fĂŒr mich war es so leichter. Verzeihe mir bitte deshalb auch die rechtschreibefehler auf deutsch. Das programm ist auch sicher etwas primitiv und nicht optimal und speicherschonend geschrieben, aber vielleicht ist es so auch verstĂ€ndlicher. Ich bin noch nicht lange am C-Control dran, also kein profi. Programmbeschreibung: Zuerst wartet das programm auf die DCF synchro Dann ladet er die zeit/datum werte im speicher des RTC (mit minute=minute+1) Er berĂŒcksichtigt die ???Jahre (annĂ©e bisextile...wie sagt man das auf deutsch ?) Achtung, beim RTC ist die wochentagsnumerierung ist nicht das gleiche wie bei C-control...es wird also umgerechnet Dann wartet er noch die nĂ€chste minute um das RTC zu starten (minute+1) Dann liest er laufend uhr und datum un zeigt es per LCD display an wobei das led blinkt Die gelesene daten werden auch ĂŒber das RS-232 zum hyperterminal geschickt wobei die erste freie RAM speicherzelle als beispiel mit ein wert beschrieben und gelesen wird Schreib mir bitte zurĂŒck wenn du nicht klar kommst Hum... Wundere dich nicht wenn das I2C Protocoll nicht genau nach die RTC Datasheets eingehalten wird... Mit Start und Stop ist es nicht ganz so wie durch Philips vorgeschlagen DatasheetmĂ ssig ging es einfach nicht ! ...und so geht es ! vielleicht kann es ein I2C kenne uns erklĂ€ren ?!? Viel glĂŒck ! Salut Nicolas '********************************************************************** ' ' C-Control/BASIC M-Unit 2.0 ' ' M-Unit 2.0 ' ' RĂ©glage du I2C RTC Real Time Clock) PCF8583 par DCF ' '*********************************************************************** ' --- Definitions -------------------- Define LED port[16] Define LCDbacklight port[6] ' RĂ©tro-Ă©clairage de l'affichage LCD Define Data byte Define Status byte Define Secondes byte Define Minutes byte Define Heure byte Define Date byte Define Mois byte Define An byte Define JS byte Define N byte '****************************** Initialisation LCD ************************************* LCDbacklight=1 Print"#ON_LCD#"; Print"#INIT#"; Print"#CLR#"; Print"Cherche DCF..."; Print"#OFF#"; ' ---Initialisation -------------------- Print"Start, cherche Signal DCF" Beep 20,20,0 LED=1 #WaitDCFsynchro 'Boucle d'attente de synchronisation DCF If Year=0 then WaitDCFsynchro Beep 20,20,0 LED=0 Print" Horloge synchronisĂ©e sur DCF" Print"#ON_LCD#"; Print"#CLR#"; Print"Synchro DCF OK !"; Print"#L201#"; Print"Reglage RTC..."; Print"#OFF#"; #NoTransition 'Boucle d'attente pour Ă©viter transition minutes durant memo variables If Second>55 then goto NoTransition #StoreTimeDate 'Sauvegarde la date et l'heure dans les variables correspondantes Minutes= Minute+1 Heure= Hour Date= Day Mois= Month If Year=04 then An=0 'AnnĂ©e Bisextile (FĂ©vrier=29 jours) If Year=05 then An=1 'FĂ©vrier=28 jours If Year=06 then An=2 'FĂ©vrier=28 jours If Year=07 then An=3 'FĂ©vrier=28 jours If Year=08 then An=0 'AnnĂ©e Bisextile (FĂ©vrier=29 jours) If Year=04 then An=1 'FĂ©vrier=28 jours If Year=04 then An=2 'FĂ©vrier=28 jours If Year=04 then An=3 'FĂ©vrier=28 jours JS= Dow-1 '(Val PCF8583 RTC) = (Val C-Control Clock) -1 Print "Date Memorisee:" Print "Sec Min Heure Date An Mois JS" Print Secondes, Minutes, Heure, Date, An, Mois, JS 'Goto storetimedate #RTCset 'Sauvegarde de l'heure actuelle dans les registres du RTC Print "Heure sauvegardĂ©e dans RTC:" Print "Sec Min Heure Date An Mois JS" Print Secondes, Minutes, Heure, Date, An, Mois, JS Print"#ON_IIC#"; Print"#START#"; 'Start I2C Put 160 'Control Byte, (schreibmodus: Bit0 = 0) Put 0 'Adressage du registre 0 (Statusbyte) Put 128 'Ecrire 128 dans REG 0 (satusbyte) (Stop clock for setting) Put 0 'Ecrit 0 dans REG 1 (dixiĂšmes de secondes) Put 0 'Ecrit 0 dans REG 2 (secondes) Put ((Minutes/10) SHL 4) + (Minutes mod 10) 'Ecrit minutes dans REG 3 Put ((Heure/10) SHL 4) + (Heure mod 10) 'Ecrit heure dans REG 4 Put (An SHL 6) + ((Date/10) SHL 4) + (Date mod 10) 'Ecrit An/Jour dans REG 5 Put (JS SHL 5) + ((Mois/10) SHL 4) + (Mois mod 10) 'Ecrit JS/Mois dans REG 6 Put 77 Print"#STOP#"; 'Stop I2C Beep 20,20,100 #StartClock 'DĂ©marre l'horloge qui a Ă©tĂ© arrĂȘtĂ©e pour le rĂ©glage de l'heure If Minute Print"#ON_IIC#"; Print"#START#"; 'Start I2C Put 160 'Control Byte, (schreibmodus: Bit0 = 0) Put 0 'Adressage du registre 0 (Statusbyte) Put 0 'Ecrire 0 dans REG 0 (satusbyte) (Start clock) Print"#STOP#"; 'Stop I2C Print"#OFF#"; Print " Start Clock" Beep 20,20,0 #RTCread '*** Lecture RTC *** Print "Start Routine lecture du RTC" Print"#ON_IIC#"; Print"#START#"; 'Start I2C Put 160 'Control Byte, (Write Mode: Bit0 = 0) Put 0 'Adressage du registre 0 Print"#STOP#"; 'Stop I2C Print"#START#"; 'Start I2C Put 161 'Control Byte, (Read Mode: Bit0 = 1) Get Data 'I2c Reception (Status register) Status=Data 'Extraction Get Data 'I2c Reception (DixiĂšmes de secondes) Get Data 'I2c Reception (Secondes) Secondes = ((data and 112)SHR 4)*10 +(data and 15) 'Extraction Get Data 'I2c Reception (Minutes) Minutes =(Data and 15)+(10*((Data and 112) Shr 4)) 'Extraction Get Data 'I2c Reception (Heures) Heure =(Data and 15)+(10*((Data and 48) Shr 4)) 'Extraction Get Data 'I2c Reception (An et Date) Date =(Data and 15)+(10*((Data and 48) Shr 4)) 'Extraction An = ((Data and 192) Shr 6) 'Extraction Get Data 'I2c Reception (JS et Mois) Mois =(Data and 15)+(10*((Data and 16) Shr 4)) 'Extraction JS = ((Data and 224) Shr 5) 'Extraction Get Data 'I2c Reception (Last byte = RAM Byte 1) Print"#STOP#"; Print"#OFF#"; Print "Status Sec Min Heure Date An Mois JS Ram1" Print Status, Secondes, Minutes, Heure, Date, An, Mois, JS, Data Print"#ON_LCD#"; Print"#CLR#"; Print"#L105#"; If Heure<10 then print"0"; Print Heure; Print":"; If Minutes<10 then print"0"; Print Minutes; Print":"; If Secondes<10 then print"0"; Print Secondes; Print"#L203#"; If JS=0 Then Print"LU"; If JS=1 Then Print"MA"; If JS=2 Then Print"ME"; If JS=3 Then Print"JE"; If JS=4 Then Print"VE"; If JS=5 Then Print"SA"; If JS=6 Then Print"DI"; Print" "; If Date<10 then print"0"; Print Date; Print"/"; If Mois<10 then print"0"; Print Mois; Print"/"; If An<10 then print"0"; Print An; Print"#OFF#"; Tog LED 'LED clignotte Goto RTCread END'*************************************************************************************** > Hallo zusammen, > > Ich habe eine Echtzeit-uhr PCF8583 (als Fertigen baustein mit Gold cap bei cc-tools gekauft) > Leider Klappt die Kommunikation nicht so, wie ich mir das vorstelle. > beim lesen vom pcf8583 erhalte ich immer den wert 0 zurĂŒck, (bei nicht angeschlossenen > Baustein 255) egal welche Speicherstelle ich auslese. > ich hab mir den Bus schon mit einem Oszilloskop angesehen, und festgestellt, das der PCF8583 > jedes Byte brav mit einem ACK beantwortet. > ich verwende die eingebauten I2C Routinen der M-unit 2.0 > > Nachfolgend ein Test-programm das den Wert 127 an speicherstelle 21 schreibt (freier ram bereich) > und anschliessend wieder einlesen soll. ZurĂŒck erhalte ich jedoch den wert 0 > > da tut sich ein grosser abgrund von fragen auf > > was mache ich falsch ? > ist das schreiben fehlerhaft, oder das Lesen ? > kann man softwaremĂ€ssig prĂŒfen ob ein ACK eingegangen ist, ohne neue I2C Routinen zu schreiben ? > wieso entstehen mit dem get befehl 18 Impulse auf SDA (Oszilloskop) ? > Es soll ja nur ein Byte gelesen werden und nicht 2 > > '--------------------------------------------------------------------------- > ' Testprogramm FĂŒr PCF8583 > '--------------------------------------------------------------------------- > > define schleife byte > define word_adress byte > define slave_adress byte > define data byte > > define uhr_schreiben &b10100010 > define uhr_lesen &b10100011 > > #start > > '-----------------Schreiben in ram-------------------------------------------------------------------- > > slave_adress=uhr_schreiben > data=127 > word_adress=21 > print" Schreibe RAM Adresse:";word_adress;" Daten: ";data > print"#ON_IIC#"; 'Umleitung auf I2C Bus Aktivieren > print"#START#"; 'Sende Start Bedingung > put slave_adress > put word_adress > put data > print"#STOP#"; 'Sende Stop Bedingung > print"#OFF#"; 'Umleitung aufheben > print "daten geschrieben !" > '-------------------------------------------------------------------------------------------------- > slave_adress=uhr_schreiben > print" lese RAM Adresse:";word_adress > print"#ON_IIC#"; 'Umleitung auf I2C Bus Aktivieren > print"#START#"; 'Sende Start Bedingung > put slave_adress > put word_adress > print"#START#"; 'Sende Start Bedingung > slave_adress=uhr_lesen > put slave_adress > get data > print"#STOP#"; 'Sende Stop Bedingung > print"#OFF#"; 'Umleitung aufheben > print" gelesener wert :";data > goto start > end > > |
| Antwort schreiben |