Hardware-PWM Mega8 in C

  • Zitat von "Spyder24"

    Hallo,


    kann mir jemand Programm für die PWM (Hardware) einer LED am Mega8 zeigen. Ich bekomme es einfach nicht hin den einen PWM-Kanal des ATMega8 so hin zubekommen, dass die LED fadet.


    Gruß Stefan


    Guckst du mal hier :


    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down , Prescale = 1
    Compare1a = 255 ' Lampe aus
    Compare1a = 0 ´Lampe ein
    Waitms 200


    Enable Interrupts


    Anschluß der LED eventuell über Treiber am OC1A Anschluß


    Gruß

  • [code:1]#include <avr/io.h>
    #include <stdint.h>




    void initPWM(void) {
    TCCR0 = (1<<WGM00)|(1<<COM01)|(1<<CS01);
    }



    void delay(int t) {
    for(int z = 0; z <= 10000 * t; z++)
    }


    int main(void) {
    initPWM();
    while(1) {
    for(int i = 0; i <= 255; i++) {
    OCR0 = i;
    delay(100);
    }
    for(int i = 255; i >= 0; i--) {
    OCR0 = i;
    delay(100);
    }
    }
    return(0);
    }
    [/code:1]


    Ggf musst Du noch etwas anpassen; stammt aus meiner Software für einen Mega 16. Schau ansonsten mal ins Datenblatt.


  • Keine Ahnung, was das ist, aber C ist das sicherlich nicht...


  • Cool, danke. Am liebste würde ich es jetzt ausprobieren, aber komme leider erst morgen abend dazu :?

  • Zitat von "Spyder24"

    Cool, danke. Am liebste würde ich es jetzt ausprobieren, aber komme leider erst morgen abend dazu :?


    Ich habs auch noch nicht getestet :lol:


    Wenns nicht geht, versuch mal Delay zu variieren... Prinzipiell müsste es aber funzen, weil das gesamtprogramm, aus dem das stammt, auch geht.

  • Beim Atmega8 ist aber Timer 1 für PWM1 und 2 zuständig und der Timer 2 für PWM 3. Der Timer 0 ist halt ein zusätzlicher Timer...


    Der folgende Code ist für einen Atmega8:



    ist alles eine 8 bit PWM.
    Der Code ist zwar nicht Hardwaremäßig getestet, er läuft aber in AVR Studio einwandfrei auf dem Atmega8.
    für die Geschwindigkeit die Vorteiler nach Datenblatt einstellen...


    um einen Wert per PWM auszugeben, dann einfach z.B.:
    OCR1B = 256;
    OCR2 = 256;
    OCR1A= 256;
    setzen.


  • Ich habe es jetzt zum laufen bekommen aber man sieht das blinken noch zu sehr. Muss ich mal noch testen.

  • Da kannst du einfach den Vorteiler ändern.
    Wird mit den CSxx Bits geschaltet. Der Vorteiler teilt den Takt durch den angegebenen Wert. Dann läuft einfach der Timer schneller. Je nachdem welche Frequenz du eingestellt hast, könnte der Vorteiler von 1024 zu groß sein. Stell mal einen anderen ein. Dann müsste das Flackern abgestellt sein.


    Ganz interessant sind folgende Seiten, die haben mir sehr geholfen:


    http://dlangenberg.googlepages.com/atmega8basics


    http://www.kreatives-chaos.com/artikel/codeschnipsel-avr-gcc


  • Ich habe bisher immer den kleinsten Teiler (also eins), verwendet und mir nie groß Gedanken drüber gemacht. Ist das sinnvoll?


    PWM sollte doch dann so schnell laufen, wie es nur geht...