Forum: Mikrocontroller und Digitale Elektronik Atmega128 Timer0 ISR wird nicht ausgeführt


von Spice (Gast)


Lesenswert?

Sieht jemand den Fehler?
Der Timer triggert leider nicht meine LED.
Der Controller läuft mit einem 14.7456MHz Quarz, bei einem Prescaler von 
1024 erwarte ich 14400 Interrupts in der Sekunde. Bei einer Zählvariable 
von 5000 sollte ich doch etwas an der LED sehen. Die flackert nicht mal. 
Vielleicht sieht jemand den Fehler, ich probier jetzt seit 2std rum...

Vielen Dank und Gruß
Spice

[c]

//Atmega128L, STK500

#include    <avr/io.h>
#include    <avr/interrupt.h>
#include    "defines.h"
#define F_CPU 14745600L

void Timer_start(void);
void Timer_stop(void);

volatile unsigned int timer=0;

ISR(TIMER0_OVF_vect)
{
  timer++;
  if (timer >= 5000)
    {
    timer = 0;
    PORTB ^= (1 << LED1);
    }
}


int main (void)
{
DDRB |= (1 << LED1);
Timer_start();
sei();
  while(1)
    {
      ;
    }

return 0;
}

void Timer_start(void)
{
  timer = 0;
  TCCR0 = 0;    //Register resetten
  TIMSK = (1 << TOIE0);  //Overflow Interrupt enablen
  TCCR0 |= (1 << CS02);
  TCCR0 |= (1 << CS01);
  TCCR0 |= (1 << CS00);  //Prescaler 1024, Timer starten
  TCNT0 = 0;
}

void Timer_stop(void)
{
  timer = 0;
  TCCR0 = 0;
  TIMSK &= ~(1 << TOIE0);
  TCNT0 = 0;
}
[\c]

von Spice (Gast)


Lesenswert?

SORRY
1
//Atmega128L, STK500
2
3
#include    <avr/io.h>
4
#include    <avr/interrupt.h>
5
#include    "defines.h"
6
#define F_CPU 14745600L
7
8
void Timer_start(void);
9
void Timer_stop(void);
10
11
volatile unsigned int timer=0;
12
13
ISR(TIMER0_OVF_vect)
14
{
15
  timer++;
16
  if (timer >= 5000)
17
    {
18
    timer = 0;
19
    PORTB ^= (1 << LED1);
20
    }
21
}
22
23
24
int main (void)
25
{
26
DDRB |= (1 << LED1);
27
Timer_start();
28
sei();
29
  while(1)
30
    {
31
      ;
32
    }
33
34
return 0;
35
}
36
37
void Timer_start(void)
38
{
39
  timer = 0;
40
  TCCR0 = 0;    //Register resetten
41
  TIMSK = (1 << TOIE0);  //Overflow Interrupt enablen
42
  TCCR0 |= (1 << CS02);
43
  TCCR0 |= (1 << CS01);
44
  TCCR0 |= (1 << CS00);  //Prescaler 1024, Timer starten
45
  TCNT0 = 0;
46
}
47
48
void Timer_stop(void)
49
{
50
  timer = 0;
51
  TCCR0 = 0;
52
  TIMSK &= ~(1 << TOIE0);
53
  TCNT0 = 0;
54
}

von Stefan E. (sternst)


Lesenswert?

Spice schrieb:
> Der Controller läuft mit einem 14.7456MHz Quarz, bei einem Prescaler von
> 1024 erwarte ich 14400 Interrupts in der Sekunde. Bei einer Zählvariable
> von 5000 sollte ich doch etwas an der LED sehen.

Nein, es sind 56,25 Interrupts pro Sekunde (14745600/1024/256), und bei 
einer Zählvariablen von 5000 blinkt die LED dann ungefähr alle 89 
Sekunden. Wartest du so lange?

von Spice (Gast)


Lesenswert?

Danke für die Antwort,

jo warte schon etwas länger, ca 2.5std jetzt :-)
Aber der Controller scheint irgendwie durchzudrehen... Der läßt sich 
jetzt nicht mehr Programmieren, obwohl die Fuses richtig gesetzt sind.

von Spice (Gast)


Lesenswert?

so nun läßt er sich wieder programmieren. Aber trotzdem keine 
Interrupts... Kann es an der Timer-Initialisierung liegen, ich meine ist 
zwar nicht viel was man falsch machen kann, aber komischerweise kommt 
kein Interrupt?

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Also erstmal den Puls des kleinen Patienten fühlen...

Wie schnell blinkt das folgende Programm, wenn du es mit -Os 
Optimieroption übersetzt?
1
//Atmega128L, STK500
2
3
#define F_CPU 14745600L
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include "defines.h"
7
8
int main (void)
9
{
10
  DDRB |= (1 << LED1);
11
  while(1)
12
    {
13
      PORTB ^= (1 << LED1);
14
      _delay_ms(1000);
15
    }
16
}

von Spice (Gast)


Lesenswert?

genau das hatte ich auch getestet, bevor ich mit dem Interrupt 
angefangen hab, "sekundengenau" (komischerweise!!!)... Weil ich vermute 
dass es entweder an den Fuses oder an den Jumper Einstellungen beim 
STK500/501 lag.

von Karl H. (kbuchegg)


Lesenswert?

Ist deine LED ein oder aus?

Lass doch mal den Teiler in der iSR weg.
Wenn die ISR aufgerufen wird, dann sollte die LED so mit halber 
Helligkeit leuchten.

Blöde Frage:
Die M103C Fuse ist nicht zufällig noch eingeschaltet?
Bei normalen Funktionen kommt der Compiler noch mit inlinen um den 
Funktionsaufruf rum. Aber spätestens bei ISR Aufrufen ist diese Fuse 
tödlich.

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.