Hallo zusammen,
ich habe vorhin versucht mich etwas in Fast PWM einzulesen.
Dabei habe ich unter anderem bei Youtube folgendes Video gefunden:
https://www.youtube.com/watch?v=kAnp2n2o60Y
Da ich einen Atmega8 nutze, habe ich mir das Datenblatt vom Controller
genommen und geguckt ob es Unterschiede bei der Konfiguration gibt, was
ich aber nicht feststellen konnte.
Hier der Code:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #define F_CPU 1000000UL
|
4 | #include <util/delay.h>
|
5 |
|
6 | int main(void)
|
7 | {
|
8 | // Ein- / Ausgänge konfigurieren
|
9 | DDRB |= (1<<PB1); //an PB1 ist die LED angeschlossen
|
10 | PORTB|= (1<<PB0) | (1<<PB2); //Pull Ups für Taster S1 und S2
|
11 |
|
12 | // PWM konfigurieren
|
13 | TCCR1A |= (1<<WGM10); // Fast-PWM (8-Bit)
|
14 | TCCR1A |= (1<<COM1A1); // nicht invertieredner PWM-Modus
|
15 | TCCR1B |= (1<<WGM12); //
|
16 | TCCR1B |= (1<<CS12); // Prescaler 256
|
17 | OCR1A = 0; // Startwert (LED-AUS)
|
18 |
|
19 | sei();
|
20 |
|
21 | while (1)
|
22 | {
|
23 | //***** Taster S1 (LED heller) *****
|
24 | if (!(PINB & (1<<PB2))) // wenn Taster S1 gedrückt ist, dann...
|
25 | {
|
26 | if (OCR1A < 255) // wenn Maximalwert noch nicht erricht ist, dann LED heller...
|
27 | OCR1A++; // verarbeite die Impulsbreite des PWM-Signals um "1"
|
28 |
|
29 | _delay_ms(15); // warte 15ms
|
30 | }
|
31 |
|
32 | //***** Taster S2 (LED dunkler) *****
|
33 | if (!(PINB & (1<<PB0))) // wenn Taster S2 gedrückt ist, dann...
|
34 | {
|
35 | if (OCR1A > 0) // wenn Minimalwert noch nicht erricht ist, dann LED dunkler...
|
36 | OCR1A--; // verarbeite die Impulsbreite des PWM-Signals um "1"
|
37 |
|
38 | _delay_ms(15); // warte 15ms
|
39 | }
|
40 | }
|
41 | return 0;
|
42 | }
|
Das Problem ist nun das die LED nicht komplett aus geht und flackert.
Wenn ich den F_CPU anstatt 8MHz auf 1MHz einstelle, bekomme ich es
wenigstens schon einmal hin das die LED bei voller Helligkeit normal
leuchtet.
Was mach ich falsch? Bzw. übersehe ich irgendetwas im Datenblatt?
Danke und liebe Grüße.