Atmega8515: Timer1-Interruptroutine läuft nur ein Mal durch

OP #3553669
Lesenswert?

Hallo,

ich habe ein Problem bei der Verwendung des Timer1 von einem Atmega8515.
Er soll im CTC-Mode betrieben werden.

Hier die Initialisierung:
1
void Timer_Init(void)
2
{  
3
  // Timer 1 konfigurieren
4
  TCCR1A |= (1<<WGM12) | (1<<CS12) | (1<<CS10); // CTC Mode, Prescaler 1024
5
  // ((8000000MHz / 1024) / 50Hz ) = 156
6
  OCR1A = 156-1;
7
  
8
  // Compare Interrupt erlauben
9
  TIMSK |= (1<<OCIE1A);
10
  
11
  sei();
12
}

Und hier noch die Interruptroutine:
1
ISR(TIMER1_COMPA_vect)
2
{
3
  PORTD ^= ( 1 << PD7 );
4
}

Die LED wird nach dem Start ein Mal eingeschaltet, aber nicht mehr 
ausgeschaltet.

In der Main habe ich eine While-Endlosschleife.
Am PD7 ist eine LED angeschlossen, die definitiv funktioniert.

Kann mir jemand helfen?

Ich habe schon sehr viele unterschiedliche Sourcecodes im Netz mit 
meinem Code verglichen. Aber alleine habe ich noch keine Lösung 
gefunden.

Danke!

Edit: Anscheinend kommt es in meinem Programm zu einem Reset. Ich 
versuche mal herauszufinden, was den auslöst.
OP #3553736
Lesenswert?

Hmm, manchmal ist es im Nachhinein schon peinlich solche Fehler nicht 
selbst gefunden zu haben... :-/

Danke!

Eine Kleinigkeit habe ich noch:

Eigentlich wollte ich die Interruptroutine mit einer Frequenz von ca. 50 
Hz aufrufen lassen, damit ich um die 25 Hz an der LED bekomme. 
Allerdings wird die Routine nur alle ca. 8 Sekunden aufgerufen.

Mache ich was bei der Berechnung falsch?

Ich verwende ein 8MHz-Quarz. Die Fuses stimmen.

Mit _delay_ms(1000) bekomme ich eine Verzögerung von 1 Sekunde.
OP #3553769
Lesenswert?

Eigentlich sollte der Timer im CTC-Mode doch nur bis OCR1A laufen.
Aber eine Änderung von OCR1A ändert nichts an der Frequenz. Daher könnte 
das passen, dass der Timer bis 65536 läuft.

Kann ich dem Timer nicht einstellen, dass er nur bis OCR1A läuft und 
dann den Interrupt auslöst?
OP #3553785
Lesenswert?

Ok, hier der Code.

Initialisierung:
1
void LED_Init(void)
2
{
3
  // Timer 1 konfigurieren
4
  TCCR1A |= (1<<WGM12); // CTC Mode
5
  TCCR1B |= (1<<CS12) | (1<<CS10); // Prescaler 1024
6
  // ((8000000Hz / 1024) / 50Hz ) = 156
7
  OCR1A = 156-1;  //156
8
  
9
  TIMSK |= (1<<OCIE1A);
10
  
11
  sei();
12
}

An der Interruptroutine hat sich nichts geändert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren