Forum: Mikrocontroller und Digitale Elektronik ATMega 168 Timer2 Fast PWM zu langsam


von michael (Gast)


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
}

von c-hater (Gast)


Lesenswert?

michael schrieb:

>   TCCR2B = (TCCR2B & ~(_BV(CS22) | _BV(CS21))) | _BV(CS20);

Was passiert, wenn du anstatt diesem schwer leserlichen Zeug einfach 
schreibst

>   TCCR2B = _BV(CS20);

von Bla (Gast)


Lesenswert?

Das gleiche solltest du auch analog bei TCCR2A machen. Definierte 
Anfangswerte ist das Stichwort!

von Fallobst (Gast)


Lesenswert?

Bla schrieb:
> Das gleiche solltest du auch analog bei TCCR2A machen. Definierte
> Anfangswerte ist das Stichwort!

Die ganzen Register haben den Anfangswert 0.

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.