значение pwm не меняется

Я написал pwm-код для Atmega128. Я использую быстрый режим ШИМ с неинвертирующим импульсом при сравнении совпадений, и мне нужно в определенное время изменять значение OCR0. Но это не меняется. Кто-нибудь знает, в чем тут проблема ??

#include <avr/interrupt.h>
#include <avr/io.h>



uint8_t tick_1sec;



void timer1_init(void) // 1 second timer
{
    OCR1A = 15624;

    TIMSK |= (1<<OCIE1A);
    TCCR1B = (1<<WGM12);        //CTC mode
    TCCR1B |= (1<<CS12)|(0<<CS11)|(1<<CS10);    
}



ISR(TIMER1_COMPA_vect)  //1 second interrupt
{
    cli();
    tick_1sec = 1;
    sei();          
}



void timer0_init(void) // fast pwm with OC0 non-inverting mode
{
    TCCR0 = (1<<FOC0)|(1<<WGM01)|(1<<WGM00);
    TCCR0 |= (1<<COM01)|(0<<COM00);
    TCCR0 |= (1<<CS02)|(1<<CS01)|(1<<CS00);
    OCR0 = 63;
    TIMSK |= (1<<OCIE0);
}



int main(void)
{
    uint8_t t = 0;

    DDRB = 0xFF;

    timer0_init();      
    timer1_init();
    sei();

    while(1){

        if (tick_1sec)
        {
            tick_1sec = 0;
            t++;
            if (t == 10){
                OCR0 = 127;
            }
            else if (t == 20){
                OCR0 = 191;
            }
            else if (t == 30){
                OCR0 = 63;
                t = 0;
            }
        }
    }

    return 0;
}

person avr_rookie    schedule 21.01.2014    source источник
comment
Пожалуйста, правильно отформатируйте свой код с четырьмя пробелами.   -  person Jonathon Reinhart    schedule 21.01.2014


Ответы (1)


Что нужно проверить:

Я рекомендую объявить tick_1sec как volatile, чтобы компилятор не гипероптимизировал этот регистр.

Какая у вас тактовая частота? Ваш ISR будет доставлять вызовы 1 с, только если частота вашего процессора составляет 16 МГц (==> 16.000.000 / 1024/15624).

У вас может быть светодиод в вашем оборудовании, который вы можете инвертировать с a) на ISR b) в первом if () в main, чтобы увидеть, будет ли это когда-либо достигнуто.

обновление: "непостоянный"

Ссылку, предоставленную @skyrift в его комментарии, очень стоит прочитать.

Когда вы используете Atmel Studio, скомпилируйте свой код один раз с / без ключевого слова volatile и сравните, что делает компилятор ==> Solution explorer / Output Files / * .lss ... вы увидите каждый оператор C и то, как компилятор его преобразует в машинный код ... упражнение, которое стоит время от времени при работе с микропрограммами ...

person MikeD    schedule 21.01.2014