Forum: Mikrocontroller und Digitale Elektronik Timerfrequenz im CTC Modus


von Striker1985 (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Habe ich nur einen Denkfehler? Oder hat hier jemand eine Idee woran das
>liegt?

Sieh dir die Formel im Datenblatt an.

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Striker1985 schrieb:

> Wenn ich jetzt aber mal nachmesse stelle ich fest das die Timerfrequenz
> zu einem 8MHz Quarz passt und nicht zu einem 16MHz Quarz.

Auch nicht bei deiner Messung vergessen, dass du von einer steigenden 
Flanke zur nächsten steigenden Flanke messen musst und dann die sich 
daraus resultierende Frequenz mal 2 nehmen musst (wegen dem Toggeln)


Ansonsten fällt mir noch noch ein:
Fuses kontrollieren, ob dein Mega nicht zufällig eigentlich mit 8MHz 
intern läuft und der Quarz sowieso nur schmuckes Beiwerk ist.


Edit:
> 16000000Hz/64 = 250000Hz
> 250000Hz/3 = 83333Hz

Nö.
Du toggelst den Pin. D.h. die Pin-Frequenz ist die Hälfte der 
ISR-Aufruffrequenz. Was du ausgerechnet hast, ist die Frequenz mit der 
die ISR aufgerufen wird.

> Am Oszi messe ich allerdings genau die hälfte.
Passt ja dann ganz genau.

von Striker1985 (Gast)


Lesenswert?

Hi,

Vielen Dank für den Denkanstoß. Ist ja jetzt irgendwie logisch.
Manschmal sieht man wirklich den Wald vor lauter Bäumen nicht.

Striker1985

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
Noch kein Account? Hier anmelden.