Forum: Mikrocontroller und Digitale Elektronik atmega32 - pwm will nicht


von Alexander H. (sonium)


Lesenswert?

Hallo, ich versuche gerade mit atmega Handbuch und Tutorial die PWM 
Ansteuerung nachzuvollziehen. Kurzum ich bekomms nicht hin. Hier mein 
Code:
1
#include <avr/io.h>
2
#include <stdint.h>
3
#include <stdlib.h>
4
 
5
int init_pwm(void) {
6
    TCCR0 |= (1<<COM00) | (1<<COM01) | (1<<CS02) | (1<<CS00);   //enable OC Output, prescale 1024
7
    OCR0 = 128;
8
    DDRB |= (1<<PB3);  //OC0 Pin
9
    return 0;
10
}
11
 
12
int main (void) {
13
 
14
    DDRC = 0xFF;
15
    init_pwm();
16
 
17
    while(1) {  //<mainloop>
18
 
19
    PORTC = PORTB; //LEDs hängen an PortC, OC0 aber an PortB
20
 
21
    }//</mainloop>
22
 
23
    return 0;       // never reached
24
}

von johnny.m (Gast)


Lesenswert?

Du musst die WGM-Bits im TCCR0 nach der Tabelle im Datenblatt setzen, um 
den PWM-Modus zu aktivieren...

von Alexander H. (sonium)


Lesenswert?

Nachdem ich sie nicht angefasst hab sollten die beide auf 0 und somit 
auf Mode "Normal" sein.

von johnny.m (Gast)


Lesenswert?

Du willst doch eine PWM erzeugen, oder? Dann musst Du die Bits auch so 
setzen, dass einer der zur Verfügung stehenden PWM-Modi aktiv ist. Sonst 
wird das nix...

von Alexander H. (sonium)


Lesenswert?

ok, jetzt hab ich den Wurm. Man kann wohl nicht von OC0 lesen. Jetzt hab 
ich ne Abfrage über die TIFR Flags und es funktioniert. Der 
Vollständigkeit halber noch mein Code:
1
int init_pwm(void) {
2
    TCCR0 |= (1<<CS02) | (1<<CS00);   // prescale 1024
3
    OCR0 = 32;  // match compare at 12.5%
4
    return 0;
5
}
6
 
7
int main (void) {
8
 
9
    DDRC = 0xFF;
10
  
11
  init_pwm();
12
 
13
    while(1) {  //<mainloop>
14
 
15
    if (bit_is_set (TIFR,OCF0)) {  // compare match
16
      TIFR |= (1<<OCF0);
17
      PORTC = 0x0F;
18
    }
19
    
20
    if (bit_is_set(TIFR,TOV0)) {  // overflow
21
      TIFR |= (1<<TOV0);
22
      PORTC = 0x00;
23
    }
24
 
25
  }//</mainloop>
26
 
27
    return 0;       // never reached
28
}

von Joerg X. (Gast)


Lesenswert?

hilft's wenn du
1
 PORTC = PINB;
machst?, sonst vl. den Output-Compare Interrupt probiern oder einen 
"richtigen" PWM-Mode

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.