Hab ein Problem, dass meine PWM nicht richtig dimmt. Die LED ist fast dauerhaft an. NUr nach wenigen Sekunden sieht man irgendwann einmal dass sie runterdimmt. Würde gernen einen 20kHz PWM Timer aufbauen mit einer Auflösung von 9 oder 10Bit. F_CPU = 8E6. Habe noch nicht nicht den richtigen Tipp im Datenblatt umsetzen können.
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include <avr/interrupt.h> |
4 | |
5 | #define RED_DDR DDRB
|
6 | #define RED_PORT PORTB
|
7 | #define RED_PIN PORTB2
|
8 | |
9 | int main(void) |
10 | {
|
11 | |
12 | // Set DDR
|
13 | RED_DDR |= (1<<RED_PIN); |
14 | |
15 | // FastPWM non-inverted | 9-Bit
|
16 | TCCR1A |= (1<<COM1A1) | (1<<WGM11); |
17 | TCCR1B |= (1<<WGM12); |
18 | |
19 | // Prescaler /256
|
20 | TCCR1B |= (1<<CS12); |
21 | |
22 | // Pin Mux Selection Register
|
23 | // TOCC7 (PORTB2) -> 01
|
24 | TOCPMSA1 |= (1<<TOCC7S0); |
25 | |
26 | // Output Enable
|
27 | TOCPMCOE |= (1<<TOCC7OE); |
28 | |
29 | // Reset Timer-Value
|
30 | OCR1A = 0; |
31 | |
32 | sei(); |
33 | |
34 | while(1) |
35 | {
|
36 | while(OCR1A < 511) { OCR1A++; _delay_ms(50); } |
37 | while (OCR1A > 0) { OCR1A--; _delay_ms(50); } |
38 | }
|
39 | }
|