Forum: Compiler & IDEs Timer1 Zähler Schleife


von Michael K. (mad_axe)


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

von Falk B. (falk)


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

von Falk B. (falk)


Lesenswert?

@ Stefan "stefb" B. (stefan) Benutzerseite

Aber sicher. Wenn TimerCounter ==0.

MfG
Falk

von Michael K. (mad_axe)


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
}

von Michael K. (mad_axe)


Lesenswert?

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 ????

von Falk B. (falk)


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

von Simon K. (simon) Benutzerseite


Lesenswert?

Michael Kentschke wrote:

int vW = 11999;
OCR1AH = (vW  >>8);
OCR1AL = vW;

schreibst du besser so:

OCR1A = 11999;

von Stefan B. (stefan) Benutzerseite


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.

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.