Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры ATmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/35: Рейтинг темы: голосов - 35, средняя оценка - 4.83
Ivkim132
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 7
1

Ambilight на Atmega16

21.05.2013, 02:37. Просмотров 6407. Ответов 16
Метки нет (Все метки)

В образовательных целях захотел сделать Ambilight на Atmega16. Реализовал аппаратную часть на Atmega16, FTD232 для передачи данных с компьютера, ULN2003 в роли транзисторного ключа. Сделал наброски Wymdows приложения и прошивки по МК. Реализация Wymdows приложения следующим образом: забил 10 областей по краям монитора, определяю преобладающий цвет и отправляю все эти пакеты на МК. На МК ловлю эти пакеты и в бесконечном цикле вывожу пришедшие значения на ножки. Реализовал ШИМ, для управления RGB светодиодом. Использовал порты напрямую, все хорошо работало. Сейчас использую массив портов, чтобы проще было бегать по портам и устанавливать уровень с задержкой, но в таком случае яркость светодиода очень сильно упала и на ножке МК 0,4В. Меряю мультиметром, думаю, что сам мультиметр не успевает измерить напряжение, т.к. ШИМ очень быстро вкл/выкл светодиод.
Черновые быдлоисходники предлагаю.

[9.73 Кб]
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2013, 02:37
Ответы с готовыми решениями:

ATMega16
Привет обитателям данного портала! Я имею микроконтроллер с ATMEGA 16. Также знаю язык C#, но увы я...

Atmega16
изучаю прерывания, помогите понять что значит в начале памяти программ и в области загрузчика? ...

Atmega16
помогите пожалуйста! есть микроконтроллер atmega16. через ассемблер на PORTC подаем комбинацию...

Atmega16 + SD
Дорогие форумчане! Помогите, подскажите пожалуйста с данной задачей. Дино: 1. Плата...

Универсальный AmbiLight
Подскажите, имеет ли право на жизнь нижеописанная схема? Загорелся желанием сделать на свой ТВ...

16
kysoft
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 140
21.05.2013, 09:17 2
Вы выводите в порт только нули. Исходник не тот?
В прерывания нет контроля за выходом за пределы массива.
0
Ivkim132
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 7
21.05.2013, 12:49 3
Извините, не ту версию залил. Исправил.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
21.05.2013, 13:15 4
*ArrayPort[i]._PORT &= ArrayPort[i]._MASK; // set 0
Сбрасывать бит надо не маской, а инверсией маски.
0
21.05.2013, 13:15
kysoft
0 / 0 / 0
Регистрация: 13.01.2013
Сообщений: 140
21.05.2013, 13:17 5
По И маску нужно инвертировать.
*port &= ~mask;
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
21.05.2013, 13:24 6
Цитата Сообщение от Ivkim132
яркость светодиода очень сильно упала и на ножке МК 0,4В.
Конечно, упала! В восемнадцать раз. Вы ж так написали цикл, что пока одному LEDу отрабатываются (фаза высокого уровня + фаза низкого уровня), остальные 17 LEDов ждут в выключенном состоянии.

Цитата Сообщение от Ivkim132
Меряю мультиметром, думаю, что сам мультиметр не успевает измерить напряжение, т.к. ШИМ очень быстро вкл/выкл светодиод.
Мультиметр будет показывать среднее значение напряжения на ножке МК. Собственно, ШИМ и предназначается для изменения среднего значения напряжения путём быстрого переключения двух дискретных уровней. У Вас сейчас светодиоды почти всё время выключены, среднее напряжение на ножке МК 0.4V.
0
Ivkim132
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 7
21.05.2013, 18:59 7
А почему когда я опрашивал только 3 светодиода, яркость тоже была тусклая как при 18, это при массиве портов, а когда обращаюсь напрямую, то все нормально с яркостью?
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
21.05.2013, 19:01 8
Цитата Сообщение от Ivkim132
А почему когда я опрашивал только 3 светодиода, яркость тоже была тусклая как при 18, это при массиве портов, а когда обращаюсь напрямую, то все нормально с яркостью?
Понятия не имею, как выглядел предыдущий код "когда обращаюсь напрямую".
Исправьте для начала хотя бы инверсию маски - что изменится?
0
Ivkim132
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 7
21.05.2013, 19:21 9
При нынешнем коде в дебагере выставляется попорядку на ножки МК. Я не понимаю что вы имеете в виду. Раньше делал
PORT B= 0b01000000;
задержка;
PORT B=0b00000000;
задержка;
Вот по такому принципу обращался. Цвета оно определяет, проблема в яркости.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
21.05.2013, 19:39 10
Цитата Сообщение от Ivkim132
При нынешнем коде в дебагере выставляется попорядку на ножки МК. Я не понимаю что вы имеете в виду. Раньше делал
PORT B= 0b01000000; //LED_ON
задержка;
PORT B=0b00000000; //LED_OFF
задержка;
Вот по такому принципу обращался. Цвета оно определяет, проблема в яркости.
Если на уровне цикла по массиву LEDs:
Код
for (i = 0; i < 18; i++) {
LED[i] ON; on_delay;  LED[i] OFF; off_delay;
}
не можете заметить ляп - посмотрите на один уровень выше: как цикл работает со всеми светодиодами в сумме. Раскрываем цикл:
Код
  LED[0] ON; on_delay;  LED[0] OFF; off_delay;    //LEDs 1...17 в это время OFF
LED[1] ON; on_delay;  LED[1] OFF; off_delay;    //LEDs 0, 2...17 в это время OFF
LED[2] ON; on_delay;  LED[2] OFF; off_delay;    //LEDs 0...1, 3...17 в это время OFF
LED[3] ON; on_delay;  LED[3] OFF; off_delay;    //LEDs 0...2, 4...17 в это время OFF
LED[4] ON; on_delay;  LED[4] OFF; off_delay;    //LEDs 0...3, 5...17 в это время OFF
... ... ...
LED[16] ON; on_delay;  LED[16] OFF; off_delay;    //LEDs 0...15, 17 в это время OFF
LED[17] ON; on_delay;  LED[17] OFF; off_delay;    //LEDs 0...16 в это время OFF
Теперь понятно?
0
Ivkim132
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 7
21.05.2013, 20:03 11
Я понимаю как оно работает. Я не понимаю почему при обращении на прямую оно светит как нужно, а при использовании массива такая беда. Как Вы предлагаете это реализовать? только без протоколов типа SPI.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
21.05.2013, 20:14 12
Цитата Сообщение от Ivkim132
Я понимаю как оно работает. Я не понимаю почему при обращении на прямую оно светит как нужно, а при использовании массива такая беда. Как Вы предлагаете это реализовать? только без протоколов типа SPI.
Как всё запущено-то... То есть Вы не видите ошибку?
Ладно, среди форумов этого сайта была тема про "много-премногоканальный программный ШИМ", готовый код, примерно по тому же принципу. Не помню только название темы :-(
Кто-нибудь может подсказать товарищу плиз? Ссылочку на ту тему.
0
Ivkim132
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 7
22.05.2013, 14:41 13
Когда я делаю для одного светодиода, яркость не изменяется, она такая же как при всех. Проблема появилась при добавлении структур.
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
22.05.2013, 15:04 14
Цитата Сообщение от Ivkim132
Когда я делаю для одного светодиода, яркость не изменяется, она такая же как при всех. Проблема появилась при добавлении структур.
Проблему Вы устроили сами и не хотите вникать.
Как у Вас задумано: LED включён в течение (delay) времени, выключен в течение (255 - delay) времени, период=255, яркость=delay/период=delay/255.
Как сейчас сделано: LED включён в течение (delay) времени, выключен в течение (255*18 - delay) времени, период=255*18, яркость=delay/период=delay/(255*18).
Между задумано и сделано лежит грубая ошибка. Не понимаю, чего Вы ещё ждёте - что само рассосётся?
Период включения-выключения должен отрабатываться одновременно для всех 18-ти LEDs, а не по очереди. И структуры/массивы - не помеха, с ними нормально можно сделать, только кривой алгоритм выпрямить :-)
0
Woddy
0 / 0 / 0
Регистрация: 13.10.2009
Сообщений: 3
22.05.2013, 18:57 15
Byt Angle Modulation (BAM)

мне 16мгц на 20 каналов ШИМа хватило
0
OtixPM
0 / 0 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
22.05.2013, 19:21 16
Цитата Сообщение от woddy
Byt Angle Modulation (BAM)

мне 16мгц на 20 каналов ШИМа хватило
Для AmbiLightа очень хороший вариант imho. Правда, это не ШИМ (сигнал, модулирующий LEDы, переключается не два раза за период), но в результате даже побыстрее получается. Помнию, Johmmy007 его пропагандировал.
0
Ivkim132
0 / 0 / 0
Регистрация: 17.05.2013
Сообщений: 7
15.06.2013, 00:04 17
Добрый вечер! Не было возможности доделать устройство.
Нашел свою ошибку, разобрался с ШИМ, использовал 2 случая:1) ШИМ реализован на таймере с переполнением2)ШИМ реализован на таймере сравнения.
Не могу понять почему при переполнении горит только один светодиод. При сравнении настраиваю регистр сравнения на число 255. Фактически он должен работать так же как и по переполнению, но их работа отличается. Сделал пока следующим образом: использую таймер по сравнению(число для сравнения 10) и когда выполняется прерывание бегаю по всем каналам, устанавливаю уровни и TCNT0 = 1;. Когда использую 3 светодиода, то все нормально, если 8 светодиодов, то при слабой яркости моргают светодиоды, я так понимаю не хватает тактовой частоты? или может тело цикла при выполнении выполняется дольше, по времени, чем срабатывает прерывание таймера?
Код перезалил.
0
15.06.2013, 00:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.06.2013, 00:04

СМА whirlpool awt2288 проц atmega16 прошить, проц atmega16 прошить
есть ли защита от считывания? То есть могу ли я слить прошивку процессора и записать на другой?

max232 + atmega16
Друзья подскажите как подружить COM порт и мегу мою (только не говорите что надоел уже с этой мегой...

wh1602p+atmega16
В чем может быть проблема? В Proteus не работает. .include &quot;m16def.yms&quot; ; ?????????? ATMiko16...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.