mikrocontroller.net

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


Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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]

Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SORRY
//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;
}

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also erstmal den Puls des kleinen Patienten fühlen...

Wie schnell blinkt das folgende Programm, wenn du es mit -Os 
Optimieroption übersetzt?
//Atmega128L, STK500

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

int main (void)
{
  DDRB |= (1 << LED1);
  while(1)
    {
      PORTB ^= (1 << LED1);
      _delay_ms(1000);
    }
}

Autor: Spice (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.