Hallo allerseits, ist es in einem laufenden Programm erlaubt, mehrmals die interrupt-Initialisierung für den 16Bit Timer durchzuführen, um unterschiedliche Werte in die OCR1A Register zu schreiben? Konkret einmal die init-Funktion so durchlaufen, wie hier angegeben, und danach nochmal das gleiche mit einem anderen Wert für OCR1A, oder muss der Timer dafür erst abgeschaltet werden? void timer1_init(void) { TCCR1A &= ~(1<<WGM10); // CTC Modus TCCR1A &= ~(1<<WGM11); // TCCR1B |= (1<<WGM12); // TCCR1B &= ~(1<<WGM13); // CTC-Modus 4 with TCCR1B &=~ (1<<CS10); // Prescaler 8 Bits: CS12, CS11, TCCR1B |= (1<<CS11); TCCR1B &=~ (1<<CS12); // ((4000000/8)/1000) = 500 OCR1A = (500-1); TIMSK |= (1<<OCIE1A); } mfg
Du kannst einen neuen Wert nach OCR1A schreiben, wann immer du willst. Was dann genau passiert, steht im Datenblatt. Die init-routine muß dafür nicht erneut aufgerufen werden. Es schadet aber auch nicht, da init() halt nur die Bits nochmals setzt oder rücksetzt, die im ersten Durchlauf auch so gesetzt wurden. Oliver
Verboten ist das nicht, aber warum änderst Du - nach dem Du schon alles initialisiert hast und nur OCR1A ändern möchtest - nicht nur einfach OCR1A? Oder habe ich Dich falsch verstanden? Beim Ändern von OCR1A im CTC-Modus kann natürlich folgendes passieren: If the new value written to OCR1A or ICR1 is lower than the current value of TCNT1, the counter will miss the compare match. The counter will then have to count to its maximum value (0xFFFF) and wrap around starting at 0x0000 before the compare match can occur. siehe 16.9.2 - Clear Timer on Compare Match (CTC) Mode http://www.atmel.com/dyn/resources/prod_documents/doc8271.pdf Seite 127f
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.