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

Обсуждаем контроллеры компании Atmel.
Ответить
m.zdorenko
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс май 03, 2015 14:18:46

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

Сообщение 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]

З.Ы. И как тут вставлять видео?
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

С питанием то все нормально?
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
m.zdorenko
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс май 03, 2015 14:18:46

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

Сообщение m.zdorenko »

Z_h_e писал(а):С питанием то все нормально?
Питание от программатора, а так же менял на питание от импульного блока на 12v 1.5A с понижением напряжения до 5v (LM7805)
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Reset в воздухе? Подключите его к питанию.
Оставте один светодиод, а лучше ни одного и поглядите осциллографом что происходит.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Эиком - электронные компоненты и радиодетали
m.zdorenko
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс май 03, 2015 14:18:46

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

Сообщение m.zdorenko »

Z_h_e писал(а):Reset в воздухе? Подключите его к питанию.
Оставте один светодиод, а лучше ни одного и поглядите осциллографом что происходит.
reset повесил на питание через резистор 4к7 - не помогло.
Вытащил все светодиоды, изменил программу на дерганье только одной ноги - не помогло.
Осциллографа, к сожалению нет :(
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Ну если Вы с питанием и со схемой точно уверены, нужно проверить частоту тактирования.
Проверьте регистр CLKPR.
Попробуйте написать код чтобы светодиод мигал с частотой 1 Гц и посмотреть что реально получилось.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
GARMIN
Держит паяльник хвостом
Сообщения: 954
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда
Контактная информация:

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

Сообщение GARMIN »

ТС, вы уверены, что ваше прерывание выполняется меньше, чем за 256 тактов процессора?
ИМХО, вы просто не выходите из прерывания и процессор не успевает за таймером.
Настройте делитель таймера побольше.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

Я это проверял у него. Счетчик для 100 не успевает досчитать. Вроде бы как к коду нет замечаний.

Вот, попробовал в протеусе код. Частота 125 Гц.
Изображение
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
vdavid
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

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

Сообщение vdavid »

А отчего же не мигать, если частота ШИМ 8000000/256/256=122 Гц?
m.zdorenko
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс май 03, 2015 14:18:46

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

Сообщение 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 сек
При таком промежутке времени отсутствия питания я не должен замечать мигание. - Что то не так с частотой!? А проверить фактическую частоту без осциллографа не возможно :(
DL1USB
Родился
Сообщения: 5
Зарегистрирован: Сб янв 05, 2013 02:03:06

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

Сообщение DL1USB »

Увас помоему включен внутренний делитель на 8 , тоесть частота будет 1 Мгц. Посмотрите внимательно фьюзы.

Проверте бит Divide clock by 8 internally; [CKDIV8=0]
m.zdorenko
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс май 03, 2015 14:18:46

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

Сообщение m.zdorenko »

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

Проверте бит Divide clock by 8 internally; [CKDIV8=0]
Стоит вот так, поменять не могу в выпадающем списке, кроме установленного значения ничего нет.
Изображение
Rtmip
Держит паяльник хвостом
Сообщения: 963
Зарегистрирован: Чт апр 03, 2014 23:16:55
Откуда: Россия

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

Сообщение 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 МГц(для тини, конечно) несмотря на фьюзы...
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

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

Сообщение Z_h_e »

m.zdorenko писал(а):А проверить фактическую частоту без осциллографа не возможно
Конечно возможно. Я же Вам говорил, сделайте в коде частоту мигания 1Гц ( а лучше еще меньше) и проверьте что получилось на самом деле. Наверняка будет мигать в 8 раз медленнее и потому я предлагал проверить регистр CLKPR
m.zdorenko писал(а):Стоит вот так, поменять не могу в выпадающем списке, кроме установленного значения ничего нет.
Попробуйте в программе программаторе изменить фьюзы не списком, а изменяя чекбоксы. Выберите вместо 2313 2313а или наоборот, может глюк какой. Я как-то пробовал разлочить обычную atmega8 параллеьным программатором chipprog phyton, так он (гад такой) никак не хотел ее сбрасывать пока не выбрал atmega8L.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
vdavid
Мучитель микросхем
Сообщения: 410
Зарегистрирован: Чт ноя 13, 2008 16:33:42

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

Сообщение vdavid »

m.zdorenko писал(а):Стоит вот так, поменять не могу в выпадающем списке, кроме установленного значения ничего нет.
Внизу в L-Fuse поставьте галку на крайнем левом бите.
m.zdorenko
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс май 03, 2015 14:18:46

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

Сообщение 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.

Спасибо.
m.zdorenko
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Вс май 03, 2015 14:18:46

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

Сообщение m.zdorenko »

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

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

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

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