Forum: Mikrocontroller und Digitale Elektronik AVR- Atmega32 lässt Pin nach Interrupt/PWM-Ansteuerung nicht mehr steuern


von Benedikt S. (acid_g)


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

von STK500-Besitzer (Gast)


Lesenswert?

JTAG?

von Oliver J. (skriptkiddy)


Lesenswert?

STK500-Besitzer schrieb:
> JTAG?
Seit wann liegt JTAG auf PORTD?

Gruß Oliver

von Oliver J. (skriptkiddy)


Lesenswert?

Benedikt S. schrieb:
> PORTD &= ~(1 << PD7);

Wird die LED invertiert betrieben?

Versuch mal das:
1
PORTD |= (1<<PD7);

Gruß Oliver

von Klaus D. (kolisson)


Lesenswert?

du musst wohl den PIN respektive den PWM Mode
auf "Disconnect = Normal Port Operation" setzen.
k.

von Oliver J. (skriptkiddy)


Lesenswert?

Klaus De lisson schrieb:
> du musst wohl den PIN respektive den PWM Mode
> auf "Disconnect = Normal Port Operation" setzen.
> k.

Tut er das nicht hier?

Benedikt S. schrieb:
> void stop(){
>   TCCR2 = 0x00;  //stop the timer
> }


Gruß Oliver

von Benedikt S. (acid_g)


Lesenswert?

Oliver J. schrieb:
> Wird die LED invertiert betrieben?

Nein,
0 ==> lED aus;
1 ==> LED an

von spess53 (Gast)


Lesenswert?

Hi

>Nein,
>0 ==> lED aus;
>1 ==> LED an

Und warum dann Invertierte PWM?

MfG Spess

von Benedikt S. (acid_g)


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

von Oliver J. (skriptkiddy)


Lesenswert?

Benedikt S. schrieb:
> Nein,
> 0 ==> lED aus;
> 1 ==> LED an

Und da bist du dir hundert-prozentig sicher?


Gruß Oliver

von Oliver J. (skriptkiddy)


Lesenswert?

Benedikt S. schrieb:
> Wenn ich die LED mit PORTD ^= (1 << PD7); ausschalte (ich weiß ja, dass
> das Bit gesetzt sein muss, wenn die LED noch leuchtet...)

Das deutet für mich auf invertierten Betrieb hin, denn du kannst sie ja 
ausschalten. Nur eben musst du dazu wahrscheinlich das Bit in PORTD 
setzen und nicht löschen.

Gruß Oliver

von Benedikt S. (acid_g)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.