Forum: Compiler & IDEs AVR PWM tut nichts


von NBLM (Gast)


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?

von yksihW (Gast)


Lesenswert?

Du musst vorher das BSR (beamtenstatusregister) ausschalten, damit er 
was tut.

von MWS (Gast)


Lesenswert?

> To do a 16-bit write, the High byte must be written before the Low byte.

Außerdem, wohin kehrt PWM() nach Ende zurück ?

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

NBLM schrieb:
> Die Funktion rufe ich dann in einer Endlossschleife in main auf.
D.h. du startest die PWM ständig neu? Du musst das ganze nur ein mal 
aufrufen, und dann in der main() eine Endlosschleife laufen lassen, die 
gar nichts tut:
1
while (1);

von NBLM (Gast)


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?

von Ich (Gast)


Lesenswert?

Das BSR (beamtenstatusregister) "cli();" ist immer noch gesetzt.
Schalte mal die Interrupts an.
btw. Beamtenstatusregister geiles Wort "yksihW"

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Das hat mit dem Interrupt-Flag cli () nichts zu tun. Welchen 
Mikrocontroller verwendest du? Kann es sein, dass du den falschen Pin 
verwendest? Beim ATmega8 liegt das Ausgabesignal am Pin "OC1A" bzw. PB1, 
also Pin Nr. 15, ganz unten rechts, an. Daher musst du auch folgenden 
Code zum Konfigurieren des Ports ausführen:
1
DDRB |= (1 << PB1)

von NBLM (Gast)


Lesenswert?

Ich verwende einen Atmega32A, dort ist der OC1A auf pin 19, portD pin 5.

von MWS (Gast)


Lesenswert?

Der Code funktioniert, falschen Controller im Makefile eingestellt ?

von NBLM (Gast)


Lesenswert?

Hab den atmega32 drinnen (MCU = atmega32).
:(

von MWS (Gast)


Angehängte Dateien:

Lesenswert?

Dann teste mal, ob das compilierte .hex läuft, Simulation ist ok.

von NBLM (Gast)


Lesenswert?

Funktioniert leider nicht. Hab es getestet auf pin 18-19.

von MWS (Gast)


Lesenswert?

Wie sieht's mit klassischem Portpin toggeln aus ? Klappt das ? Bootlader 
drauf ? Wie sieht's mit der BOOTRST Fuse aus ?

von NBLM (Gast)


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 :<

von Bond (Gast)


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.

von MWS (Gast)


Lesenswert?

Beschaltung ok, beide GNDs angeschlossen, nichts was den Port blockiert 
?
Ungewöhnlich, wenn ein kompletter Port ausgefallen wäre.

von NBLM (Gast)


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.

von MWS (Gast)


Lesenswert?

NBLM schrieb:
> 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.

PC2..5 ist JTAG.

von NBLM (Gast)


Lesenswert?

Aha wusste ich nicht, ich programmiere mit ISP. Kann man JTAG abschalten
damit ich normale 5V I/O habe?

von MWS (Gast)


Lesenswert?

NBLM schrieb:
> Aha wusste ich nicht, ich programmiere mit ISP. Kann man JTAG abschalten
> damit ich normale 5V I/O habe?

Ja, dauerhaft per Fuse oder temporär per Code indem man zweimal 
innerhalb 4 Zyklen eine 1 auf das JTD Bit im MCUCSR schreibt.

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.