void FPPA0 (void)
{
// .ADJUST_IC SYSCLK=IHRC/2 // SYSCLK=IHRC/2
.ADJUST_IC SYSCLK=ILRC //ca. 50 kHz, 50 µA @ 3V
// Insert Initial Code
PAC = 255;
PBC = 255;
while (1)
{
PA = 255;
.delay(500); //ca. 10 ms
PA = 0;
.delay(50000); //ca. 1 s
}
}
Bisher ging die meiste Rechenzeit in der Warteschleife verloren. Dabei wird
unnötig Energie verbraucht. Deshalb habe ich nun nach einer Möglichkeit
gesucht, einen Power-Down- oder Sleep-Modus einzuschalten, wie ich das von
AVR-Controllern kenne. Der Watchdog sollte den Controller dann wieder
aufwecken. Der Watchdog-Timer ließ sich zwar mit /CLKMD = 0xE6;
einschalten, was man daran sehen kann, dass dann Doppelblitze entstehen, weil er
etwas länger läuft als eine Sekunde. Aber sowohl STOPEXE als auch STOPSYS
schalteten auch den Watchdog aus, und damit war es vorbei mit dem Aufwecken.
Bei diesen Versuchen gab es jeweils nur einen Blitz und dann blieb der
Controller aus.
Das Datenblatt des Controllers schlägt eine andere Methode vor. Man soll mit
STOPEXE den Controller schlafen legen, wobei allerdings der RC-Oszillator
weiter läuft. Und der 16-Bit-Timer soll dann einen Interrupt auslösen, der den
Controller wieder aufweckt. Die Einstellung des Timers ist zwar recht komplex,
aber es gibt dafür ein Makro: $ T16M ILRC, /4, Bit15 //Timer16
setting. Der Timer wird dann vom langsamen Taktgenerator ILRC getaktet und
verwendet einen Vorteiler durch 4. Und wenn das letzte Bit (Bit 15) auf 1 geht,
soll der Interrupt ausgelöst werden. Im Datenblatt wird vorgeschlagen, den
Timer vorher auf Null zu setzen. Damit war die Wartezeit allerdings viel zu
lang. Mit einem Anfangs-Zählerstand von 52000 kam ich dann recht genau auf eine
Sekunde.
Das Endergebnis sieht aus wie vorher. Aber die meiste Zeit verbringt der
Controller nun im Schlaf. Laut Datenblatt soll er dabei nur etwa 4 µA brauchen.
Der mittlere Strom sollte also trotz der blinkenden LED wesentlich geringer
sein als bisher. Und tatsächlich, eine Kondensatorladung reicht nun für rund 24
Stunden (mittlerer Verbrauch 12 µA)! Umgerechnet auf Alkalizellen mit 2000 mAh käme man damit theoretisch
auf eine Betriebsdauer von 20 Jahren.
#include "extern.h"
void FPPA0 (void)
{
// .ADJUST_IC SYSCLK=IHRC/2 // SYSCLK=IHRC/2
.ADJUST_IC SYSCLK=ILRC //ca. 50 kHz, 50 µA @ 3V
// Insert Initial Code
//CLKMD = 0xE6; //Watchdog on
$ T16M ILRC, /4, Bit15 //Timer16 setting
PAC = 255;
PBC = 255;
while (1)
{
PA = 255;
.delay(500); //ca. 10 ms
PA = 0;
WORD count = 52000; //Abgleich für 1 s
STT16 count;
stopexe;
//STOPEXE; //oder STOPYSYS schaltet WDT ab
//.delay(50000); //ca. 1 s
}
}