logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[atmega16][avr-gcc]Timer0 i PWM

speecu 22 Gru 2008 03:06 4735 4
REKLAMA
  • #1 5888666
    speecu
    Poziom 11  
    Witam!
    Postanowiłem zrobić PWM na Timer0.
    Poustawiałem wszystko wg noty i nic. Na PB3 nie otrzymuję tego co powinno być.
    Dla sprawdzenia poprawności moich działań postanowiłem ustawić PWM
    na Timer1A. I w tym przypadku na PD5 jest to co powinno.

    Czy ktoś mógłby sprawdzić czy wszystko jest OK?
    Mam nadzieję, że nie mam uszkodzonego portu PB3?

    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    void Timer1A_init(void){
    TCCR1A=(1<<COM1A1)|(1<<WGM10);  
    TCCR1B=(1<<CS10)|(1<<CS12);
    DDRD=(1<<PORTD5);
    }
    
    void Timer1A_set(unsigned char value){
    OCR1AL = value;
    }
    
    void Timer0_init(void){
    TCCR0 =(1<<WGM00)|(1<<COM01);
    TCCR0 =(1<<CS02)|(1<<CS00);
    DDRB=(1<<PORTB3);
    }
    
    void Timer0_set(unsigned char value){
    OCR0 = value;
    }
    
    int main (void){							
    Timer1A_init();
    Timer1A_set(127);
    Timer0_init();
    Timer0_set(127);
    while(1){}
    return 0;
    }
    


    Z góry dziękuję za odpowiedź.
  • REKLAMA
  • #2 5889386
    wojtek_84
    Poziom 13  
    Witam !
    Na moim procku (Atmega 16) Twój program działa. Diodka podłączona do PD5 mruga.
  • REKLAMA
  • #3 5890528
    speecu
    Poziom 11  
    Dzięki za zainteresowanie moją sprawą.
    PD5 podłączyłem kontrolnie, aby sprawdzić, czy mój tok rozumowania jest poprawny i jak mogłeś się przekonać uruchamiając program u siebie, Timer1 działa znakomicie.
    Problem jest z Timerem0 i wyjściem OC0 (PB3).
    I tak planowałem kupić drugą Atmegę do innych celów, więc przy okazji sprawdziłem program na nowej i zachowuje się tak samo, więc przynajmniej mam pewność, że nie uszkodziłem portu w pierwszej.
    A problem postanowiłem rozwiązać od strony programowej (przynajmniej mam takie plany), która rozszerzy możliwości Timera0 o sterowanie PWM na kilku wyjściach na raz.

    Pozdrawiam i życzę Wam wszystkim Wesołych Świąt i Szczęśliwego Nowego Roku 2009.
  • REKLAMA
  • #5 5891657
    speecu
    Poziom 11  
    Witam!
    Coś mnie oświeciło, ale nie jestem pewien, czy to kol. ZbeeGin miał na myśli.

    
    TCCR0 =(1<<WGM00)|(1<<COM01); //Wpisuje określone bity do TCCR0
    TCCR0 =(1<<CS02)|(1<<CS00); //Ustawia TYLKO te bity w TCCR0, likwiduje ustawienia powyżej
    


    Powinno być:
    
    TCCR0 =(1<<WGM00)|(1<<COM01)|(1<<CS02)|(1<<CS00);
    


    lub

    
    TCCR0 |=(1<<WGM00)|(1<<COM01);
    TCCR0 |=(1<<CS02)|(1<<CS00); 
    


    Pewnie o to chodziło, bo PB3 działa jak powinien.

    Wielkie dzięki za wskazanie kierunku poszukiwań rozwiązania.

    Pozdrawiam
REKLAMA