PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PWM am ATMEGA16 tut nix



corny335
02.12.2005, 12:19
Hallo, hab vorher noch nie die PWM meines ATMEGA 16 benutzt,
würde nur jetzt gerne eine LED dimmen,
aber ich bekomm es noch nicht mal hin das an den PWM ausgängen überhaupt etwas anliegt.

hab es mit folgendem Code probiert den ich hier im Forum gefunden hab

#define PWM_LINKS OCR1A
#define PWM_LINKS_ON TCCR1A |= (1<<COM1A1)
#define PWM_LINKS_OFF TCCR1A &= ~(1<<COM1A1)

#define PWM_RECHTS OCR1B
#define PWM_RECHTS_ON TCCR1A |= (1<<COM1B1)
#define PWM_RECHTS_OFF TCCR1A &= ~(1<<COM1B1)



/* normale 10-bit PWM aktivieren ( nicht invertiert ) */
TCCR1A = (1<<WGM10)|(1<<WGM11);

/* Einstellen der PWM-Frequenz auf ca. 8 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);

/* PWN einschalten -- > PIN mit PWM verbinden */
PWM_LINKS_ON;
PWM_RECHTS_ON;

/* und Werte schreiben */

PWM_RECHTS = 234;
PWM_LINKS = 1023;

muss ich vielleicht noch in irgend einem anderen Register ein Bit setzten?

corny335
02.12.2005, 14:42
hat sich erledigt das problem, hatte vergessen den pin auch als ausgang zu deklarieren

Grandmaster
21.02.2006, 15:00
Hallo,

ich hab das eben auch mal mit dem code versucht, bekomme aber leider auch nichts am Ausgang, obwohl ich alle PIN's aus Ausgang definiert habe :(.

Kann mir vielleicht jm. sagen, was bei meinem Code falsch ist?


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <stdint.h>
#include <avr/delay.h>
#include <avr/signal.h>

#define PWM_LINKS OCR1A
#define PWM_LINKS_ON TCCR1A |= (1<<COM1A1)
#define PWM_LINKS_OFF TCCR1A &= ~(1<<COM1A1)

#define PWM_RECHTS OCR1B
#define PWM_RECHTS_ON TCCR1A |= (1<<COM1B1)
#define PWM_RECHTS_OFF TCCR1A &= ~(1<<COM1B1)



static void io_init(void)
{

PORTA =0x0; //ausgängn
DDRA = 0xff;
// PortB
PORTB = 0x0; //ausgänge
DDRB = 0xff;
// PortC
PORTC = 0x0; //ausgänge
DDRC = 0xff;
// PortD
PORTD = 0x0; //ausgänge
DDRD = 0xff;
ACSR = 0x80;

/* normale 10-bit PWM aktivieren ( nicht invertiert ) */
TCCR1A = (1<<WGM10)|(1<<WGM11);
/* Einstellen der PWM-Frequenz auf ca. 8 kHz ( Prescaler = 1 ) */
TCCR1B = (1<<CS10);
/* PWN einschalten -- > PIN mit PWM verbinden */
PWM_LINKS_ON;
PWM_RECHTS_ON;
/* und Werte schreiben */
PWM_RECHTS = 234;
PWM_LINKS = 1023;
}


int main(void)
{
io_init();

while(1)
{

}
return(0);
}


wäre super nett, wenn mir jm helfen könnte!

Lunarman
21.02.2006, 15:07
Wenn ich es richtig sehe, hast du PWM_links_ON/OFF nich deklariert...?

Grandmaster
21.02.2006, 16:51
Hi!

Danke erst mal für deine Antwort. Könntest du mir mal den code posten, damt das dann geht? Ich versteh echt nicht, wie das gehen soll.

Wäre nett von dir!

corny335
21.02.2006, 17:15
ansich seh ich bei dir keinen Fehler,
haste du mal probiert ob die Ausgänge überhaupt funktionieren?
also mal von hand auf 1 setzten.
vielleicht liegt es ja auch an was ganz anderem.

du könntest es sonst auch noch mal mit dem anderen timer probieren, also an PB3

DDRB=0xff;
TCCR0=(1<<WGM00)|(1<<COM01)|(1<<CS01);
OCR0=100;

Gruß Cornelius

ogni42
21.02.2006, 17:47
Hast Du mal an den Ausgängen des ATMega gemessen, was da passiert?

(Und bitte beim Code posten die code-Tags verwenden)

Grandmaster
22.02.2006, 12:35
Also ich versteh das nicht. Ich hab jetzt den code so einfach wie möglich geschrieben und auch mal den anderen timer genommen. Sieht jetzt so aus:


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <stdint.h>
#include <avr/delay.h>
#include <avr/signal.h>

static void io_init(void)
{
DDRB=0xff;
TCCR0=(1<<WGM00)|(1<<COM01)|(1<<CS01);
OCR0=100;
}
int main(void)
{
io_init();

while(1)
{

}
return(0);
}


An PD3 passiert einfach gar nichts :(. Kann mir jm. weiterhelfen?

corny335
22.02.2006, 12:37
du sollst ja auch den PB3 benutzen :-)

Grandmaster
22.02.2006, 20:08
:)

ES FUNKTIONIERT!!!

Ich hatte auch PB3 benuzt, hab mich nur verschrieben ;). Ich hab einen dummen Anfängerfehler gemacht ;). Geht mit dem Code, den ich gepostet habe wunderbar, falls noch jm. Probleme hat, nehmt den Code, der funzt (Port PB3 ;)).

Hab da noch eine Frage. Bei mir funktioniert jetzt die PWM an PB3. (noch mal danke an alle!).
Wie schalte ich die anderen 3 PWM an? Verstehe das im Datenblatt nicht :(. Gibt es eigentlich eine Möglichkeit, die PWM auf andere Ports umzubiegen, bzw. irgendwie andere Ports auch noch zur PWM zu nutzen, oder kann ich nur die 4 vorgegebenen Ports zu PWM nutzen?!?

DANKE NOCH MAL!!!

corny335
22.02.2006, 22:23
so viel ic hweiss kannste nur die vorgegebenen benutzen,
um PD4 und PD5 zu benutzen muste deinen ersten code versuch nehmen

Grandmaster
24.02.2006, 19:51
hm, der läuft aber irgendwie nicht :(.
Könntest du mir bitte auch mal den Code posten (sollten ja für die anderen beiden auch nur jm. 2 Zeilen sein ??? ), damit alle drei laufen?

Wäre echt super nett, würdest mir einen großen gefallen tun!

corny335
24.02.2006, 20:49
Also der Code funktioniert bei mir super



void aktPWM(){
OCR0=100;
OCR1A=100;
OCR1B=100;
}
void initPWM(void){
DDRB=0xff;
DDRD=0xff;
TCCR0=(1<<WGM00)|(1<<COM01)|(1<<CS01);
TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
TCCR1B = (1<<CS10);
}

Grandmaster
26.02.2006, 18:07
Also das PWM macht mich fertig :(. Der code geht so weit, deswegen auch schon mal DANKE!!!

Wenn ich aber folgenden Code laufen lasse:


#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <stdint.h>
#include <avr/delay.h>
#include <avr/signal.h>

static void io_init(void)
{

PORTA =0x0; //ausgängn
DDRA = 0xff;
// PortB
PORTB = 0x0; //ausgänge
DDRB = 0xff;
// PortC
PORTC = 0x0; //ausgänge
DDRC = 0xff;
// PortD
PORTD = 0x0; //ausgänge
DDRD = 0xff;
ACSR = 0x80;
}

void aktPWM(){
OCR0=20;
OCR1A=20;
OCR1B=20;
DDRB=0xff;
DDRD=0xff;
TCCR0=(1<<WGM00)|(1<<COM01)|(1<<CS01);
TCCR1A = (1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
TCCR1B = (1<<CS10);
}

int main(void)
{
io_init();
aktPWM();
int counter = 0;
int counter1 = 50;
int counter2 = 68;
char up = 1;
while(1)

{

if(counter == 10){
up = 1;
}
if(counter == 100){
up = 0;
}
if(up == 1){
counter++;
}
else{
counter--;
}
OCR0 = counter;
_delay_ms(16);
_delay_ms(16);
_delay_ms(16);
_delay_ms(16);
_delay_ms(16);
_delay_ms(16);

}
return(0);
}


Dann läuft das manchmal, manchmal aber nicht!?! Was kann das sein? Ich schalte mein Netzteil ein, dann wird die eine LED heller, dunkler, und immer so weiter. Die anderen beiden bleiben gleich hell.
Und auf einmal bleibt die heller/dunkler werdende einfach stehen, oder flackert, und die anderen gehen aus, oder es gehen alle aus.

Also ganz komisch.
Wenn ich meinen atmega auf 1Mhz laufen lasse, also der auslieferung-einstellung, was die FUSE_Bits angeht, dann funzt es. Wenn ich den dann aber wieder auf 16Mhz mit externem Quarz laufen lasse, dann geht es nicht mehr!

Jm. eine Idee, was das sein kann???

DANKE!

Ach ja, FUSE-Bits hab ich folgendes eingestellt:
Siehe Screenshot im Anhang.