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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.