Forum: Mikrocontroller und Digitale Elektronik attiny 861 pwm probleme


von lukas (Gast)


Lesenswert?

Irgendwie bekomme ich die PWM Initialisierung bei dem Attiny861 nicht 
hin. Nur OC1D liefert ein Ausgangssignal im Fast PWM Modus.
Wär super wenn wer über meinen Code drüber schaun kann und den Fehler 
findet :). So langsam wirds frustrierend :/

1
void timer1_init(void)
2
{
3
  //Mode + Output einstellung
4
  //Fast PWM mode 8 Bit Timer 1, OC1A, OC1B und OC1D auf non-inverting output setzen  
5
6
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<PWM1A) | (1<<PWM1B);
7
8
  TCCR1C = (1<<COM1D1) | (1<<PWM1D);
9
  
10
  TCCR1D = (0<<FPIE1) | (0<<FPEN1) | (0<<FPNC1) | (0<<FPES1) | 
11
       (0<<FPAC1) | (0<<FPF1) | (0<<WGM11) | (0<<WGM10);
12
13
    //Top setzen
14
    OCR1C = 0xFF;
15
  
16
  //PLL init und starten
17
  PLLCSR = (0<<LSM) | (1<<PCKE) | (1<<PLLE);
18
  _delay_us(40);
19
  _delay_us(40);
20
  _delay_us(40);
21
  
22
  while(!(PLLCSR&0x01)) {} //stabilisierung der PLL abwarten
23
24
  OCR1A = 100; 
25
  OCR1B = 100; //Bestimmt den mittleren Strom durch die Spulen.
26
  OCR1D = 100; 
27
28
  //Timer aktivieren
29
  TCCR1B |= (1<<CS10);
30
}

von Lutz M. (themroc)


Lesenswert?

Kann es sein, dass Du "Note that the Data Direction Register (DDR) bit 
corresponding to the OC1A and /OC1A pins must be set in order to enable 
the output driver" im Datasheet übersehen hast?

von lukas (Gast)


Lesenswert?

Hab ich nicht, wenn ich DDRB = 0xFF; setze funktionierts auch nicht.

von der alte Hanns (Gast)


Lesenswert?

Sie haben die 'shadow  bits' COM1__S in TCCR1C vergessen.

von lukas (Gast)


Lesenswert?

Genau das wars, danke.
Hier noch mal die funktionierende Initialisierung:
1
void timer1_init(void)
2
{
3
  //Mode + Output einstellung
4
  //Fast PWM mode 8 Bit Timer 1, OC1A, OC1B und OC1D auf non-inverting output setzen  
5
6
  TCCR1A = (1<<COM1A1) | (1<<COM1B1) | (1<<PWM1A) | (1<<PWM1B);
7
8
  TCCR1C = (1<<COM1D1) | (1<<PWM1D) | (1<<COM1A1S) | (1<<COM1B1S);
9
  
10
  TCCR1D = (0<<FPIE1) | (0<<FPEN1) | (0<<FPNC1) | (0<<FPES1) | 
11
       (0<<FPAC1) | (0<<FPF1) | (0<<WGM11) | (0<<WGM10);
12
13
    //Top setzen
14
    OCR1C = 0xFF;
15
  
16
  //PLL init und starten
17
  PLLCSR = (0<<LSM) | (1<<PCKE) | (1<<PLLE);
18
  _delay_us(40);
19
  _delay_us(40);
20
  _delay_us(40);
21
  
22
  while(!(PLLCSR&0x01)) {} //stabilisierung der PLL abwarten
23
24
  OCR1A = 100; 
25
  OCR1B = 100; //Bestimmt den mittleren Strom durch die Spulen.
26
  OCR1D = 100; 
27
28
  //Timer aktivieren
29
  TCCR1B |= (1<<CS10);
30
}

von der alte Hanns (Gast)


Lesenswert?

"Möchtest Du nicht lieber einen Geldzug robben
statt des nachts um 10 vor 3 zu jobben?
..."

in memoriam  KLEN

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.