Timer1_Overflow interrupt_funzt nicht atmega32

Gast #1435550
Hallo...

Bin gerade verzweifelt auf der Suche nach dem Fehler:
Und zwar möchte ich dass periodisch nach Ablauf von 1ms eine Variable 
inkrementiert wird und diese gleichzeitig in der Mainfunktion oder in 
anderen Funktionen auslesbar sind:
Als Hardware verwende ich die mikrosps mit atmega32 controller mit einer 
Taktfrequenz von 16 MHz, wobei dieser dann über das stk 500 board 
geflasht wird.

siehe folgenden Code:
1
#define TAKT 16 000 000UL //Systemtakt 16 MHz
2
#define Teiler 65536UL-(TAKT/256UL)
3

4
unsigned int global_time=0;
5
unsigned int task_time=500; //nach 500 ms wird global_time resetet (auf //0 gesetzt) zusätzlich soll eine LED nach 500 ms an PORTB getoggelt werden
6

7
//ISR
8
SIGNAL (TIMER_OVERFLOW1)
9
{
10
TCNT1=Teiler;//timer1 Anfangswert
11
//schalte alle Interrupt aus
12
   cli();
13
global_time++;
14
if(global_time>task_time)
15
{
16
global_time=0;
17
PORTB^=(1<<4);
18
}
19
//bewillige alle Interrupts wieder
20
  sei();
21

22
}
23
//Hauptfunktion für Parametrisierung
24
int main(void){
25

26
DDRB=0xFF; // PortB als Ausgang
27
TCCR1A=0x00;//Compare A aus
28
TCCR1B=0x04;//Prescaler 16 Mhz/256=62500 Hz
29

30
TCNT1=Teiler;//timer1 Anfangswert
31

32
TIMSK|=(1<<TOIE1); Interrupt frei
33
sei();//I=1: alle Interrupts frei
34

35
while(1){};//leere Endlosschleife
36

37
return 0;
38
}
Leider funzt es nicht. Könnt ihr mir helfen...Bin verzwiefelt


gruß cler
cli() und sei() haben in der ISR nichts zu suchen.
SIGNAL sperrt sowieso die anderen ISRs.
Statt TCNT1 immer vorzuladen wäre der CTC Modus was für dich.
Probiers mal mit volatile für die Variable global_time, sonst wirst in 
der Main Funktion nicht viel auslesen können (hier sowieso, da sie leer 
ist).
Oliver schrieb:
> SIGNAL ist veraltet, allerdings schadet das (noch) nicht. Trotzdem
> solltest du auf ISR umstellen.
Kommt auf die avr-libc, die er verwendet, an. Auf der Uni haben wir auch 
eine ältere Version, wo man noch SIGNAL für ununterbrechbare und ISR für 
unterbrechbare ISRs verwenden muss. Da können wir auch nicht selber 
upgraden.

> Selbst erfundene Interruptvektoren dagegen führen unweigerlich zur
> Verzweiflung. Der Vektor heisst SIG_OVERFLOW1(veraltet) oder
> TIMER1_OVF_vect. TIMER_OVERFLOW1 gibt es nicht.
Da man hier keinen einzigen #include sieht (Absicht oder Fehler) weiß 
man nicht obs evtl ein eigenes Makro ist was irgendwo drinsteht oder vl 
vorher noch wo steht. Ist aber unwahrscheinlich und ich geb dir deshalb 
Recht. Natürlich is das zur verwendeten avr-libc passende Makro zu 
nehmen.
Gast
Abgesehen vom falschen Namen der ISR (SIGNAL-Routine): Die Einstellung 
für 1ms stimmt nicht, weil Teiler falsch berechnet wird. Dein Timer 
braucht wesentlich länger bis zur ISR (1000x so lang). Benutze deshalb 
die Zeile: #define Teiler 65536-(TAKT/1000/256)
Gast
Hi

>Abgesehen vom falschen Namen der ISR (SIGNAL-Routine): Die Einstellung
>für 1ms stimmt nicht, weil Teiler falsch berechnet wird. Dein Timer
>braucht wesentlich länger bis zur ISR (1000x so lang). Benutze deshalb
>die Zeile: #define Teiler 65536-(TAKT/1000/256)

Abgesehen davon ist der Overflow-Interrupt mit Preload eh das 
ungeeignete Mittel. Dafür gibt es die OC-Register und den CTC-Mode.

MfG Spess

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.