Ethernut Home Hardware Firmware Tools Download Community
 
Ethernuts  /  Ethernut 5  /  Nut/OS  /  RTC
Suchen | Impressum | English

Ethernut 5 RTC

Ethernut 5 RTC

Ethernut 5 enthält einen dedizierten Real-Time-Clock-Chip (RTC) mit Backupversorgung, um auch nach einem Stromausfall Datum und Uhrzeit verfügbar zu haben. Statt einer üblichen Batterie hält ein sog. Doppelschichtkondensator mit einer Kapazität von 0,1F die Versorgung für den RTC während eines Stromausfalls für mehrere Tage aufrecht.

Die genaue Bezeichnung des RTC-Chips lautet PCF8563TD-T. Dieser ist am I2C-Bus (TWI im Atmel Jargon) angeschlossen und kann sowohl von der ARM9 CPU, als auch vom ATmega168 (Power-Management) angesprochen werden. Der Bus ist außerdem am Expansion Port über Pin 55 (TWI-Clock) und Pin 56 (TWI-Data) verfügbar.

Ethernut 5 RTC Schematic

Uhrzeit und Datum abfragen

Nut/OS enthält eine Reihe von C Standardfunktionen zur Abfrage der aktuellen Zeit und deren Umwandlung in verschiedene Formate. Nutwiki enthält dazu einige Beispiele:

Uhrzeit und Datum einstellen

Zur Einstellung kann z.B. die fertige Nut/OS-Anwendung caltime verwendet werden. Dies wird z.B. nötig, wenn nach einem längerem Stromausfall der Doppelschichtkondensator erschöpft war. Das Programm caltime ist in der Distribution von Nut/OS enthalten und wird über die serielle Schnittstelle bedient.

Calendar Time 2.1 running on Nut/OS 5.0.4.0
Opening line editor...OK
Registering RTC hardware...OK

  0 - Display seconds counter
  1 - Display universal time
  2 - Display local time
  3 - Display system uptime
  C - Calculate weekday
  S - Set local time
  Y - Toggle DST calculation
  Z - Set timezone
What is thy bidding, my master?

In eigenen Nut/OS Anwendungen kann man zur Einstellung die C Standardfunktion stime() aufrufen.

I2C/RTC-Treiber Nut/OS Version 4

Achtung: In einigen älteren Nut/OS Version funktioniert der I2C-Treiber mit Ethernut 5 eventuell nicht. Beim Aufruf der Funktion NutRtcGetStatus() bleibt der aufrufende Thread hängen. Dies wurde in Version 4.10.3 (Beta 5.0.4) behoben.

Der Top-Level-Treiber befindet sich in nut/dev/rtc.c und steht für alle Plattformen zur Verfügung. Die Routinen machen natürlich nur Sinn, wenn das Board über eine RTC Hardware verfügt. Jede Anwendung, die auf diese Hardware nutzen möchte, muss zuerst die Funktion NutRegisterRtc() aufrufen. Dabei wird ein Pointer auf die Informationsstruktur des eigentlichen RTC-Hardwaretreibers übergeben. Im Falle von Ethernut 5 zeigt der Pointer auf die Struktur rtcPcf8563. Der Quellcode dieses Hardwaretreibers befindet sich in der Datei nut/dev/pcf8563.c im gleichen Verzeichnis. Auch dieser ist für alle Plattformen identisch.

Zum Zugriff auf die eigentliche Hardware enthält der RTC-Hardwaretreiber die beiden Funktionen PcfRtcReadRegs() und PcfRtcWrite(), die sich der Funtion TwMasterTransact() bedienen, um Daten mit dem RTC-Chip über die I2C-Schnittstelle auszutauschen. Diese Routine wird üblicherweise im Hardware-abhängigen Teil des Betriebssystems implementiert. Den I2C-Treiber für Ethernut 5 findet man in der Datei nut/arch/arm/dev/atmel/at91_twi.c (Stand Nut/OS 4.10). In neueren Versionen wurden die I2C-Treiber geändert, um mehrere Busse zu unterstützen. Um bereits vorhandenen Code nicht ändern zu müssen, enthält die Datei nut/include/dev/twif.h folgenden Macro (in vereinfachter Darstellung):

#define TwMasterTransact() NutTwiMasterTranceive()

Der I2C-Treiber ist für alle Varianten der AT91-Familie identisch. Lediglich für den AT91SAM9XE, der auf Ethernut 5 Verwendung findet, wurde eine kleine Änderung nötig. Im Gegensatz zu anderen Mitgliedern dieser Familie sendet die Hardware nicht automatisch ein STOP-Signal, wenn alle Daten gesendet wurden.

Der Treiber ist Interrupt-gesteuert. Für die Anwendung bedeutet dies, dass Zugriffe auf den RTC zu einem Context-Wechsel führen, also ein anderer Thread die Kontrolle über die CPU bekommt. Der Treiber ist daher quasi re-entrant. Wartet bereits ein Thread auf den Abschluss einer I2C-Kommunikation, können andere Threads gefahrlos I2C-Routinen aufrufen. Sie werden so lange angehalten, bis die aktuell laufende Kommunikation abgeschlossen ist. Danach erhält der Thread mit der höchsten Priorität Zugriff auf den Bus.

I2C/RTC-Treiber Nut/OS Version 5

Ab der Version 5.1 (Januar 2013) steht zusätzlich ein neuer I2C-Treiber zur Verfügung. In der alten Version, die weiterhin verfügbar bleibt, gibts es zwar schon die Möglichkeit, mehrere I2C-Busse zu verwalten, allerdings nur dann, wenn diese auf der gleichen Hardware basierten. Das Problem ist, dass die RTC-Treiber und auch andere Treiber für an den Bus angeschlossene Chips die globale Routine NutTwiMasterTranceive() aufrufen, die von nur einem, vorher zu bestimmenden Treiber, zur Verfügung gestellt werden kann.

In der neuen Version sind Bustreiber und die Treiber für die an den Bus angeschlossenen Geräte beliebig kombinierbar. Eine detailierte Beschreibung findet man im Nutwiki.

Jeweils eine fertige Anwendung für das Ethernut 5 Board zum Setzen und zum Auslesen von Datum und Uhrzeit mit dem neuen Bustreiber befindet sich im Archiv en5rtc.zip.

Die erste Anwendung en5rtc_write erlaubt die Eingabe von Zeitzone, Datum und Uhrzeit über die serielle Schnittstelle.

=*= Real-time clock writer =*=
Enter time zone in format HH:MM    : -1
Enter date, use format YYYY/MM/DD  : 2013/01/14
Enter time, use 24h format HH:MM:SS: 12:16:48

=*= Done =*=

Das zweite Anwendungsbeispiel en5rtc_read gibt fortlaufend Uhrzeit und Datum der Greenwich Mean Time aus.

=*= Real-time clock reader =*=
Mon, 14 Jan 2013 11:19:15

Auf dieser Seite erfahren Sie, wie Sie die im Archiv enthaltenen Binärdateien direkt (ohne Neukompilierung) auf das Ethernut 5 Board übertragen können.

Powermanagement

Wie bereits erwähnt, hat auch die ATmega168 CPU, welche für das Ethernut 5 Powermanagement zuständig ist, Zugriff auf die RTC-Hardware. Damit besteht die Möglichkeit, fast alle Teile des Boards stromlos zu schalten und zu einer bestimmten Zeit wieder zu aktivieren. Selbst der ATmega168 kann dabei selbst in einen Power-Down-Zustand versetzt werden und zum gewünschten Zeitpunkt über den Interrupt des PCF8563 geweckt werden. Damit kann der Stand-By-Verbrauch von Ethernut 5 auf ein absolutes Minimum reduziert werden.

Zur Zeit gibt es dafür noch keine Software-Unterstützung.