Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: странность с ШИМ на atmega48
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Ermol
Приветствую! Сразу скажу что я не особо секу в проргаммировании rolleyes.gif

Я настраиваю таймеры для работы ШИМ на атмеге48 - 20 Мгц, но получается что-то непонятное в те моменты когда ничего генерироваться не должно.

вот код

Код
#include <avr/io.h>

int main()
{

    DDRB = (1<<PB1)|(1<<PB2);

    TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<WGM10);
    TCCR1B = (1<<WGM12)|(1<<CS11)|(0<<CS10);
    OCR1A = 0;
    OCR1B = 0;

      for(;;)
    {
    }    
}


а вот что получается - диничные имульсы через каждые 100мкс


картинка из протеуса, но осциллограф с ней согласен.

при этом шим работает адекватно, за исключением нулевого значения в OCR1A и OCR1B.

Подскажите, где не прав?
Палыч
Цитата(Ermol @ Jan 12 2011, 18:02) *
когда ничего генерироваться не должно.
С чего это Вы взяли? Вот когда Вы зададите значение ТОР (в Вашем случае - FF), вот тогда импульсов не будет (но будет высокий уровень)...
Ermol
Цитата(Палыч @ Jan 12 2011, 18:46) *
С чего это Вы взяли?

Тяжело сказать... Но я был в этом уверен cranky.gif

Убрать эти импульсы можно, я пологаю, просто отключая таймер когда мне нужен низкий уровень, прописывая в TCCR1B = (0<<CS11) ?
Палыч
Цитата(Ermol @ Jan 12 2011, 19:06) *
Убрать эти импульсы можно, я пологаю, просто отключая таймер когда мне нужен низкий уровень, прописывая в TCCR1B = (0<<CS11) ?
Вам, вероятно, нужно получить два различных выходных сигнала... Если Вы остановите таймер для получения "чистого" нуля на одном выходе, то что Вы будите иметь на втором выходе?
Если Вы желаете иметь "чистый" ноль, но не принципиально иметь "чистый" высокий уровень можно это организовать инверсией выхода (СОМ1х1:0=3) с одновременной инверсией значений, заносимых в OCR1х.
Ermol
Точно, нужны оба выхода.
Идею я понял, спасибо!
Сергей Борщ
QUOTE (Ermol @ Jan 12 2011, 18:06) *
Убрать эти импульсы можно, я пологаю, просто отключая таймер когда мне нужен низкий уровень, прописывая в TCCR1B = (0<<CS11) ?
Достаточно сбросить COM1A1 или COM1B1, предварительно записав в соответствующий разряд PORTx ноль.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.