Forum: Compiler & IDEs beispiel sleep für 1 sek


von ml (Gast)


Lesenswert?

hallo zusammen

gibt es irgendwo ein komplettes beispiel wie man ein mega48 für eine 
sekunde schlafen legt und danach wieder weiter fährt aufgrund des 
interruptes? weiss dass ich nicht der erste bin mit dieser frage und 
auch schon einiges dazu existiert - nur habe ich es noch nicht so 
kompakt gefunden dass ich es verstehen würde....

danke

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

1.) Du programmierst einen Timer so, dass er nach einer Sekunde einen
Interrupt generiert.  Dafür sollte das Rüstzeug im AVR-GCC-Tutorial
hier zu finden sein.  Sinnvoll geht das wohl nur mit einem 16-Bit-
Timer (also Timer 1 beim ATmega48), da man bei einem 8-Bit-Timer mit
gängiger Frequenz des Hauptoszillators (also 1 MHz oder mehr) keinen
Wert von Vorteiler und OCRx findet, mit dem man bis auf 1 Sekunde
kommen kann.

Sinnvoll ist es, den Vorteiler gerade so groß zu wählen, dass man den
möglichen Zählbereich von 65536 dann bestmöglich ausnutzt, damit hat
man die größtmögliche Genauigkeit, die man ohne zusätzliche
Kalibrierung erreichen kann.  Betrieb des Timers dann im CTC-Modus mit
einem passend gewählten OCR1x-Wert.  Den zugehörigen compare match
Interrupt schaltest du ein und gibst ihm einen Interrupthandler
(ggf. einen leeren, wenn du sonst nichts weiter zu tun hast dabei).
Der dient dem Aufwecken aus dem Schlaf.

Rechenbeispiel: bei einem CPU-Takt von 1 MHz muss der Vorteiler für 1
Sekunde mindestens 1000000/65535 groß sein (15,259).  Der nächste
existierende Vorteilerwert wäre also 64 (CS10 und CS11 in TCCR1B
gesetzt).  Damit müsstest du entweder OCR1A oder OCR1B mit dem Wert
1000000/64 laden, also it 15625.

2.) Deine main loop sieht ungefähr so aus:
1
#include <avr/sleep.h>
2
3
...
4
int
5
main(void)
6
{
7
  // ... initialization goes here
8
  for (;;) {
9
    // do everything that has to be done here
10
    // ...
11
    sleep_mode();
12
  }
13
14
  return 0;
15
}
Ggf. zuvor noch einmalig mit set_sleep_mode() einen anderen sleep
mode als SLEEP_MODE_IDLE auswählen.

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.