Danke erstmal,
Ich hoffe ich habe deinen Tipp richtig verstanden und umgesetzt. Der Code funktioniert so weit, allerdings bin ich mit der geringen Auflösung nicht ganz zufrieden.Pollen des Timeroverflowflags im letzten "while" würde auch gehen.
Ich habe mich auch im Wiki über Overflow ISR schlau gemacht. Das bedeutet doch, dass eine Variable in einem Interrupt die Overflows zählt? Ich dachte mir, dass es so wie ich es jetzt gemacht habe einfacher ist.Code:#include <stdlib.h> #include <stdio.h> #include <avr/io.h> #include <inttypes.h> #include <util/delay.h> #include "asuro.h" int main(void) { Init(); uint16_t ergebnis; char buffer [20]; ergebnis = 0; while (1) { DDRC |= (1<<PC3); // PC3 Ausgang PORTC |= (1<<PC3); // PC3 High _delay_us(20); // warte 20 µSekunden PORTC &= ~(1<<PC3); // PC3 Low DDRC &= ~(1<<PC3); // PC3 Eingang while(!(PINC & (1<<PC3))); // tue solange PC3 nicht 1 ist nichts TCCR1B = (1<<CS11); // starte timer Prescaler 8 (Quarz 8Mhz) TCNT1 = 0; // setze Timer0 auf 0 while((PINC & (1<<PC3))) { if (TIFR & (1<<TOV1)) { ergebnis = ergebnis + 1; TIFR = (1<<TOV1); } } TCCR1B &= ~(1<<CS11); // Stoppe timer itoa(ergebnis, buffer, 10); //übersetze (int)ergebnis in ASCII ergebnis = 0; SerPrint("\n\r Wen Ergebnis: \n\r"); SerPrint(buffer); //übertragung des Ergebnisses über RS232 _delay_ms(500); //warte 500ms } }
Der Timer könnte doch auch im CTC Modus laufen. Wenn der Timer im CTC modus läuft, bedeutet das dann, dass ich eine Zahl vorgeben kann bis der Overflow passiert. Zum Beispiel so, dass der Timer von 0 - 500 zählt bis ein Overflow geschieht? (Da bin ich noch ein wenig verwirrt)Was ist "normal" in diesem Zusammenhang, bzw. warum sollte der Timerbetrieb hier un-normal sein ?
MfG Maxtronik







Zitieren


Lesezeichen