Forum: Compiler & IDEs 16 Bit Timer Problem


von Jan M. (jan_m)


Lesenswert?

Hey!

Folgende Aufgabe: Bei Antasten soll der Timer im CTC Modus anlaufen, bei 
erreichen des Wertes in OCR1A den ISR auslösen und dann was abschalten.
Im nächsten Durchlauf soll er aber ja wieder bei 0 loslaufen.

Ich habe es so versucht aber es kommen unterschiedliche Zeiten bei 
rum...

ISR (TIMER1_COMPA_vect)
{
  TCCR1B &= ~(1 << CS12);
  TCCR1B &= ~(1 << CS10);
  Zeit = 0;
}


int main()
{
sei();
OCR1A= 15000;

if (...)
{
TCCR1B = (1 << CS12) | (1 << CS10);    // Prescaler: 1/1024

  while (Zeit)
      {
          PORTB|= (1<<PB1);
      }
  PORTB &= ~(1<<PB1);
  Zeit=1;
}
}


Bitte helft mir! ;-)

von Krapao (Gast)


Lesenswert?

Es fehlen wichtige Teile der Timer-Initialisierung u.a. das Enable und 
die Moduseinstellung. Wundert mich dass du irgendeinen Effekt hast.

von Jan M. (jan_m)


Angehängte Dateien:

Lesenswert?

Mal wieder etwas schnell abgeschickt, sry!
Die folgenden Sachen sind drin:

TCCR1B = (1 << WGM12);
TIMSK |= (1 << OCIE1A);
OCR1A = 15000;

Wollte nicht zu viel Code reinpacken wegen der Übersichtlichkeit, aber 
im Anhang ist das ganze Ding zu finden.

Danke schonmal für die Hilfe!

von Krapao (Gast)


Lesenswert?

Zwei Auffälligkeiten:

> Im nächsten Durchlauf soll er aber ja wieder bei 0 loslaufen.

Vor dem Restart des Timers durch Anschalten des Taktes würde ich den 
Timerzähler TCNTx auf 0 setzen.

>     TCCR1B = (1 << CS12) | (1 << CS10);    // Prescaler: 1/1024

Zerstört die Einstellung des Timermodus (TCCR1B = (1 << WGM12);)

In die Schalterlogik, d.h. den eigentlichen Programmablauf habe ich mich 
nicht reingefuxt.

von Jan M. (jan_m)


Lesenswert?

Super danke! Der Tipp mit dem TCNT1 war goldrichtig.

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.