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 | }
|