Man könnte z.B. TMR0 nehmen, mit einem 1:256 Prescaler im 16-Bit Modus.
Dann eine IRQ Routine für den Timer die nichts weiter macht als das IRQ
Flag des Timers zu löschen. In der Main-Schleife dann an der Stelle, wo
die Pause sein soll z.B.:
1 | pause_ticks = <Anzahl der Timer-Überläufe um auf ca. 30 Sek. zu kommen>
|
2 | T0CONbits.TMR0ON = 1;
|
3 |
|
4 | while(pause_ticks)
|
5 | {
|
6 | pause_ticks--;
|
7 | _asm SLEEP _endasm
|
8 | }
|
9 |
|
10 | T0CONbits.TMR0ON = 0;
|
Der Zähler "pause_ticks" muss natürlich ein passender Typ sein um die
benötigte Anzahl der Überläufe darstellen zu können. Zwar wacht der PIC
dann bei jedem Überlauf auf, schläft dann aber schnell wieder ein da ja
nur das IRQ Flag gelöscht wird und der pause_ticks Zähler um einen
heruntergezählt wird (plus der Vergleich ob er dann 0 ist). Natürlich
muss man vorher den Timer passend konfigurieren. Je nachdem wie genau
man die 30 Sekunden treffen will muss dann halt der Prescaler und der
Zählerwert angepasst werden.
Grüße,
Chris