Forum: Mikrocontroller und Digitale Elektronik Atmega328p Timer ISR wird nicht ausgelöst


von Franz (Gast)


Lesenswert?

Mahlzeit,
ich versuche mich gerade mit einem Timerinterrupt auf einem Atmega328p 
(Arduino). Hier ist an PinB5 eine LED angeschlossen.
1
#define F_CPU 8000000
2
3
4
int main(void)
5
{
6
7
  /* PB5 als Ausgang fuer LED zum Testen */
8
  DDRB |= (1 << PINB5);
9
//  PORTB &= ~(1 << PINB5);
10
  PORTB |= (1 << PINB5);
11
  
12
    // 50 ms
13
    TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10); // CTC-Mode clkIO/64
14
    OCR1A = (6250-1);
15
    TIMSK1 = (1 << OCIE1A);
16
  
17
    while (1) 
18
    {
19
    
20
    } /* Ende while */
21
} /* Ende main */
22
23
24
ISR (TIMER1_COMPA_vect)
25
{
26
  static uint8_t ticks_u8 = 0;  // Anzahl der Aufrufe der ISR
27
28
    ticks_u8++;
29
    if(ticks_u8 >= 20)
30
    {
31
        ticks_u8 = 0;
32
        PORTB ^= (1 << PINB5);
33
    }
34
}
Eigentlich sollte die LED im sekundentakt an/aus gehen. Das Problem ist, 
dass sie entweder an oder aus bleibt (je nachdem wie ich diese 
initialisere).

Aber die ISR ist doch so richtig oder?

von erklehr behr (Gast)


Lesenswert?

Franz schrieb:
> Aber die ISR ist doch so richtig oder?

Hab es nicht durchforstet, aber versuch mal zunächst die
Interrupts global zu ermöglichen:
1
  sei();
Nachdem du den Timer konfiguriert hast.
Das wirst du auf jeden Fall brauchen.

Beitrag #6689828 wurde von einem Moderator gelöscht.
von Franz (Gast)


Lesenswert?

erklehr behr schrieb:
> Hab es nicht durchforstet, aber versuch mal zunächst die
> Interrupts global zu ermöglichen:  sei();

touche.
Das war es. Muss ich jetzt aber erst nochmal gucken, was und wozu das 
ist. Aber dankeschön :)

von erklehr behr (Gast)


Lesenswert?

Franz schrieb:
> Muss ich jetzt aber erst nochmal gucken, was und wozu das
> ist.

Versuchs mal hier: AVR-Tutorial: Interrupts

von erklehr behr (Gast)


Lesenswert?

Oder hier: Interrupt

von HildeK (Gast)


Lesenswert?

Franz schrieb:
> Das war es. Muss ich jetzt aber erst nochmal gucken, was und wozu das
> ist.

sei ; set global interrupt enable

Brauchst du immer, wenn du Interrupts verwenden willst.
Ist mir aber auch schon passiert ...
Deshalb steht in manchen meiner Quelltexte auch drin:
1
sei();  // wie immer: zunächst vergessen und sich dann gewundert :-)
😀

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.