Sorry... offenbar stand ich ganz ganz kurz vor der Selbsterkenntnis.
Im Code initialisiere ich den Counter wie folgt:
1 | TIMSK = (1<<TICIE1) | (1<<TOIE1);
|
2 | //TIFR = (1 << ICF1);
|
3 | TCNT1 = 0;
|
4 | //TCCR1A = 0x00;
|
5 | TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CTC1) | (1 << CS12);
|
6 | sei();
|
um dann mit folgendem Interrupt zu arbeiten:
1 | ISR(TIMER1_CAPT1_vect){
|
2 |
|
3 | //unsigned int counterValue = 0;
|
4 | //counterValue = ICR1;
|
5 | short tableEntry = calc_RpmToArray(ICR1);
|
6 | ICR1 = 0;
|
7 | TCNT1 = 0;
|
8 |
|
9 | PORTB = ~(drehzahl[tableEntry] & 0xFF);
|
10 | PORTD = ~((drehzahl[tableEntry] >> 8) & 0xFF);
|
11 |
|
12 | //PORTB = ~((counterValue) & 0xFF);
|
13 | //PORTD = ~(((counterValue) >> 8) & 0xFF);
|
14 |
|
15 | //PORTB = 0x00;
|
16 | //PORTD = ~PORTD;
|
17 | }
|
Das klappt nicht, weil ich den Counterstand durch setzen des CTC1 Flags
automatisch löschen lasse!
1 | TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CTC1) | (1 << CS12);
|
Ich dachte, dass das klug wäre, da ich ja den Counter neustarten möchte,
wenn ich mit dem Auslesen des ICR1 Registers fertig bin. Es scheint aber
so zu sein, dass das ICR1 Register geschrieben wird, nachdem der
Counter zurückgesetzt wurde. Das ist natürlich Schwachsinn.
Aber
1 | TCCR1B = (1 << ICNC1) | (1 << ICES1) | (1 << CS12);
|
so läuft es jetzt. Ich setze in der Interruptroutine den Counter selbst
zurück.
Gruß
Timo