Hallo,
ich habe vor, meinen Atmega328P mit 16MHz Resonator, jede Sekunde einmal
kurz aufzuwecken. Später soll die Resonsatorfrequenz noch niedriger
gewählt werden (<8MHz). Habe derzeit aber nur 16 und 20MHz Resonatoren
hier rumliegen.
Ich habe mich für den Resonator entschieden, da der interne Oscillator
scheinbar doch recht "lange" braucht, bis er startet. (siehe
"Morgenmuffel" unter http://www.mikrocontroller.net/articles/Sleep_Mode)
*SUT_CKSEL = EXTXOSC_8MHZ_XX_1KCK_14CK_4MS1*
EXTENDED = 0xFF (valid)
HIGH = 0xD7 (valid)
LOW = 0xFE (valid)
Nur habe ich das Problem, dass meine Led ganz komisch angesteuert wird
(6kHz) (siehe Anhang).
Gleiches konnte ich auch feststellen, als ich in der ISR einen Wert
immer um 1 erhöhen ließ. Der Wert ging rasant nach oben.
Womit hängen diese Probleme zusammen?
Der µC soll in einer bestimmten Zeit mehrmals aufgerufen werden.
Hauptsächlich zum Überprüfen, ob ein Wert wahr ist (Alarm), wenn nicht,
darf er sich wieder hinlegen. Das ganze wird ein Wecker, welcher auch
ohne externe Spannungsversorgung funktionieren soll. (Nicht dauerhaft,
aber min 1-2 Nächte, große Batterien fallen weg).
Der externe Interrupt kommt von einem DS3231 welcher mit einem PullUp an
PD2 verbunden ist. Frequenz steht auf 1Hz.
1 | #include "main.h"
|
2 | #include <avr/sleep.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | ISR(INT0_vect)
|
6 | {
|
7 |
|
8 | }
|
9 |
|
10 | int main(void)
|
11 | {
|
12 | ACSR = 0x80; // Analogcomparator ausschalten
|
13 | MCUCR |= (1<<ISC01) | (1<<ISC00); // Positive Flanke
|
14 | DDRD &= ~(1<<2); // INT0
|
15 | DDRD |= 1<<4; // Debug LED
|
16 |
|
17 | sei(); // Interrupts freigeben
|
18 |
|
19 | while(1)
|
20 | {
|
21 | EIMSK |= (1<<INT0); // externen Interrupt freigeben
|
22 |
|
23 | set_sleep_mode(SLEEP_MODE_PWR_DOWN);
|
24 | sleep_mode(); // in den Schlafmodus wechseln
|
25 |
|
26 | EIMSK &= ~(1<<INT0); // externen Interrupt sperren
|
27 | PORTD ^= 1<<4; // Debug LED togglen
|
28 | }
|
29 | return 0;
|
30 | }
|
Edit:
1.PNG zeigt oben externen Interrupt, und unten die Led. In 2.PNG habe
ich das Signal der LED vergrößert, da diese nicht darstellbar war mit
dem externen Interrupt zusammen.