Forum: Mikrocontroller und Digitale Elektronik kein Interrupt beim Mega16 - Gedankenfehler?


von Hans (Gast)


Lesenswert?

Hallo Jungs, ich habe eine kleine Routine in C (AVR-GCC) ATmega16 
geschrieben.
Leider funktioniert meine Interrupt-Routine nicht und ich weiß nicht 
warum. Vielleicht habe ich einen Gedankenfehler. Schaut doch mal bitte 
über den Code:
1
#include <avr\io.h>
2
#include <avr\interrupt.h>
3
#include <stdint.h>
4
5
uint8_t zaehler = 0;
6
7
ISR(TIMER0_COMP_vect) //Output Compare Interrupt
8
{
9
  zaehler++;
10
}
11
12
void timer_init(void)
13
{
14
  TCCR0 = (1<<WGM01) | (1<<CS02);   // Prescaler auf 256 --> 1MHz / 256 = 4 kHz
15
                      
16
  TIMSK = (1<<OCIE0);  // Output Compare Interrupt Enable - 
17
                        // -> Interrupt bei Compare mit OCR0 einschalten
18
  OCR0 = 212;           // Zeitpunkt für Interrupt
19
  TCNT0 = 0x00;         // Zählerregister auf 0 setzen
20
}
21
22
int main (void)
23
{
24
25
  uint8_t ergebnis = 0;
26
27
  DDRB = 0xff;  // Port B ist Output
28
  PORTB = 0xff; //LED's ausschalten (invers am Board)
29
30
  timer_init();
31
32
  while(1) // Programmschleife
33
  {
34
    sei();
35
    ergebnis = zaehler % 8; // modulo
36
    PORTB = ~(1<<ergebnis);
37
  }
38
}

von Daniel C. (cecky)


Lesenswert?

Ich würde zaehler mal als volatile deklarieren, und sei() vor die while 
schieben. Einmal Interrupts einschalten sollte ja reichen :-)

von mork (Gast)


Lesenswert?

Deklarier zaehler als volatile.

MfG mark

von Hans (Gast)


Lesenswert?

Ja klar!

Das wars natürlich. X-mal gemacht und einmal "mal ebend" was 
programmieren - und schon passieren solche flüchtigkeitsfehler.

Super Vielen Dank nochmal

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.