Forum: Mikrocontroller und Digitale Elektronik ATMEGA2560 PWM


von Wuhu W. (wuhuuu2)


Lesenswert?

Hallo,

da mir die anderen Threads das Problem nich behoben haben.. hier noch 
einer..

Ich will ein PWM-Signal mit einem ATMEGA2560 erzeugen.

Wenn ich das Programm draufspiele, gibts am Oszi einen einzigen Impuls 
und dann kommt nichts mehr. Villeicht hängt es ja am Timer... ?

erstma der quellcode..

------------------
1
#define F_CPU 14745600UL    //Frequenz Quartz  UL  unsigned long
2
#include <stdlib.h>
3
#include <avr/io.h>
4
#include <avr/interrupt.h>
5
#include <util/delay.h>
6
#include <stdint.h>
7
8
9
10
void PWM(void)
11
{
12
13
  //PWM initialisierung  Port B
14
15
  //  ICR1 = 100; //Frequenz  //set top timer1 - nicht bei Timer 0 verwendbar
16
17
  //  TIMSK0 = (1<<OCIE0B) | (1<<OCIE0A) | (1<<TOIE0); // Timer/Counter Interuot mask register
18
    
19
    DDRB = 0xFF; // 1 = output   
20
21
 
22
    TCCR0A |= (1<<COM0A1) | (1<<COM0B1);  // set 1 at bottom, clear at match, compeartor A
23
    
24
    TCCR0A |= (1<<WGM01)  | (1<<WGM00);    //set to fast PWM (with WGM02 = 0, Top = 0xFF)
25
    
26
    TCCR0B |= (0<<WGM02)  | (1<<CS00);     // CS00 = no prescaling 
27
28
29
    //OCR0A = 0xF0;   // WGM02 = 1, Top-value = OCRA 
30
    //PWM output bei OC0A = PB7 möglich ohne ICR1 wert?
31
    
32
    TCNT0 = 0xFF;
33
}
34
35
36
int main (void)
37
{
38
  sei();
39
  PWM();
40
  while(1);
41
  return 0;
42
}

von Oliver (Gast)


Lesenswert?

Wuhu W. schrieb:
>     TCCR0A |= (1<<COM0A1) | (1<<COM0B1);  // set 1 at bottom, clear at
> match, compeartor A

Gegen was soll er denn "matchen"?

Oliver

von Wuhu W. (wuhuuu2)


Lesenswert?

hm okay...
das hätt ich nicht auskommentieren sollen..
1
OCR0A = 0xF0;

Damit sollte doch ein Signal ausgelöst werden wenn der Timer den Wert 
erreicht.
Hatte auch mal noch
OCR0B = 0xA0;
drin, aber er hat dann auch nix auf Pin PG5 ausgegeben.. (da war der 
port auch als ausgang geschaltet)

von Wuhu W. (wuhuuu2)


Lesenswert?

nur wo liegt der Fehler?

von Oliver (Gast)


Lesenswert?

Mit der Zeile

>OCR0A = 0xF0;

sollte es eigentlich funktionieren. Du hast aber nicht doch die Zeile, 
die ins TIMSK0 schreibt, noch drin?

Nimm doch mal das sei raus.

Oliver

von Wuhu W. (wuhuuu2)


Lesenswert?

Update - erstes geht nicht, neuer Versuch halbwegs

Hallo Oliver,
nein das war weiterhin auskommentiert im Programm.. hat nicht 
funktionier.

Da Fehlersuche meist ätzender ist, hab ich das ganze mal mit dem 
Timer/Counter1 versucht:
1
#define F_CPU 14745600UL    //Frequenz Quartz  UL  unsigned long
2
3
4
#include <stdlib.h>
5
#include <avr/io.h>
6
#include <avr/interrupt.h>
7
#include <util/delay.h>
8
#include <stdint.h>
9
10
11
12
void PWM(void)
13
{
14
DDRB = 0xFF;
15
PORTB = 0x00;
16
17
// Timer/Counter Control register A
18
19
  //Clear&set@bottom OC1A/ OC1B/ OC1C on compare match
20
  TCCR1A |= (1<<COM1A1) | (1<<COM1A0);
21
  TCCR1A |= (1<<COM1B1) | (1<<COM1B0);
22
  TCCR1A |= (1<<COM1C1) | (1<<COM1C0);
23
  
24
  //Fast PWM 8 Bit
25
  // WGMn3=0
26
  // WGMn2=1
27
  // WGMn1=0
28
  // WGMn0=1
29
  TCCR1A |= (1<<WGM10);
30
  TCCR1B |= (1<<WGM12);
31
32
  
33
34
  //Clock select    * Aktiviert Clock/Timer *
35
  // No prescaling:
36
  // CSn2=0        1= /1024  1= /256
37
  // CSn1=0      0      0
38
  // CSn0=1      1      0
39
  TCCR1B |= (1<<CS10) | (1<<CS12);
40
41
42
//Compare Werte      *0x00 = 5V  0xFF = 0V
43
OCR1A = 0xD0;  // Pin PB6 (entspricht OC1B ?)
44
OCR1B = 0xA0;  // Pin PB7 (entspricht OC1C ?)
45
OCR1C = 0x40;  // Pin PB
46
47
}
48
49
int main (void)
50
{
51
  sei();
52
  PWM();  
53
  while(1);    
54
  return 0;
55
}

Das gibt mir jetzt zumindest ein Signal aus.
Aber wenn man meine Kommentare unter Compare Werte beachtet, bin ich 
etwas verwirrt.
Wieso gibt OCR1A z.B. seinen vergleichswert nicht an den Pin mit OC1A , 
sondern an OC1B ?
Auch habe ich kein Signal von OCR1C, was eigentlich ja an PB7 liegen 
sollte, aber da ist ja das B...
folglich hab ich kein Signal am übrig gebliebenen Pin B5

1)Vielleicht könnt ihr mir das ja noch sagen.

2)Wenn ihr wisst wieso das Programm ganz oben nicht geklappt hat wär ich 
auch dankbar

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.