Forum: Mikrocontroller und Digitale Elektronik Atmega8515: Timer1-Interruptroutine läuft nur ein Mal durch


von Matt B. (mattb)


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.

: Bearbeitet durch User
von Sitterbüss (Gast)


Lesenswert?

Ist WGM12 in TCCR1A???

von Matt B. (mattb)


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.

von Sitterbüss (Gast)


Lesenswert?

Könnte sein dass der Timer bis 65563 zählt?!

8000000/1024/65563= 0.019 Hz

von Sitterbüss (Gast)


Lesenswert?

0.119 Hz

von Matt B. (mattb)


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?

: Bearbeitet durch User
von Sitterbüss (Gast)


Lesenswert?

Doch, aber nur wenn Du mal den aktuellen Code zeigst, zum Raten bin ich 
ehrlich gesagt zu müde.

von Matt B. (mattb)


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.

: Bearbeitet durch User
von Sitterbüss (Gast)


Lesenswert?

TCCR1B |= (1<<WGM12) | (1<<CS12) | (1<<CS10); // Prescaler 1024 // CTC 
Mode

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.