Forum: Mikrocontroller und Digitale Elektronik Timer1_Overflow interrupt_funzt nicht atmega32


von cler (Gast)


Lesenswert?

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

von STK500-Besitzer (Gast)


Lesenswert?

versuch's mal mit volatile

von Christopher G. (cbg)


Lesenswert?

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).

von Oliver (Gast)


Lesenswert?

SIGNAL ist veraltet, allerdings schadet das (noch) nicht. Trotzdem 
solltest du auf ISR umstellen.

Selbst erfundene Interruptvektoren dagegen führen unweigerlich zur 
Verzweiflung. Der Vektor heisst SIG_OVERFLOW1(veraltet) oder 
TIMER1_OVF_vect. TIMER_OVERFLOW1 gibt es nicht.

guggst du hier:
http://www.nongnu.org/avr-libc/user-manual/group__avr__interrupts.html

Oliver

von Christopher G. (cbg)


Lesenswert?

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.

von Gast (Gast)


Lesenswert?

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)

von spess53 (Gast)


Lesenswert?

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

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.