ATMega 168 Timer2 Fast PWM zu langsam

Gast #3158398
Lesenswert?

Hallo,
ich betreibe einen ATMega 168 mit einem externen Quarz (16MHz). Am Pin 
OC2B möchte ich per Fast Pwm ein Signal ausgeben. Wird die Cpu-Frequenz 
für Timer2 verwendet, so müsste OC2B alle 16µs (256/F_CPU) wieder auf 1 
gesetzt werden. Eine Messung mit einem Oszi zeigt, dass OC2B nur etwa 
alle 130µs wieder auf 1 gesetzt wird. Das ist etwa ein Faktor 8.

Kann mir bitte jemand sagen, wo dieser Faktor 8 herkommt?

Die Fuse CKDIV8 ist nicht programmiert. Programmiere ich CKDIV8, so 
verlängert sich der Zeitraum nochmal um den Faktor 8.
Verwende ich den internen 8MHz Oszillator, so verlängert sich die Zeit 
um den Faktor 2. Deshalb bin ich mir ziemlich sicher, dass der Quarz 
funktioniert.

Vielen Dank und viele Grüße
Michael

1
#include <avr/io.h>
2

3
#define sbi(port, bit) (port) |= (1 << (bit))
4
#define cbi(port, bit) (port) &= ~(1 << (bit))
5
#define useAsOutput(ddr, bit) (ddr) |= (1 << (bit))
6

7
#define PWM_DDR DDRD
8
#define PWM_PORT PORTD
9
#define PWM_BIT 3
10

11
int main(void)
12
{
13
  useAsOutput(PWM_DDR, PWM_BIT);      
14
  
15
  // Timer 2 einrichten
16
  // Fast PWM, Top=0xff
17
  sbi(TCCR2A,WGM21);
18
  sbi(TCCR2A,WGM20);
19
  
20
  // non inverting compare output mode
21
  sbi(TCCR2A,COM2B1);
22
    
23
  OCR2B = 128;
24
    
25
  // prescaler=1 und Timer aktivieren
26
  TCCR2B = (TCCR2B & ~(_BV(CS22) | _BV(CS21))) | _BV(CS20);
27
      
28
    while(1)
29
    {
30

31
    }
32
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren