AVR- Atmega32 lässt Pin nach Interrupt/PWM-Ansteuerung nicht mehr steuern

OP #2693763
Lesenswert?

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
1
PORTD &= ~(1 << PD7);

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
OP #2693993
Lesenswert?

spess53 schrieb:
> Und warum dann Invertierte PWM?

Ich fade die LED, nur leider ist meine Tabelle falsch herum ;-)

Außerdem:

Benedikt S. schrieb:
> 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
> PORTD &= ~(1 << PD7);
> oder sogar
> PORTD = 0;
> ausschalten
OP #2694273
Lesenswert?

Verdammt.... ihr hattet recht... die LED ist tatsächlich invertiert :D
Das mit dem zuvor setzen und danach wieder löschen hat mich irritiert. 
Ich kann hald doch nicht so schnell sehen ;-)

so was doofes... peinlich

Naja, jetz funktionierts wenigstens :D

vielen Dank für die Hilfe!

Gruß,
acid_g

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren