Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Re: i2c bus klappt nicht (PCF 8583) Kategorie: C-Control I V1.2/2.0 (von Nicolas - 28.06.2005 23:01)
 Als Antwort auf i2c bus klappt nicht (PCF 8583) von Michael - 27.06.2005 20:09
Nicolas nutzt:  CC1-Unit V1.1, CC1-M-Unit V1.1, CC1-M-Unit V1.2/2.0
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
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

Bisherige Antworten:

Re: i2c bus klappt nicht (PCF 8583) (von Nicolas - 29.06.2005 16:01)