mikrocontroller.net

Forum: Projekte & Code RTC PCF8583 in C


Autor: Frank N. (betafrank)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:

int8_t checkSummertime(DATETIME_T *DT){
   static uint8_t Summertime=255;     //255 means not definied (eg after PowerUp)
   if(DT->wday == SUNDAY && DT->day > 24){
      if(DT->mon==3 && DT->hour==2 && (!Summertime || Summertime==255)){
         Summertime=TRUE;
         DT->hour++;
         return 1;
      }
      else if(DT->mon==10 && DT->hour==3 && (Summertime || Summertime==255)){
         Summertime=FALSE;
         DT->hour--;
         return -1;
      }
   }
   return 0;
}
//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:
   /*************************************************************************/
static const unsigned char days_in_month[] =
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
BOOL isDateValid(DATETIME_T *date){
   uint8_t leap = ((date->mon == 2) && ((date->year % 4) == 0)) ? 1 : 0;
   if(date->year > 99 || date->year < 1 || date->mon > 12 || date->mon < 1 || date->day < 1 || date->day > (days_in_month[date->mon] + leap))
      return FALSE;
   else
      return TRUE;
}
   /*************************************************************************/
BOOL isTimeValid(DATETIME_T *time){
   if(time->hour > 23 || time->min > 59 || time->sec > 59)
      return FALSE;
   else
      return TRUE;
}

Die Beispiele hier sind in der *.zip enthalten

Gruß Frank

Autor: Thomas F. (thomas42)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank N. (betafrank)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Frank N. (betafrank)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: kor (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

lg

Autor: DD4DA (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

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.