Hallo,
ich möchte meinen MCU alle 2 Sekunden wecken, um ein Sensor kurz zu
überprüfen und dann wieder schlafen legen lassen. Zusätzlich habe ich in
der ISR eine Countdown Schaltung programmiert. Mit dem Flag zeige ich an
wann der MCU alarmieren soll. Leider glaube ich das der MCU gar nicht
aus dem Schlafmodus aufwacht, denn der Sensor reagiert nicht mehr und
der Stromverbrauch ist konstant bei 42µA.
Das erste würde ich so lassen, weil ich solange der Input PINC3 ungleich
high ist , die LED einschalten möchte und sie auch solange eingeschaltet
bleiben soll bis der Input wieder zurück auf HIGH geht.
Beim zweiten hast du recht, da die Zeit überschritten wurde und dort die
LED nur durch resetten zurückgesetzt werden kann.
David schrieb:> Das erste würde ich so lassen, weil ich solange der Input PINC3 ungleich> high ist , die LED einschalten möchte und sie auch solange eingeschaltet> bleiben soll bis der Input wieder zurück auf HIGH geht.>> Beim zweiten hast du recht, da die Zeit überschritten wurde und dort die> LED nur durch resetten zurückgesetzt werden kann.
Deine Timing-Vorstellungen verstehe ich nicht.
Erst schläfst du 2 Sekunden, dann willst sofort und gleich auf ein
Eingangssignal reagieren.
Was wenn das Signal innerhalb des 2 Sekundenschlafs kommt?
Funktioniert denn dein Programm ohne Sleep?
Edit:
hier schon geschaut?:
http://www.mikrocontroller.net/articles/Sleep_Mode
David schrieb:> Zusätzlich habe ich in der ISR eine Countdown Schaltung programmiert.
Sehe ich nicht.
> Mit dem Flag zeige ich an wann der MCU alarmieren soll.
Nach 24 Stunden um 0.00h?
mfg.
David schrieb:> set_sleep_mode(SLEEP_MODE_PWR_SAVE);
womit soll er denn geweckt werden?
möglich wäre:
Timer 2
ext. Interrupts
TWI
Watchdog
wenn er schläft läuft er nicht mehr....
Ja das Programm funktioniert ohne Sleep funktion wunderbar es geht mir
eigentlich auch nur um die Sleep Funktion.
Ich habe das Programm jetzt einfach mal vereinfacht, damit es um das
wesentliche geht, das aufwachen:
1
#include<avr/io.h>
2
#include<stdint.h>
3
#include<util/delay.h>
4
#include<avr/interrupt.h>
5
#include<avr/sleep.h>
6
7
#define F_CPU 8000000L
8
9
volatileuint8_tflag;
10
11
12
intmain(void)
13
{
14
15
16
//konfigurieren der PINS:
17
18
19
DDRC|=(1<<PC5)|(1<<PC4);//Pin pc5 und pc4 als ausgang definieren
20
//DDRC &= ~(1<<PC3); //Pin pc3 als eingang definieren
21
22
23
//Start der Initalisierung des Timer 2:
24
GTCCR|=(1<<TSM)|(1<<PSRASY);//Timer anhalten, Prescaler Resetten, um die Einschwingzeit des Oszillators zu überbrücken (Einschwingzeit 100ms-1000ms
25
ASSR|=(1<<AS2);//Timer Asynchron-Mode einschalten 32768 RTC hängt an XTAL1+XTAL2
26
TCCR2A|=(1<<WGM21);// Versetze in Compare Mode
27
TCCR2B|=(1<<CS22)|(1<<CS21);//Prescaler auf 256
28
OCR2A=256-1;//(=OCR2A Compare Register) Berechnung der Aufwachzeit (32768/256)^-1*256= Aufwachzeit alle 2 Sekunden wird der MCU aufgeweckt
Joachim B. schrieb:> David schrieb:>> set_sleep_mode(SLEEP_MODE_PWR_SAVE);>> womit soll er denn geweckt werden?>> möglich wäre:> Timer 2> ext. Interrupts> TWI> Watchdog>> wenn er schläft läuft er nicht mehr....
Deswegen habe ich eigentlich den Timer2 in Compare-Mode programmiert, im
Power Save Mode sollte dann nur Timer 2 mit einem 32,768khz Quarz laufen
sobald die 2 Sekunden um sind sollte der Interrupt erfolgen und ihn
aufwecken, der dann das Hauptorogramm weiter ausführt.
David schrieb:> es geht mir> eigentlich auch nur um die Sleep Funktion.
verstehe ich, nur wenn er schläft schläft er, ich schrieb ja schon die
Aufwachmöglichkeiten, externer Uhrenquarz am Timer2 32kHz, watchdog,
oder externer Interrupt.
Ich weiss immer noch nicht wie du den aufwecken willst wenn kein
watchdaog programmiert ist, kein externer Uhrenquarz dranhängt und kein
externer Interrupt ausgelöst wird.
Thomas Eckmann schrieb:> ???
so ähnlich bei mir auch
also mit sleepmodi hatte ich schon mal das Vergnügen, nur noch nicht mit
der allgemein beliebten Timer Variante mit dem 32kHz Quarz am extra
Eingang, nicht dem Systemquarz. Ich las immer davon das der den AVR
aufwecken kann um alle Skunde die SoftUhr einen weiterlaufen zu lassen.
Ich bevorzugte die RTC DS3231 die mit ihrem Alarmregister und /INT
Ausgang am AVR per PCINT weckt, da muss der arme AVR nicht alle Sekunde
gewckt werden, kann fröhlich pennen bis er wirklich dran ist.
David schrieb:> Leider kein blinken :/> Heißt das, das der Uhrenquarz kaputt ist?
Die Konfiguration des Timers ist OK.
Kontrollier erstmal deine Lötstellen auf Verbindung und Kurzschluss,
bevor du den Quarz abschreibst. Was für Kondensatoren hast du dran?
mfg.
Das ganze ist auf Breadbord,
die Kondensatoren sind 2 x 27 pF, da ich damals keine 22 pF
Kondensatoren zur Hand hatte - diese habe ich jetzt aber wieder besorgt,
soll ich diese mal anbringen?
David schrieb:> sollte dann nur Timer 2 mit einem 32,768khz Quarz
hatte ich überlesen
Thomas Eckmann schrieb:> ???>> mfg.
und wurde im Eröffnungbeitrag auch nicht geschrieben ;-)
Chris schrieb:> Hast du den Quarz zwischen TOSC 1 und TOSC 2?> Sonst klappt es nicht. Da benötigtst du auch keine extra Kondensatoren.
Ja, lass die Kondensatoren ganz weg.
22pF ist sowieso zu gross und 27pF viel zu gross.
mfg.
Chris schrieb:> Hast du den Quarz zwischen TOSC 1 und TOSC 2?> Sonst klappt es nicht. Da benötigtst du auch keine extra Kondensatoren.
Ja hab ich.
Der Timer scheint jetzt zu funktionieren. Aber anstatt alle 2 Sekunden
zu blinken braucht er jetzt fast 10 sekunden?
1
#include<avr/io.h>
2
#include<stdint.h>
3
#include<util/delay.h>
4
#include<avr/interrupt.h>
5
#include<avr/sleep.h>
6
7
#define F_CPU 8000000L
8
9
volatileuint8_tflag;
10
11
12
intmain(void)
13
{
14
15
16
//konfigurieren der PINS:
17
18
19
DDRC|=(1<<PC5)|(1<<PC4);//Pin pc5 und pc4 als ausgang definieren
20
//DDRC &= ~(1<<PC3); //Pin pc3 als eingang definieren
21
22
23
//Start der Initalisierung des Timer 2:
24
GTCCR|=(1<<TSM)|(1<<PSRASY);//Timer anhalten, Prescaler Resetten, um die Einschwingzeit des Oszillators zu überbrücken (Einschwingzeit 100ms-1000ms
25
ASSR|=(1<<AS2);//Timer Asynchron-Mode einschalten 32768 RTC hängt an XTAL1+XTAL2
26
TCCR2A|=(1<<WGM21);// Versetze in Compare Mode
27
TCCR2B|=(1<<CS22)|(1<<CS21);//Prescaler auf 256
28
OCR2A=256-1;//(=OCR2A Compare Register) Berechnung der Aufwachzeit (32768/256)^-1*256= Aufwachzeit alle 2 Sekunden wird der MCU aufgeweckt