Forum: Mikrocontroller und Digitale Elektronik Sekundentakt - Sleep-Mode mit Uhrenquarz funktioniert nicht


von Andi (Gast)


Lesenswert?

Hallo liebe Bastler,

heute wende ich mich mal wieder mit einem Problem an euch!

Ich habe einen ATMEGA48, der im Sekundentakt eine LED blinken lassen 
soll.
Der Takt kommt von einem externen Uhrenquarz mit 32,768kHz (10pF), 
welcher direkt zwischen TOSC1 und TOSC2 (ohne extra Kondensatoren) 
angeschlossen ist.
Der µC schläft die ganze Zeit und wird nur einmal pro Sekunde durch den 
Uhrenquarz aufgeweckt.
Der Controller wird von 3 AA-Batterien direkt gespeist (zusammen ca. 
4,5V) - ohne Spannungsregler.

Hier ist der Code:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/sleep.h>
4
5
void initTimer( void )
6
{
7
  ASSR = (1 << AS2);  //externer Quarz
8
  TCCR2A = (1 << WGM21);  //waveform generation method
9
  TCCR2B = (1 << CS22) | (1 << CS21);  //prescaler 256
10
  TIMSK2 = (1 << OCIE2A);  //Compare Match A Int Enable
11
  OCR2A = 127;
12
}
13
14
int main ( void ) {
15
  DDRB |= 0b00000001;    //led ausgang
16
17
  initTimer();
18
  
19
  sei();
20
  
21
  while (1)
22
  {
23
    set_sleep_mode(SLEEP_MODE_PWR_SAVE);
24
    sleep_mode();
25
  }
26
}
27
28
ISR (TIMER2_COMPA_vect)
29
{
30
  //sollte im sekundentakt aufgerufen werden.
31
  if ((PORTB & 0b00000001) > 0)
32
  {
33
    PORTB &= 0b11111110;  //switch led off
34
  }
35
  else
36
  {
37
    PORTB |= 0b00000001;  //switch led on
38
  }
39
}

Nun zu meinem Problem:
Es hat bereits mal funktioniert, dass es im Sekundentakt geblinkt hat.
Aber nicht nach jedem Reset, sondern nur teilweise.
Ich hatte das Gefühl, dass es deutlich häufiger ging, als der Programmer 
noch angesteckt war (!?).
Aber selbst da hat es nicht jedesmal funktioniert.

Meistens blinkt gar nichts, also die LED bleibt dunkel nach dem Reset.
Der Reset funktioniert immer einwandfrei, das hab ich getestet.

- Ist die direkte Batteriespannung von 4,5V zu instabil, sodass ich 
einen Spannungsregler verwenden sollte? (Der zieht halt nochmal mehr 
Standby-Strom...)
- Muss ich das Uhrenquarz doch mit zusätzlichen Kondensatoren versehen?
- Fehlt noch eine Initialisierung oder muss ich ein Fuse-Bit setzen?
- Oder evtl. was ganz anderes?

Danke schon jetzt für eure Antworten!
Ihr helft mir ungeheim weiter...

von Falk B. (falk)


Lesenswert?

Siehe Sleep Mode, dort ist ein funktionierendes Beispiel drin.

>Es hat bereits mal funktioniert, dass es im Sekundentakt geblinkt hat.
>Aber nicht nach jedem Reset, sondern nur teilweise.
>Ich hatte das Gefühl, dass es deutlich häufiger ging, als der Programmer
>noch angesteckt war (!?).

Klingt nach Anschwingproblemen des Uhrenquarzes. Da sollt eman ein wenig 
warten.

>- Ist die direkte Batteriespannung von 4,5V zu instabil, sodass ich
>einen Spannungsregler verwenden sollte?

Nein.

>- Muss ich das Uhrenquarz doch mit zusätzlichen Kondensatoren versehen?

Kommt auf den Quarz und den AVR-Typ an.

>- Fehlt noch eine Initialisierung

Teilweise, das Wartena uf das Einschwingen.

>oder muss ich ein Fuse-Bit setzen?

Nein.

MFG
Falk

von Thomas E. (thomase)


Lesenswert?

Irgendwie hast du deinen Timer merkwürdig initialisiert.

Probier mal das:

void InitTimer2(void)
{
  TCCR2A = 0x00;      // Timer2 Normal Mode
  TCCR2B = 0x05;      // Timer2 Prescaler = 128 (1 Sekunde)
  TIMSK2 = 0x01;      // Timer2 Interrupt Enable
  ASSR |= (1 << 5);   // Timer2 External Clock
}

int main(void)
{
  InitTimer2();
  //Sleep
  set_sleep_mode(SLEEP_MODE_PWR_SAVE);
  sleep_enable();
  //---

  DDRB = 0x01;
  sei();

  while(1)
  {
     sleep_cpu();
  }

}

ISR(TIMER2_OVF_vect)
{
  PORTB ^= 1;
}

mfg.

von Andi (Gast)


Lesenswert?

Vielen Dank für eure Antworten!

@Thomas:
Habe das Beispiel zur Timer-Initialisierung hier aus der 
Projekte-Sammlung auf Mikrocontroller.net (Zeitgesteurte 
Pflanzenbewässerung).
Dein Code-Beispiel habe ich ebenfalls einmal in meinen Controller 
geschrieben, hat leider nicht funktioniert.
Der Controller hat die ganze Zeit neugestartet... (die main-Methode 
selbst oberhalb der while-Schleife wurde immer wieder aufgerufen)!?

Aber ich konnte das Problem trotzdem dank des Posts von Falk lösen. Ich 
hätte dem Quarz mehr Einschwingzeit gönnen sollen. Ein Delay von 10ms 
reicht aus, dass der Code 1A funktioniert.
Ohne das Delay blinkt nichts, mit dem Delay tadellos! Vielen Dank!!!

von Falk B. (falk)


Lesenswert?

@  Andi (Gast)

>hätte dem Quarz mehr Einschwingzeit gönnen sollen. Ein Delay von 10ms
>reicht aus, dass der Code 1A funktioniert.

Sei mal nicht so knauserig. Warte wenigstens 100ms. 10ms sind für einen 
Uhrenquarz sehr knapp. Das kann im Einzelfall funktionieren, muss es 
aber nicht.

MFG
Falk

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.