- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 5 von 5

Thema: Atmega 32 - PWM an OC0 will nicht

  1. #1

    Atmega 32 - PWM an OC0 will nicht

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi leute, hab en kleines Problem mit den PWMs
    Ich brauch 4 PWM Ausgänge, hab alle zum laufen bekommen, nur der an OC0 nicht. vielleicht kann mir ja jemand helfen.

    Hier der Code:
    Code:
    #include <avr/io.h>
    
    void timer_init(void)
    {
       DDRD = 0xff;  //Ports A,B,D werden als Ausgänge gesetzt
       DDRA = 0xff;
       DDRB = 0xff;
    
    
    
      TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10)|(1<<WGM12);;
      TCCR1B = (1<<CS10);
      TCCR2  = (1<<CS20)|(1<<WGM20)|(1<<COM21);
      TCCR0  = (0<<WGM01)|(1<<WGM00)|(1<<COM01)|(0<<COM00)|(0<<CS00);
    
    
    }
    
    
    int main (void) 
    {
    
       timer_init();
    
       OCR1AL = 50;
       OCR1BL = 100;
       OCR2 = 150;
       OCR0 = 200;
    
    
      while (1);
    }
    so sieht das ganze dann aufm oszi aus (Kanal 4 wäre OC0):
    Bild hier  

    Gruß Manuel

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Hi,

    Du hast ganz einfach den Timer0 noch nicht eingeschaltet.
    Nach Deiner Initialisierung sind CS00,CS01 und CS03 immer noch alle auf 0,
    damit bekommt der Timer0 keinen Takt und ist somit gestoppt.

    Übrigens: Die Operation
    ...|(0<<CS00)|...
    bringt genau gar nichts.
    Zum einen stehen diese Bits nach dem Reset des Cotrollers bereits auf null.
    Und zum anderen - selbst wenn sie auf 1 stehen würden, kannst Du sie mit dieser Operation nicht auf 0 setzen - 1 oder 0 gibt nämlich immer noch 1...

    Gruß,
    askazo

  3. #3
    OK, vielen dank!
    Jetzt funktioniert es! Ich hoff jetzt ist auch alles richtig geschrieben!
    Hier noch schnell der Code, wie er jetzt aussieht:
    Code:
    #include <avr/io.h>
    
    void timer_init(void)
    {
       DDRD = 0xff;  //Ports A,B,D werden als Ausgänge gesetzt
       DDRA = 0xff;
       DDRB = 0xff;
    
    
    
       	TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10)|(1<<WGM12);
    	TCCR1B = (1<<CS10);
    	TCCR2  = (1<<CS20)|(1<<WGM20)|(1<<COM21);
    	TCCR0  |= (1<<WGM00)|(1<<COM01)|(1<<CS00);
    	TCCR0  &=~((1<<WGM01)|(1<<COM00)|(1<<CS01)|(1<<CS01));
    }
    
    
    int main (void) {
    
       timer_init();
    
       OCR1AL = 50;
       OCR1BL = 100;
       OCR2 = 150;
       OCR0 = 200;
    
    
      while (1);
    }
    Und das Beweisbild
    Bild hier  

    Gruß Manuel

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.11.2005
    Alter
    49
    Beiträge
    1.146
    Hi,
    sieht doch soweit ganz gut aus.
    Ich Frage mich nur, warum Du das TCCR0-Register so komisch einstellst. Statt
    Code:
       TCCR0  |= (1<<WGM00)|(1<<COM01)|(1<<CS00); 
       TCCR0  &=~((1<<WGM01)|(1<<COM00)|(1<<CS01)|(1<<CS01));
    kannst Du besser einfach nur
    Code:
       TCCR0  = (1<<WGM00)|(1<<COM01)|(1<<CS00);
    schreiben. Wie schon geschrieben - das Register wird sowieso mit 0 initialisiert, die Nullen brauchst Du also nicht zu setzen. Und bei den anderen Registern machst Du's doch auch so...

    Gruß,
    askazo

  5. #5
    stimmt, geb dir recht!
    danke.

    gruß

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress