Hallo zusammen,
entweder ich habe einen Denkfehler oder es stimmt was nicht.
Ich habe bei meinem Atmega8 aus Performance gründen einen 8MHz Quarz
durch einen 16MHz Quarz erneuert. Meine Erwartung war das die mögliche
abtastfrequenz dadurch doppelt so hoch wird.
Wenn ich jetzt aber mal nachmesse stelle ich fest das die Timerfrequenz
zu einem 8MHz Quarz passt und nicht zu einem 16MHz Quarz.
Hier die Programmausschnitte:
1 | #ifndef F_CPU
|
2 | #define F_CPU 16000000UL
|
3 | #endif
|
4 |
|
5 | // Initialisierung:
|
6 | TCCR2 = (1<<CS22) | (1<<WGM21); // Prescaler von 64 | CTC-Modus
|
7 | OCR2 = 2; // Vergleichswert
|
8 | TIMSK |= (1<<OCIE2); // Interrupts aktivieren und damit Timer starten
|
9 |
|
10 | // ISR zum auffangen der Interrupts:
|
11 | ISR (TIMER2_COMP_vect)
|
12 | {
|
13 | count_timer2++;
|
14 | odo_motor_left_new = PIND & (1<<PD6);
|
15 | odo_motor_right_new = PIND & (1<<PD7);
|
16 | PORTC ^= ( 1 << PC3 );
|
17 | }
|
Ich hätte erwartet das bei meinen Einstellungen folgendes Ergebnis zu
messen ist:
16000000Hz/64 = 250000Hz
250000Hz/3 = 83333Hz
Am Oszi messe ich allerdings genau die hälfte.
also die Werte wie ich sie für einen 8MHz Quarz erwarten würde:
8000000Hz/64=125000Hz
125000Hz/3=41666Hz
Habe durch suchen hier im Forum folgendes Probiert und es kommt genau
ein Takt von 1Hz raus
1 | #define F_CPU 16000000
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 | /*
|
7 | Hier die tatsächlich verwendeten Parameter angeben
|
8 | */
|
9 |
|
10 |
|
11 |
|
12 | int main()
|
13 | {
|
14 | DDRC |= (1 << PC3); //PC3 als Ausgang
|
15 | PORTC &=~ (1 << PC3); //PC3 Low
|
16 | while( 1 )
|
17 | {
|
18 | PORTC ^= ( 1 << PC3 );
|
19 | _delay_ms(1000);
|
20 | }
|
21 | }
|
Habe ich nur einen Denkfehler? Oder hat hier jemand eine Idee woran das
liegt?
Vielen Dank
Striker1985