PWM gibt kein Ausgangssignal

#2535886
Lesenswert?

Hallo zusammen,

ich versuche erneut die pwm an meinem Atmega168 zu programmieren nur 
leider mit mäßigen erfolg.
1
  
2

3
void main(void) {
4
 
5
  DDRD = (1 << PD6 );  
6

7

8
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
9
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS10);
10
  ICR1 = 0xFFFF;
11

12
 OCR1A = 0x3FFF;
13
 
14
  while (1) {}
15

16
   return 0;                 
17
   
18
}

Ich verstehe an diesem Tutorial zwei sachen absolut nicht

1. was bedeutet ICR1 = 0xFFFF ?

2. der Atmega168 hat so wie ich das sehe 3 PWM Ausgänge PD3, PD5 und 
PD6.

lt. DB;
PD6 (PCINT22/OC0A/AIN0)
PD5 (PCINT21/OC0B/T1)
PD3 (PCINT19/OC2B/INT1)
Ist es dann richtig wenn ich OCR1A einfach in OCR0A für PD6 ändere und 
bekomme ich dann bei einem "OCR0A" Wert von 128 nur 50% der Spannung an 
PD6?

Danke für eure Erläuchtung.
Gast #2535973
Lesenswert?

Hi

>2. der Atmega168 hat so wie ich das sehe 3 PWM Ausgänge PD3, PD5 und
>PD6.

>lt. DB;
>PD6 (PCINT22/OC0A/AIN0)
>PD5 (PCINT21/OC0B/T1)
>PD3 (PCINT19/OC2B/INT1)

OC1A und OC1B an PB1/PB2 vergessen.

>Ist es dann richtig wenn ich OCR1A einfach in OCR0A für PD6 ändere und
>bekomme ich dann bei einem "OCR0A" Wert von 128 nur 50% der Spannung an
>PD6?

OCR0A gehört zu Timer0. Der PWM-Ausgang für deinen geposteten Code ist 
PB1 nicht PD6.

MfG Spess
Gast #2535981
Lesenswert?

spess53 schrieb:

>>lt. DB;
>>PD6 (PCINT22/OC0A/AIN0)
>>PD5 (PCINT21/OC0B/T1)
>>PD3 (PCINT19/OC2B/INT1)
>
> OC1A und OC1B an PB1/PB2 vergessen.


und OC2A, fehlt auch.

die 48/88/168 megas haben insgesamt 6 pwm channels.


und wie spess schon sagte, es werden immer OC0,OC1,und OC2 zusammen 
konfiguriert.

steht alles auch wunderschön im datenblatt..
#2542213
Lesenswert?

Ich seh schon einige Sachen stehen nicht im Tutorial bzw. sind so 
einfach das ein Anfänger gar nicht drauf kommt :)
Ich habe es nun fast geschafft  (glaub) ich habe das Ergebnis eines 
Potis genutzt um die PWM zu beeinflussen.
1
int main(void)
2
{
3

4
uint16_t result;
5
uint16_t result2;
6

7
ADMUX = (1<<REFS1) | (1<<REFS0);
8
ADCSRA = (1<<ADPS1) | (1<<ADPS0); 
9
ADCSRA |= (1<<ADEN);
10
ADCSRA |= (1<<ADSC);                  
11
while (ADCSRA & (1<<ADSC) ) {}  
12
result2 = ADCW;
13

14
//////// |////////////////////////////////////////////////////////////////////////7
15

16
TCCR0A = ( 1<<WGM01) |( 1<<WGM00) | (1<<COM0A1) | (1<<COM1A0);
17

18
//    WGM01 + WGM00 = 10 BIT  
19
//    COM0A1  = Nicht Invertierender PWM 
20

21
TCCR0B = (1<<CS00);
22

23
//    CS00 + CS02 = Takt des PWM  = CF / 1024
24

25
/////////////////////////////////////////////////////////////////////////////////7
26

27
DDRD= (1<<PD6) | (1<<PD7) | (1<<PD3) ;
28
DDRC = (1<<PC4);
29

30
  while (1) 
31
  {  
32

33
    ADMUX |= PC5;
34
    ADCSRA |= (1<<ADSC);           
35
    while (ADCSRA & (1<<ADSC) ) {} 
36
    result = ADCW;                 
37
      
38
      
39
    if(result > 10)    //wert in result 1024
40
    {
41
      PORTC &= ~(1<<PC4);
42
    }
43
    else
44
    {
45
      PORTC |= (1<<PC4);
46
    }  
47
        
48

49

50
    if(result > 1000)    //wert in result 1024
51
    {
52
      PORTD &= ~(1<<PD7);
53
    }
54
    else
55
    {
56
      PORTD |= (1<<PD7);
57
    }  
58

59
    if(result > 500)    //wert in result 1024
60
    {
61
      PORTD &= ~(1<<PD3);
62
    }
63
    else
64
    {
65
      PORTD |= (1<<PD3);
66
    }  
67
      
68
    OCR0A = result;
69
  }
70

71
return 0;       
72

73
}

Jetzt kommt aber etwas was ich nicht verstehe. Ich drehe den Poti die 
LED (PD6) wird gedimmt und auf einmal ist sie wieder voll beleuchtet. 
Ich drehe wieder ein Stück sie wird wieder gedimmt und das Spielchen 
beginnt von neuem. Dies wiederholt sich 3 bis 4 mal.
Der result wert vom Poti müsste passen habe diesen habe ich mit 3 LEDs 
getestet.

könntet ihr mir nochmal einen Denkanstoß versetzen?

Danke
Gast #2544350
Lesenswert?

Hi

>sorry aber das verstehe ich jetzt echt nicht. Der PWM ist doch mit
>WGM01 + WGM00 auf 10 bit gestellt oder meinst du was anderes?

Dann hast du in der falschen Tabelle nachgesehen. Timer0 ist ein 
8-Bit-Timer.

MfG Spess

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