Timer läuft nicht mehr richtig

Gast #6221446
Lesenswert?
• ▲
▼
Hallo,

ich hatte einen Timer (Atmega328P), welchen ich wie folgt erstellt habe
1
void timer1_init()
2
{
3
//  /* 20 ms */
4
//  //TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10); // CTC-Mode clkIO/64
5
//  //OCR1A = (5000-1);
6
//  //TIMSK1 |= (1 << OCIE1A);
7

8
  /* 10 ms */
9
  TCCR1B |= (1 << WGM12) | (1 << CS11) | (1 << CS10); // CTC-Mode clkIO/64
10
  OCR1A = (2500-1);
11
  TIMSK1 |= (1 << OCIE1A);
12
}

Dieser lief auch. Getestet mit einer LED, die ich in der ISR sekündlich 
getoggelt habe.
Jetzt wollte ich die Funktion umschreiben, um gleiche auch für andere 
Timer zu benutzen.
1
timer_init(volatile uint8_t* counterRegisterA, uint8_t counterRegisterANewSate,
2
      volatile uint8_t* counterRegisterB, uint8_t counterRegisterBNewSate,
3
      volatile uint8_t* outputCompareUnit, uint16_t outputCompareUnitNewState,
4
      volatile uint8_t* interruptMaskRegister, uint8_t interruptMaskRegisterNewState)
5
{
6
  *counterRegisterA |= counterRegisterANewSate;
7
  *counterRegisterB |= counterRegisterBNewSate;
8
  *outputCompareUnit |= outputCompareUnitNewState;
9
  *interruptMaskRegister |= interruptMaskRegisterNewState;
10
}

aufgerufen habe ich diese
1
  timer_init(&TCCR1A, 0,
2
        &TCCR1B, ((1 << WGM12) | (1 << CS11) | (1 << CS10)), // CTC-Mode clkIO/64
3
        &OCR1A, (2500-1),
4
        &TIMSK1, (1 << OCIE1A));


Jetzt sehe ich, dass die LED viel schneller blinkt.
Woran liegt das? Wahrscheinlich habe ich jetzt den Timer falsch 
erstellt. Ich sehe aber keinen Fehler, da es ja auch eigentlich nur 1 zu 
1 kopiert ist.
Beitrag #6221460 wurde von einem Moderator gelöscht.
Gast #6221541
Lesenswert?
• ▲
▼
S. Landolt schrieb:
> Nur interessehalber: welchen Sinn sollen all diese Veroderungen haben,
> ganz speziell aber bei OCR1A?

beim OCR1A ist es falsch und könnte sogar zum falschen Ergebnis führen.
Bei den anderen habe ich es immer so gemacht, da manchmal auch mehrere 
Werte in das Register eingetragen werden und somit nichts überschriben 
wird.
Gast #6221587
Lesenswert?
• ▲
▼
S. Landolt schrieb:
> Kann ich beim hier vorliegenden Fall, Initialisierung, nicht
> nachvollziehen.

So wurde es uns beigebracht. Es gab auch eine Begründung warum man das 
so macht. Diese weiß ich allerdings nicht mehr. Habe es aber immer schon 
so gemacht.

Jetzt auf dem ersten Blick, konnte ich auch kein Register finden, 
welches aus irgendwelchen Gründen doppelt beschrieben wird, wodurch |= 
nötig wäre
Gast #6221611
Lesenswert?
• ▲
▼
> ... immer schon so gemacht

Ist ganz einfach: die timer_init zuerst mit
1
((1 << WGM12) | (1 << CS11) | (1 << CS10)), // CTC-Mode clkIO/64
anschließend mit
1
((1 << WGM12) | (1 << CS12) ), // CTC-Mode clkIO/256
aufrufen und schauen, was passiert.

Antwort schreiben

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.

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.