ISR Routine ständig aktiv??

Gast #1741951
Lesenswert?

Hallo,

Ich versuche mit Timer0 und Interrupt service Routine von Atmega128
zu üben, den Quellcode befindet sich unten.
Das Proramm befindet sich ständig in der ISR Routine.
In der ISR soll die Variable inkremntiert und nach erreichen von
100 soll neu hochzählen.
Wo liegt meine Fehler?

Danke

//----------------------------------
#include <avr/io.h>
#include <avr/interrupt.h>

unsigned int var;

void init_tim0(void)
{
  TCCR0 = (1 << WGM01) | (0 << CS02) | (1 << CS01) | (1 << CS00);
  OCR0 = 114;
  TIMSK = (1<<OCIE0);
}

ISR (SIG_OUTPUT_COMPARE0)
{
  var = var + 1;
}

int main (void)
{

  var  = 0;
  init_tim0();
  sei();

  while(1)
  {
    if (var == 100) var = 0;
  }
  return 0;
}
#1741959
Lesenswert?

Dein Fehler ist, so seltsam es auch klingen mag:

Du hast bei der Definition von var das volatile vergessen.

Dadurch hat dir der Compiler aus der Hauptschleife alles rausgeworfen 
und dadurch sieht es dann im Debugger so aus, als ob nur noch die ISR 
laufen würde.
1
//----------------------------------
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4

5
volatile unsigned int var;
6

7
void init_tim0(void)
8
{
9
  TCCR0 = (1 << WGM01) | (0 << CS02) | (1 << CS01) | (1 << CS00);
10
  OCR0 = 114;
11
  TIMSK = (1<<OCIE0);
12
}
13

14
ISR (SIG_OUTPUT_COMPARE0)
15
{
16
  var = var + 1;
17
}
18

19
int main (void)
20
{
21

22
  var  = 0;
23
  init_tim0();
24
  sei();
25

26
  while(1)
27
  {
28
    if (var == 100) var = 0;
29
  }
30
  return 0;
31
}

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