Hallo zusammen
Ich bin für ein Modellbauprojekt an der Auswertung eines
RC-Summensignals, für welches ich einen 8-bit Timer0 verwende.
Nun habe ich aber das Problem, dass die Zeiten, trotz meiner Meinung
nach, richtigen Einstellung des Timers.
Die Verwendete Hardware ist ein ATMEGA8515 mit einer CPU-Frequenz von
16MHz. Um eine Overflow-Zeit von 3ms zu erreichen, habe ich den Precaler
auf 1024 gesetzt und den Preload auf 209. Dies sollte eine Overflow-Zeit
von 3.008 ms geben. Um den Prescler zu testen habe ich nun den Preload
auskommentiert, und gebe beim auftreten eines externen Interrupts einen
Zähler der aufgetretenen Overflows aus. danach kann ich im Abstand von
beispielsweise einer Sekunde den externen Interrupt mittels eines
Tasters betätigen und danach die auf dem Terminal ersichtlichen Zähler
vergleichen.
Nun ist es so, dass ich bei der Ausgabe der Zähler um etwa Faktor 6
daneben bin. Das heisst bei einem Prescaler von 1024 und einer CPU
Frequenz von 16MHz sollte ich bei der Ausgabe der Zähler im Abstand von
einer Sekunde eine Differenz von etwa 61 bekommen. Effektiv sind dies
jedoch nur etwa 10.
Hat jemand eine Idee was ich noch falsch mache, oder wie ich dies
einfacher ausmessen kann?
Vielen Dank schon im Voraus für die Hilfe und freundliche Grüsse
hafisch
Nachfolgend der zusammengekürzte Code mit den relevanten Einstellungen.
1 | // Main-Funktion
|
2 | int main ()
|
3 | {
|
4 |
|
5 | // --- initialize timer-interrupt ---
|
6 | TIMSK |= (1<<TOIE0);
|
7 | TCCR0 |= (1<<CS02)|(1<<CS00);
|
8 | TCNT0 = 0;
|
9 |
|
10 | // --- initialize external interrupt ---
|
11 | GICR |= (1<<INT0);
|
12 | MCUCR |= ((1<<ISC01) | (1<<ISC00));
|
13 | sei();
|
14 |
|
15 | // --- infinity loop ---
|
16 | while(1){
|
17 | }
|
18 |
|
19 | return 1;
|
20 |
|
21 | }
|
22 |
|
23 | // externer Interrupt
|
24 | ISR(INT0_vect){
|
25 | //TCNT0 = 209;
|
26 | usartPutUint(iVal);
|
27 | }
|
28 |
|
29 | // Timer-Overflow
|
30 | ISR(TIMER0_OVF_vect) {
|
31 | iVal++;
|
32 | }
|