Timer1 Zähler Schleife

#791862
Lesenswert?

Hallo,

ich habe mal wieder ein Problem. Ich verwende den Timer1 des Atmega8. 
Dieser Funktioniert soweit auch so wie er soll. Es geschieht jede 1ms 
ein Interrupt.

Nun habe ich folgendes gemacht :

Eine globale variable :
1
volatile int timerCounter = 0;

Eine funktion die von main aufgerufen wird und die globale variable 
setzt :
1
void waitTime()
2
{
3
  timerCounter = 1000;
4
  #ifdef DEBUG
5
    printf("WarteZeit = %i\n", timerCounter);
6
  #endif
7
  /*while(timerCounter  > 0)
8
  {
9
    
10
  }*/
11
  #ifdef DEBUG
12
    printf("Ende = %i\n", timerCounter);
13
  #endif
14
}

Und hier die Interrupt Funktion :
1
//Timer1 Interupt Compare
2
SIGNAL (SIG_OUTPUT_COMPARE1A)
3
{
4
  if(timerCounter > 0)
5
  {
6
    timerCounter--;
7
  }
8
}

Wenn ich die While Schleife auskommentiere (so wie jetzt im Code) geht 
es ohne Probleme. Mache ich sie rein, bleibt er irgendwie da hängen (im 
AVR Studio Debugger geht es, in Real aber nicht). Habe schon zig Debug 
ausgaben gemacht um den Fehler zu finden :)

Beim Compiler sind jegliche Optimierungen ausgeschaltet, weil ich erst 
dachte er optimiert mir z.B. die while Schleife weg, aber das war es 
auch nicht.

Vielleicht hat ja einer von euch noch eine Idee...

Gruß
Micha
#791889
Lesenswert?

@  Michael Kentschke (mad_axe)

>//Timer1 Interupt Compare
>SIGNAL (SIG_OUTPUT_COMPARE1A)

Das ist veraltet, das heisst heute ISR()

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

>es ohne Probleme. Mache ich sie rein, bleibt er irgendwie da hängen (im
>AVR Studio Debugger geht es, in Real aber nicht). Habe schon zig Debug

Wahrscheinlich ist deine Timerinitialisierung nicht OK.

MfG
Falk
#791899
Lesenswert?

Falk Brunner wrote:
> @  Michael Kentschke (mad_axe)
>
>>//Timer1 Interupt Compare
>>SIGNAL (SIG_OUTPUT_COMPARE1A)
>
> Das ist veraltet, das heisst heute ISR()
>
> 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmieren_mit_Interrupts

Habe ich geändert, bringt aber auch leider nix.

>>es ohne Probleme. Mache ich sie rein, bleibt er irgendwie da hängen (im
>>AVR Studio Debugger geht es, in Real aber nicht). Habe schon zig Debug
>
> Wahrscheinlich ist deine Timerinitialisierung nicht OK.

Glaube ich nicht so richtig, da es ja ohne die While Schleife geht, z.B. 
wenn ich mir in der Interrupt Routine innerhalb der Bedingung ein 'a' 
auf der Konsole ausgeben lasse, bekomme ich auch genau 1000 Stück.

Aber da man sich ja nie sicher sein kann, hier nochmal die Timer Init:
1
void init_timer()
2
{
3
  //Vergleichswert für Timer Compare
4
  int vW = 11999; 
5
  OCR1AH = (vW  >>8);
6
  OCR1AL = vW;
7
  //CTC Modus, Vorteiler auf 1
8
  TCCR1B |= (1 << WGM12) | (1 << CS10);
9

10
  //Interrupt bei Timer Compare
11
  TIMSK |= (1 << OCIE1A);
12
}
#791903
Lesenswert?

@ Michael Kentschke (mad_axe)

>Habe ich jetzt beim Tippen des Post irgendeinen Post verpasst der schon
>wieder gelöscht ist ????

Ja.

Wenn die Ausgabe der 1000 a funktioniert (hast du die nachgezählt . . 
.?) dann klemmt die Säge woanders. Das kann man nur mit vollständigem 
Quelltext beurteilen.

MFG
Falk
Persönliche Seite #791931
Lesenswert?

Michael Kentschke wrote:
> Falk Brunner wrote:
>> @ Stefan "stefb" B. (stefan) Benutzerseite
>>
>> Aber sicher. Wenn TimerCounter ==0.
>>
>> MfG
>> Falk
>
> Habe ich jetzt beim Tippen des Post irgendeinen Post verpasst der schon
> wieder gelöscht ist ????

Ja, ich habe beim Korrekturlesen (mache ich seit ich so viele Tippflher 
produziere) meinen Quatsch selbst eingesehen und gelöscht. Muss ja den 
OP nicht zusätzlich verwirren. Sorry, dass du die falsche Antwort noch 
sehen musstest.

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