Страница 1 из 1

Первый проект Attiny2313 необходима помощь.

Добавлено: Вс май 03, 2015 15:53:41
m.zdorenko
Доброго времени.

Решил начать изучение микроконтроллеров и написать первый проект. Сейчас схема довольно простая к 6 ножкам порта B подключены резисторы и светодиоды.
Реализация программного ШИМ на 6 каналов. (планирую сотворить контроллер RGB ленты на 2 канала с внешним управлением)

На текущий момент проблема в том, что частота включения шим очень маленькая, мерцание светодиодов заметно глазу. Не могу понять причину.

Контроллер настроен на частоту от внутреннего генератора на 8MHz, таймер запущен без делителя. То есть должно быть 8000000Mhz/255(тиков до переполнения таймера) = 31372 срабатываний таймера в секунду. Каждая нога, в данном случае у меня ch1_red, ch1_green, ch1_blue, ch2_red, ch2_green, ch2_blue имеет свой, пока жестко закрепленный порог срабатывания. описанный переменными ch1_light_red, ch1_light_green, ch1_light_blue,ch2_light_red, ch2_light_green, ch2_light_blue.

Сам код:

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

#define F_CPU 8000000 /*устанавливаем частоту микроконтроллера*/

#include <avr/io.h> /*подключаем библиотеку контроллера*/
#include <avr/interrupt.h> /* подключаем библиотеку прерываний*/

#define ch1_dir DDRB /*устанавливаем первый канал*/
#define ch1 PORTB 
#define ch1_red PB2 
#define ch1_green PB1 
#define ch1_blue PB0 

#define ch2_dir DDRB /*устанавливаем второй канал*/
#define ch2 PORTB 
#define ch2_red PB5
#define ch2_green PB4
#define ch2_blue PB3

char counter=0; /*счетчик прерываний*/

uint8_t ch1_light_red = 50;
uint8_t ch1_light_green = 150;
uint8_t ch1_light_blue = 200;

uint8_t ch2_light_red = 200;
uint8_t ch2_light_green = 150;
uint8_t ch2_light_blue = 50;

ISR(TIMER0_OVF_vect)    
{  
	if (++counter==0)
	{
  	ch1 |=(1<<ch1_red)|(1<<ch1_green)|(1<<ch1_blue);
    ch2 |=(1<<ch2_red)|(1<<ch2_green)|(1<<ch2_blue);
	}
	if (counter==ch1_light_red) ch1 &=~(1<<ch1_red);
  if (counter==ch1_light_green) ch1 &=~(1<<ch1_green);
  if (counter==ch1_light_blue) ch1 &=~(1<<ch1_blue);
  
	if (counter==ch2_light_red) ch2 &=~(1<<ch2_red);
	if (counter==ch2_light_green) ch2 &=~(1<<ch2_green);
	if (counter==ch2_light_blue) ch2 &=~(1<<ch2_blue);
} 

void initialization() /*инициализация программы*/
{
  ch1_dir |=(1<<ch1_red)|(1<<ch1_green)|(1<<ch1_blue); 
  ch2_dir |=(1<<ch2_red)|(1<<ch2_green)|(1<<ch2_blue);
  
  TCCR0A = 0b00000000; 
  TCCR0B |=(1<<CS00); /*clkI/O/(No prescaling) таймер без делителя*/
  TIMSK |=(1<<TOIE0); /*разрешаем прерывание по перевыполнению*/

  sei(); /*разрешаем глобальные прерывания*/
}

int main(void)
{
    initialization();
    
    while(1)
    {
      
    }
}
Контроллер прошивался через Khazama AVR Programmer v 1.7.0 с помощью программатора USBASP фьюзы по частоте выставлены.
Изображение

Никак не могу понять с чем связано заметное мерцание.
Ссылка на youtube:
https://youtu.be/JseHw6jMewM
[youtube]https://youtu.be/JseHw6jMewM[/youtube]

З.Ы. И как тут вставлять видео?

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вс май 03, 2015 16:35:20
Z_h_e
С питанием то все нормально?

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вс май 03, 2015 16:50:04
m.zdorenko
Z_h_e писал(а):С питанием то все нормально?
Питание от программатора, а так же менял на питание от импульного блока на 12v 1.5A с понижением напряжения до 5v (LM7805)

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вс май 03, 2015 16:55:54
Z_h_e
Reset в воздухе? Подключите его к питанию.
Оставте один светодиод, а лучше ни одного и поглядите осциллографом что происходит.

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вс май 03, 2015 21:29:51
m.zdorenko
Z_h_e писал(а):Reset в воздухе? Подключите его к питанию.
Оставте один светодиод, а лучше ни одного и поглядите осциллографом что происходит.
reset повесил на питание через резистор 4к7 - не помогло.
Вытащил все светодиоды, изменил программу на дерганье только одной ноги - не помогло.
Осциллографа, к сожалению нет :(

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Пн май 04, 2015 06:46:35
Z_h_e
Ну если Вы с питанием и со схемой точно уверены, нужно проверить частоту тактирования.
Проверьте регистр CLKPR.
Попробуйте написать код чтобы светодиод мигал с частотой 1 Гц и посмотреть что реально получилось.

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вт май 05, 2015 06:04:06
GARMIN
ТС, вы уверены, что ваше прерывание выполняется меньше, чем за 256 тактов процессора?
ИМХО, вы просто не выходите из прерывания и процессор не успевает за таймером.
Настройте делитель таймера побольше.

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вт май 05, 2015 06:50:14
Z_h_e
Я это проверял у него. Счетчик для 100 не успевает досчитать. Вроде бы как к коду нет замечаний.

Вот, попробовал в протеусе код. Частота 125 Гц.
Изображение

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вт май 05, 2015 09:46:43
vdavid
А отчего же не мигать, если частота ШИМ 8000000/256/256=122 Гц?

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вт май 05, 2015 22:51:08
m.zdorenko
"Будьте добры, помедленнее! Я записываю..." ©
Не совсем понял. На сколько я знаю, что б было заметно мигание то питание на ножке светодиода должно отсутствовать около 25мс. однако частота 122Гц это единица за 8мс.
При этом если прерывание выполняется менее 256 тиков, то все должно быть норм.
К сожалению вчера я залочил тиньку - неправильно прошил фьюзы. А так как из подопытных осталась только atmega8 переписал программу под нее. На частоте 8МГц все работает отлично, учитывая то что в прерывание я еще добавил делитель (яркость) для каждого канала. То есть евент уже выполняется дольше. :))

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

ISR (TIMER0_OVF_vect)
{
  if (++counter==0)
  {
    channel_1_buffer_red = (channel_1_current_red * brightnessDivider) / channel_1_brightness[0];
    ...
  }
}

Сейчас в руках еще одна тинька 2313. Хочу до конца понять в чем моя ошибка и как исправить.


А теперь опыты: (человек я такой - все опытным путем) :))
Выкосил все каналы кроме одного (откидываем время выполнения прерывания)
Оставил только канал #define ch1_red PB2, установил переменную uint8_t ch1_light_red = 255; (то есть на канал будет постоянно подаваться сигнал) - Так и есть.
начинаем опытным путем изменять значение переменной пока не замечу мигание. - Долго мучаться не пришлось. Мигание я четко заметил уже при uint8_t ch1_light_red = 240;
Что не может соответствовать истине ведь переменная counter изменится с значения 240 до значения 255 за 0,48мс => 1с/(8000000/256/15) = 0,00048 сек
При таком промежутке времени отсутствия питания я не должен замечать мигание. - Что то не так с частотой!? А проверить фактическую частоту без осциллографа не возможно :(

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Вт май 05, 2015 23:44:46
DL1USB
Увас помоему включен внутренний делитель на 8 , тоесть частота будет 1 Мгц. Посмотрите внимательно фьюзы.

Проверте бит Divide clock by 8 internally; [CKDIV8=0]

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Ср май 06, 2015 00:01:52
m.zdorenko
DL1USB писал(а):Увас помоему включен внутренний делитель на 8 , тоесть частота будет 1 Мгц. Посмотрите внимательно фьюзы.

Проверте бит Divide clock by 8 internally; [CKDIV8=0]
Стоит вот так, поменять не могу в выпадающем списке, кроме установленного значения ничего нет.
Изображение

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Ср май 06, 2015 05:09:33
Rtmip
DL1USB писал(а):Увас помоему включен внутренний делитель на 8 , тоесть частота будет 1 Мгц....
Совершенно верное замечание!
m.zdorenko писал(а):поменять не могу в выпадающем списке, кроме установленного значения ничего нет.
Не знаю, почему не можете поменять, тогда сделайте так:

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

void initialization() /*инициализация программы*/
{
  CLKPR=(1<<CLKPCE);
  CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);

  ch1_dir |=(1<<ch1_red)|(1<<ch1_green)|(1<<ch1_blue); 
  ch2_dir |=(1<<ch2_red)|(1<<ch2_green)|(1<<ch2_blue);
  
  TCCR0A = 0b00000000; 
  TCCR0B |=(1<<CS00); /*clkI/O/(No prescaling) таймер без делителя*/
  TIMSK |=(1<<TOIE0); /*разрешаем прерывание по перевыполнению*/

  sei(); /*разрешаем глобальные прерывания*/
}

и будет у вас 8 МГц(для тини, конечно) несмотря на фьюзы...

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Ср май 06, 2015 07:43:06
Z_h_e
m.zdorenko писал(а):А проверить фактическую частоту без осциллографа не возможно
Конечно возможно. Я же Вам говорил, сделайте в коде частоту мигания 1Гц ( а лучше еще меньше) и проверьте что получилось на самом деле. Наверняка будет мигать в 8 раз медленнее и потому я предлагал проверить регистр CLKPR
m.zdorenko писал(а):Стоит вот так, поменять не могу в выпадающем списке, кроме установленного значения ничего нет.
Попробуйте в программе программаторе изменить фьюзы не списком, а изменяя чекбоксы. Выберите вместо 2313 2313а или наоборот, может глюк какой. Я как-то пробовал разлочить обычную atmega8 параллеьным программатором chipprog phyton, так он (гад такой) никак не хотел ее сбрасывать пока не выбрал atmega8L.

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Ср май 06, 2015 08:38:59
vdavid
m.zdorenko писал(а):Стоит вот так, поменять не могу в выпадающем списке, кроме установленного значения ничего нет.
Внизу в L-Fuse поставьте галку на крайнем левом бите.

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Ср май 06, 2015 20:27:51
m.zdorenko
Поставил
Внизу в L-Fuse поставьте галку на крайнем левом бите.
Помогло. Спасибо огромное всем за помощь. :))
В Khazamе с визуальным отображением фьюзов не все ок =( Да и тинька 2313 там только одна.

Теперь возникло еще пару вопросиков :)))
Текущая схема будет управлять метром RGB светодиодной ленты 12V 1,1A потребления на каждый канал.
Лента подключается через полевики irl540, на макетке все хорошо, но если паять то большие они. Да и если я правильно понимаю их возможности намного больше мной требуемых.
Могу ли я в своем проекте использовать полевики IRLML6344TR http://www.irf.com/product-info/datashe ... 344pbf.pdf ? Если я правильно прочитал даташит то по параметрам они подходят.

Сейчас управление всеми ШИМ сделано через кнопки. Однако хочу использовать UART.
Завтра должен приехать переходничек USB->Uart. И как назло, когда лазил в поисках описания работы UART на скринах у авторов видел программы мониторы UART под винду, сейчас же ни одну не могу найти.
Подскажите каки-то, как для новичка, под винду 8.

Спасибо.

Re: Первый проект Attiny2313 необходима помощь.

Добавлено: Сб май 09, 2015 16:25:11
m.zdorenko
Про полевики вопрос остается актуален :(
UART монитор себе нашел. Вот сижу и думаю как передавать отправлять данные по нему.
Есть 2 варианта:
1) передавать из МК данные по маске, скажем uint8_t buffer[6] = {'R',255,'G',120,'B',58}; То есть ШИМ для 1 канала установлен 255 для второго 120 и бля третьего 58.
На компьютере проверять целостность маски и обрабатывать ее. По такой же маске посылать данные обратно в МК и разбирать их там.

2) сделать коммандное меню. Скажем прописать команды getRed(), setRed() по первой получать значение шим по первому каналу, по второй устанавливать значение для шим.

Первый способ не требует большого кода на МК, обработка идет на компе. Второй наоборот, но командное меню как то вроде интересней.
Подскажите, как правильней сделать?