Программный ШИМ на 3 канала, attiny 13

Обсуждаем контроллеры компании Atmel.
Ответить
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine

Сообщение WishMasterMax »

Доброго времени суток! Решил научиться пользоваться шимом и для этих целей купил rgb светодиод и попытался им управлять при помощи тини 13, суть затеи такова, цвета плавно меняются с красного на зеленый, с зеленого на синий и с синего на красный, по сути мелочь, для изменения цвета формы в приложении например это элементарно, а вот с микрухой появились проблемы, переход с красного на зеленый выходит а потом начинается неизвестно что... Помогите пожалуйста, а еще лучше обьясните как правильно делать програмный шим с помощью таймера, что нужно выставлять, чему присваивать значение, обучалок много пересмотрел но как-то не помогло....Заранее благодарен. Прилагаю "свой"(страшный как чудовище франкенштейна, собранный из нескольких сорцов) код. Назначение некоторых присвоений я не знаю, так что возможно будет что-то не к селу не к городу :)) Буду рад критике и указанию на ошибки))

Код: Выделить всё

    #include <tiny13a.h>
    #include <delay.h>
    #include <stdlib.h>
     
    #define RED 1
    #define GREEN 0
    #define BLUE 2
     
     
    unsigned char wave_counter=0;
     
    unsigned char red_bs=0;
    unsigned char green_bs=0;
    unsigned char blue_bs=0;
    unsigned char rg = 1;         
    unsigned char gb = 0;
    unsigned char br = 0;
    
     
    interrupt [TIM0_COMPA] void timer0_compa_isr(void)
    {                    
   
        PORTB.RED=(wave_counter<red_bs);   
        PORTB.GREEN=(wave_counter<green_bs);
        PORTB.BLUE=(wave_counter<blue_bs);
        wave_counter++;    
    }
     
     
    void common_init()
    {
        CLKPR=0x80;
        CLKPR=0x00;   
        TIMSK0=0b100;
        DDRB=0xff;    
        TCCR0A|=0b10;
        TCCR0B=4;     
        red_bs = 255;
    }
     
    void main(void)
    {
        common_init();           
        #asm("sei")      
        while (1){   
        if(rg)
        {
        red_bs--;
        green_bs++;  
         if(red_bs == -1)
        {          
         red_bs = 0;
         rg = 0;   
         gb = 1;
        } 
        }  
        if(gb)
        {
        green_bs--;
        blue_bs++;
         if(green_bs == -1)
        {
         gb = 0;
         br = 1;
        }  
        } 
        if(br)
        {
        blue_bs--;
        red_bs++;   
        if(blue_bs == -1)
        {
         br = 0;
         rg = 1;
        }
        }          
        delay_ms(100);
                }              
                }
In me the WishMaster...
Изображение
Изображение
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Сообщение king-live »

А без аппаратного шима пробовали делать шим? Если нет, то сначало надо без аппаратного шима составить программу, в вашем случае можно и до пяти каналов шим сделать. Отработать алгоритм без ошибок, а потом уже перейти на шим. Я сам довёл шим (програмный) на Atmega8 до 16 каналов. (Использовал функции if,else,_delay_us(...))
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Поскольку у вас реализация ШИМ практически очевидна, предлагаю сделать все проще. у вас есть 3 канала - в цикле выводить в каждый из них значение записанное в ячейках EEPROM из массива, но с разной фазой!

например, задали массив "формы" изменения яркости одного диода в 99 ячейках.

Для первого диода начинаете с 1 ячейки, для второго с 33 ячейки, для третьего с 66 ячейки. и КАЖДЫЙ из них менять циклически при достижении 99 переходить на первую...

Насколько широкую форму изменения яркости для одного диода задашь - настолько сильно их зажигание будет перекрываться. Например если задашь горб только в 1/3 части массива - всегда будет гореть только один диод, первый закончит цикл и за ним начнет цикл 3-й, потом 2-й и т.д. если горб растянуть на 2/3 массива - будут гореть два диода, один загорается - другой тухнет.

Реализация такого алгоритма на С будет довольно тривиальной... буквально в 3-4 строчки. Разве нет?
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine

Сообщение WishMasterMax »

Согласен, но проблема в другом, я не могу понять что мне куда задавать чтобы настроить таймер, что куда присваивать....у меня с этим проблема, а программу уже не составит труда написать :) Подскажите что мне куда задавать чтобы выставить время таймера, колличество тиков в секунду например....уже много перелопатил манов но не могу врубится :( , одни пишут на вин авр другие на ассемблере а мне бы на чистом си и с комментариями если можно, как работать с таймером, как работать со сторожевым таймером и т.д....
Я был бы очень очень благодарен :) Закодить я могу, только для начала нужно ткнуть носом как :))
In me the WishMaster...
Изображение
Изображение
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Собственно, таймер настраивается путем записи в управляющий регистр. В зависимости от установленных бит он работает в заданном режиме - как именно и что устанавливать можно прочитать в соответствующем разделе даташита. Там из сложного - разобраться в картинке поясняющей работу таймера в выбранном режиме. Управлять скважностью - путем записи в регистр сравнения выбранного таймера, после настройки его в режиме PWM. Настроить его можно на автоматическое управление выходом, или обрабатывая прерывание от него. По прерыванию переполнения - установить порт в "1" а в прерывании по совпадению - "0" получишь на выходе этого порта "1" длительностью пропорциональной величине в регистре сравнения, и частотой определяемой скоростью переполнения таймера.

А со сторожевым таймером работать особо не надо. Ему нужно задать лишь интервал "срабатывания", запустить(есть даже бит в конфигурации который стартует таймер аппаратно сразу с началом работы программы) и периодически, до истечения интервала времени сбрасывать его. Как только перестанешь сбрасывать(алгоритм зациклится в неподконтрольной области), таймер досчитает до нуля и сбросит контроллер.
Контактная информация:
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine

Сообщение WishMasterMax »

а можно маленький образец на си, если не трудно конечно :)
In me the WishMaster...
Изображение
Изображение
Контактная информация:
Реклама
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

Это уже не ко мне.
не знаешь как на С значение в регистр записывать? или даташиты читать не умеешь? Верней, их надо не читать а курить.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

WishMasterMax писал(а):но проблема в другом, я не могу понять что мне куда задавать чтобы настроить таймер, что куда присваивать.
... первая же попытка "гугления" по запросу "программный шим avr" http://habrahabr.ru/post/152299/
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine

Сообщение WishMasterMax »

как задать значение я знаю) Проблема в том что я не пойму какие регистры нужны) А вот с манами наверное проблемы, я не разобрался с регистрами...
In me the WishMaster...
Изображение
Изображение
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1163
Зарегистрирован: Ср янв 05, 2011 16:25:15

Сообщение ChipKiller »

WishMasterMax писал(а):Проблема в том что я не пойму какие регистры нужны
... начинать программировать не разобравшись в принципе работы - ИМХО пустая трата времени.

PS. ... по регистрам - если используется TIMx_Ovf - работаем с TCNTx, иначе OCRx
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

В конце каждой главы даташита идет описание всех регистров которые влияют на работу таймера. Оттуда и начинай. В зависимости от режима работы некоторые регистры просто не влияют.
Контактная информация:
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 389
Зарегистрирован: Пн июл 09, 2012 11:07:59
Откуда: Ukraine

Сообщение WishMasterMax »

ChipKiller, спасибо, теперь знаю в каком направлении идти :)
Alexeyslav, спасибо, будем искать :)
In me the WishMaster...
Изображение
Изображение
Контактная информация:
Ответить

Вернуться в «AVR»