Forum: Mikrocontroller und Digitale Elektronik avr sleep m328p


von Stefan S. (sschultewolter)


Angehängte Dateien:

Lesenswert?

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.

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Die Bits ISC00 und ISC01 liegen nach meinem Datenblatt aber nicht im 
MCUCR sondern im EICRA.

von Stefan S. (sschultewolter)


Lesenswert?

Georg G. schrieb:
> Die Bits ISC00 und ISC01 liegen nach meinem Datenblatt aber nicht im
> MCUCR sondern im EICRA.

Hätte ich mir den Beitrag fast sparen können :) So gehts direkt. Hatte 
zwischenzeitig auch bereits den EICRA genommen gehabt. Hab den wohl 
irgendwann wieder umbenannt, da überall MCUCR genannt wurde. Hab auf 
Anhieb nicht die passenden Register gesehen im DB.

Mal eine andere Frage nebenbei. Gibt es, ausser alle DB durch zugehen, 
heraus zu finden, wie sich die Register bei den unterschiedlichen AVR 
(Atmel 8Bit) nennen? Hatte zB auch GICR überall nur gefunden, die es 
beim 328p natürlich nicht gibt.

von Thomas E. (thomase)


Lesenswert?

Stefan S. schrieb:
> 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)

Der interne Oszillator, von dem in diesem Artikel die Rede ist, ist der 
Oszillator mit externem Quarz. Der interne RC-Oszillator schwingt 
mindestens genauso schnall an, wie der Oszillator mit externem 
RC-Resonator.

Stefan S. schrieb:
> Hatte zB auch GICR überall nur gefunden, die es
> beim 328p natürlich nicht gibt.

GICR haben die alten Megas(z.B. Atmega8)
Die neueren haben stattdessen EICRA und EIMSK. Sowie andere Funktionen 
im MCUCR.

mfg.

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.