Hallo,
ich habe hier einen Atmega 32 mit einer LED an PD7 bzw. OC2.
Hier mein Code:
1 | #include <util/delay.h>
|
2 | #include <avr/io.h>
|
3 |
|
4 | int main(void){
|
5 | DDRD = 0x80; //PD7 as OUT
|
6 | OCR2 = 100; //PWM Wert setzen
|
7 | start();
|
8 |
|
9 | _delay_ms(100);
|
10 | stop();
|
11 |
|
12 | //LED leuchtet noch, deswegen:
|
13 | PORTD &= ~(1 << PD7);
|
14 |
|
15 | while(1); //Endlosschleife
|
16 | }
|
17 |
|
18 | void start(){
|
19 | TCNT2 = 0; //reset timer2
|
20 | OCR2 = 0; //reset compare register
|
21 | TCCR2 = 0x79; //fast-pwm, inverted, prescale = 1
|
22 | }
|
23 |
|
24 | void stop(){
|
25 | TCCR2 = 0x00; //stop the timer
|
26 | }
|
Ich steuere also den Ausgang OC2 per Hardware PWM an, stoppe den Timer
und weil die LED danach noch leuchtet, setze ich das zuständige Bit auf
0 mithilfe von
Die LED geht aber trotzdem nicht aus. Wieso?
Ich dachte zuerst, das wäre, wie im Datenblatt de Atmega 32 auf Seite
118 beschrieben, weil der Port vom Timer "reserviert" wird. Mir ist aber
folgendes aufgefallen:
Wenn ich die LED mit PORTD ^= (1 << PD7); ausschalte (ich weiß ja, dass
das Bit gesetzt sein muss, wenn die LED noch leuchtet...)
funktioniert's.
Auch warten zwischen PWM-Ansteuerung und manuellem Ausschalten hilft
nicht.
Das gleiche tritt auf, wenn ich die LED per Interruptroutine mit PORTD
^= (1 << PD7); hin und her schalte. Danach kann ich sie einfach nicht
mehr mit normalen Bitsetzen wie
1 | PORTD &= ~(1 << PD7);
|
2 | oder sogar
|
3 | PORTD = 0;
|
ausschalten. Auch davor anschalten, warten und wieder ausschalten
funktioniert nicht...
Hat jemand eine Erklärung?
Vielen Dank schonmal,
Gruß,
acid_g