ATMEGA2560 PWM

OP #3661953
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
}
OP #3661980
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)
OP #3662238
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

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