www.mikrocontroller.net

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


Autor: ml (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <avr/sleep.h>

...
int
main(void)
{
  // ... initialization goes here
  for (;;) {
    // do everything that has to be done here
    // ...
    sleep_mode();
  }

  return 0;
}
Ggf. zuvor noch einmalig mit set_sleep_mode() einen anderen sleep
mode als SLEEP_MODE_IDLE auswählen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.