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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.