AVR Atmega32 while mit Timer Interrupt unterbrechen

Gast #4367392
Lesenswert?
• ▲
▼
Hallo,

ich bin noch relativ neu im uC programmieren und habe folgendes Problem.
Ich möchte eine while Schleife mit dem Overflow Interrupt meines Timers1
stoppen. Der Overflow Interrupt funktioniert wenn ich die while Schleife 
auskommentiere(und ein delay einfüge). Wenn er jedoch in der while 
Schleife ist, springt er nicht in den Interrupt bzw. er ruft ihn nicht 
auf (habs mit Breakpoints versucht).

Hier die Funktionen bzw. der Code:
1
static volatile char checkForOF;
2

3
void initTimer1(){
4
    TCCR1A &=~((1<<WGM10)|(1<<WGM11));   //normal Mode
5
    TCCR1B &=~((1<<WGM12)|(1<<WGM13));  
6
     TIMSK |= (1<<TOIE1);  //activates the overflow interrupt
7
}
8

9
void startMeasuring(){    
10
    unsigned int value;
11
    unsigned int oldADC=readADC();  
12
    unsigned int newADC;
13
    checkForOF=1;
14
    
15
    TCCR1B |= ((1<<CS10)|(1<<CS11));    
16
    TCCR1B &= ~(1<<CS12);  //start Timer 1
17
    
18
    while(checkForOF){  //as long as no interrupt
19
    newADC=readADC();    
20
    if(newADC>oldADC){    
21
      value=TCNT1;
22
      }
23
    }
24
    TCCR1B &=~ ((1<<CS12)|(1<<CS11)|(1<<CS10));//stop Timer 1
25
     TCNT1=0;            
26
}
27

28
ISR(TIMER1_OVF_vect){
29
  checkForOF=0;
30
}

Ich hoffe ihr könnt mir weiterhelfen.
Danke für eure Hilfe
Lukas
#4367438
Lesenswert?
• ▲
▼
@ Luki (Gast)

>Ich möchte eine while Schleife mit dem Overflow Interrupt meines Timers1
>stoppen.

Kann man machen. Das static ist eher nicht nötig.

> Der Overflow Interrupt funktioniert wenn ich die while Schleife
>auskommentiere(und ein delay einfüge). Wenn er jedoch in der while
>Schleife ist, springt er nicht in den Interrupt bzw. er ruft ihn nicht
>auf (habs mit Breakpoints versucht).

Vielleicht fehlt die Interruptfreigabe mit sei()?

>Hier die Funktionen bzw. der Code:

Stehen die alle in EINER Datei? Wenn nicht, ist das static hier 
kontraproduktiv.

>static volatile char checkForOF;
(Firma: matzetronics) #4367631
Lesenswert?
• ▲
▼
Luki schrieb:
> void initTimer1(){
>     TCCR1A &=~((1<<WGM10)|(1<<WGM11));   //normal Mode
>     TCCR1B &=~((1<<WGM12)|(1<<WGM13));
>      TIMSK |= (1<<TOIE1);  //activates the overflow interrupt
> }

Da sehe ich nichts von 'Normal Mode'. Das ist der 'Fast PWM' Mode mit 
OCR1A als TOP. Da OCR1A nicht initialisiert wird, steht es vermutlich 
auf null und erzeugt dadurch entweder gar keinen oder einen Regen von 
IRQs. Das steht aber auch so im Datenblatt.
Es ist übrigens gute Praxis, das TOV1 Flag einmal zu löschen, wenn man 
die Kiste initialisiert:
TIFR = (1 << TOV1);
(Firma: matzetronics) #4368188
Lesenswert?
• ▲
▼
Oliver S. schrieb:
> Es ist noch bessere Praxis, den Timer erst zu initialisieren, und dann
> zu starten, und ansonsten dem Datenblatt zu Folgen. Damit erübrigen sich
> alle fragwürdigen "gute Praxis" Tips.

Blablabla. Wieder mal prima aus dem Zusammenhang heraus zitiert. Zur 
Intialisierung habe ich davor was geschrieben, Dummquatscher.
Und einen pending IRQ vor dem Starten des Timers zu löschen, ist gute 
Praxis. Wie wärs einfach mal mit Schnauze halten, wenn man keine Ahnung 
hat?
Gast #4368215
Lesenswert?
• ▲
▼
Matthias S. schrieb:
> Luki schrieb:
>> void initTimer1(){
>>     TCCR1A &=~((1<<WGM10)|(1<<WGM11));   //normal Mode
>>     TCCR1B &=~((1<<WGM12)|(1<<WGM13));
>>      TIMSK |= (1<<TOIE1);  //activates the overflow interrupt
>> }
>
> Da sehe ich nichts von 'Normal Mode'. Das ist der 'Fast PWM' Mode ...

Könnten Sie das näher erläutern?
Gast #4368279
Lesenswert?
• ▲
▼
Ihn dünkt', er säh' den "normal mode",
ihm schien das sonnenklar.
Er guckt' noch mal und merkt, dass da
der Matze andrer Meinung war.
"Itzt wüsst ich gar zu gern," sprach er,
"lieg ich hier falsch, was ist nun wahr?"

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