mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atmega32 - pwm will nicht


Autor: Alexander Hupfer (sonium)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich versuche gerade mit atmega Handbuch und Tutorial die PWM 
Ansteuerung nachzuvollziehen. Kurzum ich bekomms nicht hin. Hier mein 
Code:
#include <avr/io.h>
#include <stdint.h>
#include <stdlib.h>
 
int init_pwm(void) {
    TCCR0 |= (1<<COM00) | (1<<COM01) | (1<<CS02) | (1<<CS00);   //enable OC Output, prescale 1024
    OCR0 = 128;
    DDRB |= (1<<PB3);  //OC0 Pin
    return 0;
}
 
int main (void) {
 
    DDRC = 0xFF;
    init_pwm();
 
    while(1) {  //<mainloop>
 
    PORTC = PORTB; //LEDs hängen an PortC, OC0 aber an PortB
 
    }//</mainloop>
 
    return 0;       // never reached
}

Autor: johnny.m (Gast)
Datum:

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

Autor: Alexander Hupfer (sonium)
Datum:

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

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Alexander Hupfer (sonium)
Datum:

Bewertung
0 lesenswert
nicht 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:
int init_pwm(void) {
    TCCR0 |= (1<<CS02) | (1<<CS00);   // prescale 1024
    OCR0 = 32;  // match compare at 12.5%
    return 0;
}
 
int main (void) {
 
    DDRC = 0xFF;
  
  init_pwm();
 
    while(1) {  //<mainloop>
 
    if (bit_is_set (TIFR,OCF0)) {  // compare match
      TIFR |= (1<<OCF0);
      PORTC = 0x0F;
    }
    
    if (bit_is_set(TIFR,TOV0)) {  // overflow
      TIFR |= (1<<TOV0);
      PORTC = 0x00;
    }
 
  }//</mainloop>
 
    return 0;       // never reached
}

Autor: Joerg X. (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.