AVR PWM tut nichts

Gast #2128479
Lesenswert?

Hallo, ich habe ein Problem mit dem PWM und zwar, kommt einfach gar 
nichts bei dem Pin raus(PD5/ 0CR1A). Ich habe es jetzt schon zweimal 
versucht, einmal mit meinem Code und ein zweites mal mit einem aus dem 
Internet. In beiden fällen passiert einfach gar nichts.


#define PULSE_WIDTH 0x40

#include <avr/io.h>
#include <stdint.h>
// TCCR1A = 0x81
// |COM1A1|COM1A0|COM1B1|COM1B0|FOC1A|FOC1B|WGM11|WGM10|
//   1    0    0    0    0     0     0     1
// 8 bit PWM mode - nicht invertierende PWM
//======================================================
// TCCR1B = 0x04
// |ICN1|ICES1| - |WGM12|WGM12|CS12|CS11|CS10|
//  0     0    0    0     0     1    0    0
//  takt = cpu*/256


void pwm(){      //ausgabe auf PortD pin5 'OC1A'

        OCR1AL = PULSE_WIDTH;   //Load Pulse width
        OCR1AH = 0;
        DDRD |= (1<<5);         //PortD.5 as o/p
        TCCR1A = 0x81;          //8-bit, Non-Inverted PWM
        TCCR1B = 0x04;             //Start PWM
}

Die Funktion rufe ich dann in einer Endlossschleife in main auf. Das ist
die Version aus dem Internet. Man könnte doch jetzt erwarten das die LED
etwas leuchtet, nur tut sie gar nichts. :(

Ich glaub ich übersehe hier irgendwas?
Gast #2128656
Lesenswert?

Danke, das wusste ich nicht. So sieht es jetzt aus:

#define F_CPU 1000000UL //Den Takt des µC angeben für delay.h
#define PULSE_WIDTH 0x40 // kopiert
#include <avr/io.h>
#include <stdint.h>
#include <util/delay.h>


// TCCR1A = 0x81
// |COM1A1|COM1A0|COM1B1|COM1B0|FOC1A|FOC1B|WGM11|WGM10|
//   1    0    0    0    0     0     0     1
// 8 bit PWM mode nicht invertierende PWM
//======================================================
// TCCR1B = 0x04
// |ICN1|ICES1| - |WGM12|WGM12|CS12|CS11|CS10|
//  0     0    0    0     0     1    0    0
//


void pwm(){      //ausgabe auf PortD pin5 'OC1A'

        OCR1AH = 0;
        OCR1AL = PULSE_WIDTH;   //Load Pulse width
        TCCR1A = 0x81;          //8-bit, Non-Inverted PWM
        TCCR1B = 0x04;             //Start PWM
}

int main (void) {

  DDRD = 0x20;  //port von D pin 5 'OC1A' auf Ausgang setzen
  pwm();
  while(1);

  return 0;
}

leider geht es noch immer nicht?
Gast #2129452
Lesenswert?

Ich habe jetzt versucht mal ein paar LEDs an PORTD zusteuern hab die 
sonst auf PortA sitzen. Nach einem kurzen Umbau und Änderungen im Code 
stell ich fest das meine Pins bei D alle tot sind, ich kann sie weder 
als Eingänge noch als Ausgänge benützen. Ist der jetzt kaputt, oder muss 
man irgendwelche fuses oder sonstwas setzen? Oder hat man mich um 4,95€ 
betrogen :<
Gast #2129476
Lesenswert?

Schalten mit dem neuen Code die Pins wenn
du es mit dem Simulator probierst?
Wenn ja dürfte der Code OK sein.

Hängt an den Pins irgend etwas dran was stören kann?
Pin offen lassen und sehr langsam schalten, dann
reicht schon ein Multimeter, wenn man keinen Oszi hat.

Schalten die "offenen" Pins nicht auf einfache ON/OFF-Befehle
ist vermutlich der µC reif für die Tonne.
Gast #2129584
Lesenswert?

OK jetzt weis ich was los ist, bei meinem ausgeborgten Steckbrett ist 
eine Leiste (ground) unterbrochen deshalb kann da nichts raus kommen. 
Dadurch
ist die untere Hälfte abgeschnitten.

Hab die jetzt umgesteckt und ein längeres Kabel direkt zum (-)pol ohne 
Umwege spendiert. Die funktionieren jetzt auch nur pin 1-5 der gruppe C 
hat nur 1,6V alle anderen bringen die 5V keine Ahnung was da passiert. 
Ich nehme
an PWM funktioniert jetzt auch, hab es aber bis her noch nicht probiert.

Vielen Dank für eure Hilfe.

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