Forum: Mikrocontroller und Digitale Elektronik Seltsames Problem mit Timer2 Atmega1284p


von David P. (devryd)


Lesenswert?

Hallo Zusammen,
ich bin eben auf ein seltsames Problem mit Timer2 gestoßen. Und zwar 
läuft der Timer aus irgedeinem Grund nicht im Power_Save Mode.
Was ich nicht verstehe ist, dass ich genau den gleichen Code Teil auf 
einem anderen Atmega1284p am laufen habe. Das einzige, was ich auf dem 
anderen Atmega anders gemacht habe, ist ein anderer Prescaler, aber das 
kann ja eigentlich nicht das Problem sein. An TOSC habe ich einen 
Uhrenquarz angeschlossen. Jemand ne Idee, was ich falsch gemacht habe?
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
#include <avr/sleep.h>
4
volatile int count=0;
5
6
int main(void){
7
  
8
    // Timer 2 konfigurieren
9
    GTCCR |= (1 << TSM) | (1 << PSRASY);  //Timer anhalten, Prescaler Reset
10
    ASSR = (1 << AS2);                    //Asynchron Mode einschalten
11
    TCCR2A = (1 << WGM21);                //CTC Modus
12
    TCCR2B = (1 << CS22) | (1 << CS21) | (1<< CS20);   //Prescaler 1024
13
    OCR2A = 128;
14
    while(ASSR & ((1<<TCN2UB) | (1<<OCR2AUB) | (1<<OCR2BUB) |  (1<<TCR2AUB) | (1<<TCR2BUB)));
15
  
16
  TIMSK2 |= (1<<OCIE2A); 
17
  GTCCR &= ~(1 << TSM);  
18
  sei();
19
  
20
  DDRB=0x01;
21
22
    while (1) {
23
//    set_sleep_mode(SLEEP_MODE_PWR_SAVE);
24
//    sleep_mode();  
25
    }
26
}
27
28
ISR (TIMER2_COMPA_vect){ //alle 4 Sekunden  
29
  if(count%2)
30
    PORTB=0x01;
31
  else
32
    PORTB=0;
33
  ++count;
34
}

von S. Landolt (Gast)


Lesenswert?

Wird wohl die Hardware sein - das Programm läuft bei mir.

von David P. (devryd)


Lesenswert?

S. Landolt schrieb:
> Wird wohl die Hardware sein - das Programm läuft bei mir.

Ah vielen Dank, dann kann ich ja lange Fehler in Software suchen...

von S. Landolt (Gast)


Lesenswert?

Wie gesagt, das Programm, 1:1 übernommen, läuft hier, auf einem 
Steckbrett mit Standard-Fuses. Aber ich möchte auf das Datenblatt 
'Asynchronous Operation of Timer/Counter2', Unterpunkt '- If 
Timer/Counter2 is used to wake the device up from Power-save ...' 
hinweisen ("... the interrupt will not occur, and the device will fail 
to wake up").

von Oliver S. (oliverso)


Lesenswert?

David P. schrieb:
> Das einzige, was ich auf dem
> anderen Atmega anders gemacht habe, ist ein anderer Prescaler, aber das
> kann ja eigentlich nicht das Problem sein.

Was es im Zusammenhang mit dem Hinweis von S. Landolt dann wohl doch 
ist.

Oliver

von David P. (devryd)


Lesenswert?

S. Landolt schrieb:
> Wie gesagt, das Programm, 1:1 übernommen, läuft hier

Da sind die Sleep modes aber auch auskommentiert

von S. Landolt (Gast)


Lesenswert?

Ah - jetzt - ja. Da hatte ich gedacht, mal eben schnell in der 
Kaffeepause ...

Also, dann wie es im Datenblatt steht, so etwas in der Art
1
OCR2A = 128;
2
while(ASSR & ((1<<TCN2UB) | (1<<OCR2AUB) | (1<<OCR2BUB) |  (1<<TCR2AUB) | (1<<TCR2BUB)));
vor das 'sleep_mode();'.

von David P. (devryd)


Lesenswert?

S. Landolt schrieb:
> Ah - jetzt - ja. Da hatte ich gedacht, mal eben schnell in der
> Kaffeepause ...

Ah vielen Dank, das hilft.
In dem anderen Projekt, in dem ich von Timer2 aufwachen wollte, ist noch 
einiges anderes passiert, deshalb ist das wohl nicht aufgefallen.

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.