Timer1 Zähler Schleife

OP #791862
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
@  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
OP
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
}
@ 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
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

Eine eigene Frage? Dieser Thread ist über 18 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.