Forum: Projekte & Code RTC PCF8583 in C


von Frank N. (betafrank)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei Code zum Verwenden der RTC PCF8583. Die I²C-Lib von Peter Fleury 
http://jump.to/fleury dient als Basis zur Kommunikation.

Routinen zur Auslösung/Abarbeitung eines sekündlichen Interrupts durch 
die RTC muß je nach Controller und Beschaltung selbst implantiert 
werden.

Es kann sinnvoll sein, in der Interruptserviceroutine (ISR) nur ein Flag 
zu setzen, welches in der Main-Loop erkannt wird. So kann die ISR sehr 
kurz gehalten werden und main() entscheidet, wann/ob die RTC zu lesen 
ist. main() könnte z.B. die Zeit/Datumsvariablen einfach selber 
weiterdrehen und nur einmalig bei PowerUp oder jeweils Nachts um 
00:00:00 die RTC auslesen.

Noch so am Rande:
Ne automatische Sommer/Winterzeitumschaltung ist nett und beim PowerUp 
sollte die RTC-Uhrzeit/Datum auf Plausibilität geprüft werden.

Sommer/Winterzeitumstellung kann wie folgt ermittelt werden:
1
int8_t checkSummertime(DATETIME_T *DT){
2
   static uint8_t Summertime=255;     //255 means not definied (eg after PowerUp)
3
   if(DT->wday == SUNDAY && DT->day > 24){
4
      if(DT->mon==3 && DT->hour==2 && (!Summertime || Summertime==255)){
5
         Summertime=TRUE;
6
         DT->hour++;
7
         return 1;
8
      }
9
      else if(DT->mon==10 && DT->hour==3 && (Summertime || Summertime==255)){
10
         Summertime=FALSE;
11
         DT->hour--;
12
         return -1;
13
      }
14
   }
15
   return 0;
16
}
17
//Wird ein Wert zurückgegeben, muss die Stunde in der RTC um diesen Wert korrigiert werden.

Als Gerüst zur Plausibilitätsprüfung kann folgendes (Ursprünglicher 
Autor ist mir leider unbekannt) dienen:
1
   /*************************************************************************/
2
static const unsigned char days_in_month[] =
3
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
4
BOOL isDateValid(DATETIME_T *date){
5
   uint8_t leap = ((date->mon == 2) && ((date->year % 4) == 0)) ? 1 : 0;
6
   if(date->year > 99 || date->year < 1 || date->mon > 12 || date->mon < 1 || date->day < 1 || date->day > (days_in_month[date->mon] + leap))
7
      return FALSE;
8
   else
9
      return TRUE;
10
}
11
   /*************************************************************************/
12
BOOL isTimeValid(DATETIME_T *time){
13
   if(time->hour > 23 || time->min > 59 || time->sec > 59)
14
      return FALSE;
15
   else
16
      return TRUE;
17
}

Die Beispiele hier sind in der *.zip enthalten

Gruß Frank

von Thomas F. (thomas42)


Lesenswert?

Hallo Frank,

zunächst einmal vielen Dank für den Code zum PCF8583. Der hat mir eine 
Menge Arbeit erspart und funktioniert super.

Ich musste allerdings ein paar kleine Anpassungen vornehmen.

Die Dateien in deinem ZIP File sind mit PCF8583.h bzw .c bezeichnet. Im 
Sourcecode selbst steht im Include aber (noch?) rtc.h.

Die aktuelle I²C-Lib von Peter Fleury ist nicht mit iic.h sondern 
i2cmaster.h bzw .s benannt. Zudem haben die Funktionen etwas andere 
Namen, also z.B. i2c_stop() statt stop_iic(). Vielleicht hattest du noch 
eine ältere Version.

Das lässt sich aber per Find & Replace schnell ändern. Danach lief alles 
ohne Probleme.

Hier noch ein Hinweis für andere Einsteiger wie mich. In der i2cmaster.s 
steht :"Adapt the SCL and SDA port and pin definitions and eventually 
the delay routine to your target!" Das hatte ich zunächst nicht 
beachtet.

Gruß
Thomas

von Frank N. (betafrank)


Lesenswert?

Hallo Thomas,

vielen Dank für die Hinweise!

Mein Download von Peter Fleury's Lib ist tatsächlich schon länger her... 
Ich hoffe, die anderen Downloader hier haben meine Flüchtigkeitsfehler 
gefunden und nicht genervt aufgegeben....

Gruß Frank

von Frank N. (betafrank)


Angehängte Dateien:

Lesenswert?

Hallo,

hier die bereinigte Version 1.1, sollte nun problemlos kompilieren. Beim 
kosmetischen Redesign für die öffentliche Version hatten sich ein paar 
Fehler eingeschlichen.

Gruß Frank

von kor (Gast)


Lesenswert?

Hallo

Hat jemand zufällig ein Anwendungsbeispiel zur oben angeführten 
Bibliothek.

lg

von DD4DA (Gast)


Angehängte Dateien:

Lesenswert?

Ja, ich benutze diese Library an einem Mega16 mit ~11Mhz und einer 
PCF8583 / 32768Khz Quarz.
Das Projekt is mit AVRSTUDIO gebaut und beinhaltet sowohl die Fleury's 
Library für den IIC- und UART als auch die modifizierte RTC.C V1.1 
Library von Frank.
Mir gefällt ganz besonders diehier gepostete Lösung von Frank für den 
PCF8583 denn sie ist wirklich gut dokumentiert und sauber programmiert.
Ich benutze für die RTC den externen INT1 des ATMEGA16 und lasse den IRQ 
bei steigender Flanke auslösen denn der IRQ der RTC ist "activ low". 
Level triggered oder mit fallender Flanke würde nicht richtig 
funktionieren.
Die ISR ist BLOCKED und setzt einfach nur eine global definierte Flag. 
Damit wird die Durchlaufzeit sehr kurz sein. Die eigentliche 
Leseprozedur der Uhr mache ich in der Main-Loop, wenn die Flag gesetzt 
ist. Nach dem Abarbeiten der Uhrenprozedur wird die Flag wieder 
gelöscht.
Also, viel Spass mit dem Projekt  und meinen Dank an die Autoren der von 
mir benutzen Routinen.

Gerhard Wesser, DD4DA

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.