mikrocontroller.net

Forum: Compiler & IDEs Timer1 Zähler Schleife


Autor: Michael Kentschke (mad_axe)
Datum:

Bewertung
0 lesenswert
nicht 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 :
volatile int timerCounter = 0;

Eine funktion die von main aufgerufen wird und die globale variable 
setzt :
void waitTime()
{
  timerCounter = 1000;
  #ifdef DEBUG
    printf("WarteZeit = %i\n", timerCounter);
  #endif
  /*while(timerCounter  > 0)
  {
    
  }*/
  #ifdef DEBUG
    printf("Ende = %i\n", timerCounter);
  #endif
}

Und hier die Interrupt Funktion :
//Timer1 Interupt Compare
SIGNAL (SIG_OUTPUT_COMPARE1A)
{
  if(timerCounter > 0)
  {
    timerCounter--;
  }
}


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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

>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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan "stefb" B. (stefan) Benutzerseite

Aber sicher. Wenn TimerCounter ==0.

MfG
Falk

Autor: Michael Kentschke (mad_axe)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

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:
void init_timer()
{
  //Vergleichswert für Timer Compare
  int vW = 11999; 
  OCR1AH = (vW  >>8);
  OCR1AL = vW;
  //CTC Modus, Vorteiler auf 1
  TCCR1B |= (1 << WGM12) | (1 << CS10);

  //Interrupt bei Timer Compare
  TIMSK |= (1 << OCIE1A);
}


Autor: Michael Kentschke (mad_axe)
Datum:

Bewertung
0 lesenswert
nicht 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 ????

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Kentschke wrote:

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

schreibst du besser so:

OCR1A = 11999;

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.