аппаратный ШИМ в Attiny2313 (Вопросы новичка)

Обсуждаем контроллеры компании Atmel.
Ответить
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Уважаемые коты!
Пожалуйста помогите разобраться с Аппаратным ШИМ в Attiny2313. в частности теории. Сам я ITшник, и местами пейсатель на Delphi/C++, а вот электроникой недавно увлекся ^_^, в институте проходили. но тогда не зацепило.

Есть учебная граната задача... (Hello world доделал недавно, это второй проект)
Есть тинька2313, есть 3 семисегментника (можно и 2 заюзать, но в HEX читать дисплей - не привычно), есть 3 кнопки и один RGB светодиод.
Задача: при помощи ШИМа заставить светодиод выдавать определенный цвет, задавая параметр R/G/B от 0 до 255

Как я вижу решение этой задачи: присуседить 3 семисегментника (как из примера в обучалке - "Динамическая индикация"), используется 10 ног ("точки" нафиг не нужны)
Прикрепить 3 кнопки, 2 из которых будут отвечать за установку количества каждого цвета. 3я кнопка - ввод R/G/B

Соответственно диод должен будет менять свой цвет, изменяя R/G/B параметр.

Итого задействовано 19 ног, включая обвязку питания и адскую кнопку РЕСЕТ.

Для того что бы у меня диод светил, я интенсивность задаю через ШИМ.
Программно задача описывается так: крутить счетчик для каждой ноги, считая от 0 до 255 и если текущее значение меньше установленного, то на порт выводить 1, если больше выводить 0 (можно и на оборот, как надо установим методом научного тыка).

Хочется "усложнить" задачку, и понять как можно реализовать через аппаратный ШИМ.

в ДШ сказано, что ШИМ в аттини - Есть, и вроде как 2 штуки!.
Уважаемые форумчане, подскажите:
1) на сколько реально использовать аппаратный ШИМ для данной задачи, и хватит ли?
2) Схемотехника - на какие ноги вешается LED-RGB
3) Ваше видение решения данной задачи (экспертное мнение)

PS за схему не бить, рисовал в обед на работе...
ЗЫЫ Сильно в википедию, Хоровица-Хилла и ДШ носом не тыкать :)))))))
Вложения
NSD.jpg
вот она, вот она схема моей мечты :))))
(215.33 КБ) 1434 скачивания
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

1) на сколько реально использовать аппаратный ШИМ для данной задачи, и хватит ли?
Реально, хватит, там 4 канала аппаратных ШИМа, но придётся задействовать оба таймера
2) Схемотехника - на какие ноги вешается LED-RGB
Смотрите на первой странице краткое описание функций: ноги OC0A/B (таймер 0, 8-битный) и OC1A/B (16-битный). Вот на три из этих четырёх.
3) Ваше видение решения данной задачи (экспертное мнение)
Любая аппаратная вещь намного проще и надёжнее её программной реализации. В данном случае вам надо только настроить таймеры, и они сами будут всё делать. Вам останется только изменять числа в регистрах сравнения, когда это необходимо, и пропорционально будет меняться яркость.
ЗЫЫ Сильно в википедию, Хоровица-Хилла и ДШ носом не тыкать
Ну а как вы хотели? Всех котят носом в молоко тыкают по началу :)))
Токоограничивающие резисторы нужно на каждый вывод светодиода, а не один на все. Анод жестко на плюс сажайте, а на катоды - резисторы. То же касается и индикатора: на каждый из семи выводов.
Реклама
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

ну про резисторы, было нарисовано "тут где-то должен быть резистор".... про то что резюк перед ногой сажать надо - был научен пока игрался с "HelloWorld" :(((
ноги OC0A/B (таймер 0, 8-битный) и OC1A/B (16-битный). Вот на три из этих четырёх
не просеку фишку... как оно работает.

Если кто может, обЪясните по принципу:

OC0A каждый такт от внутреннего генератора/XTAL1,2 за такт(количество тактов) делает 256 отсчетов и если некая переменная в памяти МК := True тогда на ногу OC0A выдается логическая "1" в противном случае "0", состояние переменной проверяется при каждой итерации приросте некого встроенного счетчика...

ЗЫ: Коты! просто очень тяжело врубиться в "программинг МК", когда всю жизнь думал абстракциями WinAPI XD, изъясняясь на Delphi
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Вообще-то всё описано в даташите, и подробно :)

OC0A - просто название вывода.
Тактовый генератор тоже не при чём, таймер тактируется от собственного предделителя, и может работать либо напрямую от переферийной шины clkI/O (сичтай - тактового генератора, т.е. с частотой кварца), либо с предделителем clkI/O/8, clkI/O/64, clkI/O/256, или clkI/O/1024 (настраивается в регистрах TCCR(0/1)(A/B)).

У него есть регистры сравнения, по два на таймер. Называются они там OCR(0/1)(A/B). Если выбран один из режимов работы как ШИМ, то к модулю сравнения подключается нога. Работает тупо: пока в счётном регистре число меньше, чем в регистре сравнения, на ноге ноль, иначе - единица (или наоборот, настраивается). Счётный регистр постоянно увеличивается, доходит до максимума (255 или 65535 в 16-битном таймере) и сбрасывается (если режим Fast PWM) или начинает считать в обратную сторону (Phase correct PWM).
И всё. Делать ничего не надо, кроме как менять число в регистре сравнения. Всё это работает аппаратно, т.е. в железе. На тупой логике.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 15700
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

насчет кнопушек...

перебор светиков (+/-)
выбор конкретного (подтвердить/отменить)
смена содержимого выбранного канала (+/-)
подтвердить/отменить

похоже одну процедуру (выбор канала) пропустили, а это или еще кнопушка или усложнение программы отображения/ввода параметров.
Да и сами кнопушки... для 3-х штук потребна всего одна дополнительная линия (контроль состояния) - три уже есть - это линии управления позиционными ключами индикатора. :sleep:
Реклама
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Допилил схему...
Возникает пара вопросов.

1) на GND индикаторов (отмечены красным на схеме) нужно вешать резисторы?
2) при такой разводке получится организовать ШИМ для каналов R/G/B ???
Да и сами кнопушки... для 3-х штук потребна всего одна дополнительная линия (контроль состояния) - три уже есть
Поясните, что имеется ввиду???
Кнопки я сажаю на выводы имеющие прерывание...

То что кнопок мало? не вижу затыка.... У семисегментника есть точка... вот какой цвет регулируется - и отображать этой точкой. если отображается цвет, то все точки - включить....

Логика управления такая:

Устройство ВКЛ...

Режим "ОТОБРАЖАТЬ ЦВЕТ" Пока не нажата SW1 в противном случае перейти в режим "Установка цвета"

Режим "установка цвета"
Ждать ввода и выводить текущее значение параметра цвета R, пока не нажата SW1
Ждать ввода и выводить текущее значение параметра цвета G, пока не нажата SW1
Ждать ввода и выводить текущее значение параметра цвета B, пока не нажата SW1 В противном случае "ОТОБРАЖАТЬ ЦВЕТ"


ввод значения осуществлять нажатиями и удержаниями SW2++ и SW3--

вроде хватает кнопочек!


3й вопрос! а хватит ли мне памяти Attiny на всю эту красоту??? Пишу студией на С++
Вложения
NSD1.jpg
Дорисованная схема
(251.47 КБ) 1004 скачивания
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

1) на GND индикаторов (отмечены красным на схеме) нужно вешать резисторы?
Нет, ни в коем случае.
2) при такой разводке получится организовать ШИМ для каналов R/G/B ???
Ну а как же? Три канала, все зацепили, всё получится.
3й вопрос! а хватит ли мне памяти Attiny на всю эту красоту??? Пишу студией на С++
На плюсах??? Да тут вообще никакой памяти не хватит, если только какой-нибудь ARM9 под линуксом :)

На Си хватит. На ассемблере - вы просто не представляете, что можно упихать в два килобайта.
Лично мне удавалось:
1. Программный декодер пульта ДУ
2. Режим обучения этого пульта
3. Часы с календарём (тоже программые)
4. Опрос датчиков 1-Wire (протокол разумеется программный)
5. Опрос 4х каналов АЦП (это была мега48) и вычисления
6. 4 канала ШИМ работали
7. 24 кнопки на пульте задействовано (24 режима роботы усройства)

Всё это ОДНОВРЕМЕННО работало и уместилось на 2Кб памяти. Еще килобайт позже потратил на всякие рюшечки. 4Кб, которые у меги, так и не использовал.
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

возникла "Идея".
Есть ли смысл вместо резисторов повесить буфер(а) 74HC244 или 245....на семисегментную матрицу? чтоб не нагружать ноги МК

Так же смущает ISP разъем отладки висящий на кнопкках.... Исходя из ДШ так делать можно, но из практики "HelloWorld" я вывел на порты MOSI/MISO/SCK "Моргать диодами"
#include <avr/io.h>
#include <avr/delay.h>
int main(void)
{
DDRB=0b11111111;
DDRC=0b000000;
double DelayCount;
DelayCount=1000.00;

while(1)
{
if (PINC3 == 1)
{
DelayCount = DelayCount+1000.00;
} else {}

if (DelayCount == 3000.00) {DelayCount=1000.00;} else {}

//TODO:: Please write your application code
PORTB=0b11111111;
_delay_ms(DelayCount);
PORTB=0b00000000;
_delay_ms(DelayCount);
}
}
и у меня больше этот МК (Atmega8A DIP) не определяется программатором (фирменный ISP MK2)...хотя есть подозрения, что я начудил с фьюзом отключающим РЕСЕТ....
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Есть ли смысл вместо резисторов повесить буфер(а) 74HC244 или 245
Конечно можно. Надо будет всего три ноги. Но удобнее использовать 74HC595, у него есть буфер, и не надо гасить индикаторы при пропихивании данных.
Так же смущает ISP разъем отладки висящий на кнопкках.... Исходя из ДШ так делать можно, но из практики "HelloWorld" я вывел на порты MOSI/MISO/SCK "Моргать диодами"
Главное, чобы нагрузка на этих портах не мешала программатору. А кнопки не проблема, если не нажимать их во время прошивки.
хотя есть подозрения, что я начудил с фьюзом отключающим РЕСЕТ....
Зря вы фьюзы трогали. Не разобравшись, не стоит этого делать.

Ну и совет: если всё-таки трогаете фьюзы, то сначала прочтите их с нового контроллера, выставьте только те, которые нужно, и только потом запишите. Просто разный софт их по разному отображает - бывает в инверсном виде, бывает нет.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

c2n писал(а):Допилил схему...
Возникает пара вопросов.

1) на GND индикаторов (отмечены красным на схеме) нужно вешать резисторы?
...
без ложной скромности :)))
вот тут писал о проблемах подключения индикаторов к МК
http://radiokot.ru/articles/30
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Кстати да, отличный материал. Забыл про эту статью... :oops:
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

спасибо :beer:
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Да! статейка - отличнейшая!

При использовании буфера 595, я так понимаю из ДШ у меня ног для индикации вместо 8 будет использоваться 4, но при этом скорость вывода падает в 8 раз???? а еще иметь геморой с тактированием?

Может есть смысл применить 8-8 параллельный регистр??? только я не знаю как звать этого зверька(мне для общего развития), и не является ли он мифическим? хотя.. ног уже наверно не хватит!!!! прийдется уже городить огород из сдвиговых, чтобы управлять записью в паралельные регисты.....

Помоему 74НС244 гораздо проще... в данном случае он будет использоваться как источник питания для семисегментников.... исходя из ДШ каждый выход тянет 20мА, сигналы "Земли" станут управляющими для буфера, а сами индикаторы жестко лягут на корпус!

Или я наивная чукотская девушка???? о_О
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

ри использовании буфера 595, я так понимаю из ДШ у меня ног для индикации вместо 8 будет использоваться 4
Три. Данные, строб, и защёлка.
но при этом скорость вывода падает в 8 раз????
Да. Вместо 8 миллионов раз в секунду цифры будут мелькать миллион раз в секунду. Очень медленно, замучаешься ждать, пока индикатор обновится :)))
Помоему 74НС244 гораздо проще...
Наоборот. В случае с ним придётся гасить индикаторы во время продвижения данных, т.е. использовать еще ногу и транзисторный ключ (порт МК не потянет три индикатора по току). И жёстко посадить индикаторы на корпус не получится, ими надо будет управлять.
исходя из ДШ каждый выход тянет 20мА, сигналы "Земли" станут управляющими для буфера, а сами индикаторы жестко лягут на корпус!
В том то и дело - не лягут. А вот с 595ми - лягут.
GP1
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2401
Зарегистрирован: Пт май 23, 2008 19:32:22
Откуда: Россия, Волгоград

Сообщение GP1 »

c2n писал(а):
Помоему 74НС244 гораздо проще... в данном случае он будет использоваться как источник питания для семисегментников.... исходя из ДШ каждый выход тянет 20мА, сигналы "Земли" станут управляющими для буфера, а сами индикаторы жестко лягут на корпус!

Или я наивная чукотская девушка???? о_О
там в ДШ есть еще такой параметр как максимальный ток через выводы питания,
Изображение
так что максимум можно получить 70/8=8.75мА на вывод
Вложения
Снимок1.PNG
(10.1 КБ) 5659 скачиваний
Чем дальше, тем больше становлюсь занудой...
Изображение
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

И 20мА - это очень много. Такой ток гребут индикаторы с высотой цифр 5-7см. В даташитах на индикаторы, обычно, указывают максимальный допустимый ток. Если там написано 20мА, то это значит, что при 5мА, что при 20мА различия в яркости на глаз будут почти незаметны, но будет лишний расход тока. Так что не советую задирать ток очень сильно. В статике и так всё прекрасно видно.
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Данные, строб и защелка
Это я понимаю 595 нужно вешать на каждый индикатор?
или вешать общий строб , ДАТА0, ДАТА1, ДАТА2, ЗАЩЕЛКА0, ЗАЩЕЛКА1, ЗАЩЕЛКА2
Высвободил целую ногу.. гы гы гы :)

Тогда с какой ноги МК взять СТРОБ ???
Контактная информация:
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Защелка.. защелка.... еще одна бредовая идея :)
а поподробней про Q7" (для объединения регистров).... для облегчения разводки, было бы неплохо рулить всеми 3 одновременно!

загоняя непрерывную последовательность: КодСимвола1КодСимвода2КодСимвола3

По окончании дернуть все защелки одновременно.

Нашел:) Q7" соединяется с входом след. микросхемы.
Причем немного не понял, Защелку надо держать постоянно, чтоб буфер выдавал значения? или достаточно просто моргнуть ей в течении нескольких тактов????

Может быть есть уже готовые микросхемы? в которую двоично число загоняешь а она как надо выкидывает на семисегментный индикатор????
Последний раз редактировалось c2n Пт июл 27, 2012 11:08:02, всего редактировалось 1 раз.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Сообщение ploop »

Это я понимаю 595 нужно вешать на каждый индикатор?
На них можно и динамику сделать, но это сложнее.
Тогда с какой ноги МК взять СТРОБ ???
С любой.
загоняя непрерывную последовательность: КодСимвола1КодСимвода2КодСимвола3
Это называется каскадирование.
Первый регистр, вход DATA цепляем к МК, стробы и защёлки у всех трёх объединены. Их тоже на МК. Три ноги, всё.
Вход DATA второго регистра цепляем к выходу Q7' первого
Вход DATA третьего - к выходу Q7' второго.

Выставляем с МК бит на DATA. Дёргаем строб. Все три регистра сработают, внутренний буфер сдвинется, при этом у первого регистра во внутреннем буфере на выходе Q0' появится этот бит. А тот, что был на Q7' уедет во второй регистр, и так по цепочке.

После того, как передали 8*3 = 24 бита (24 раза дёрнули строб) у нас получается все три внутренних регистра заполнены нашими данными. При этом на выходе ничего не изменялось. Чтобы скопировать их на выход - дёргаем один раз защёлку, и на трёх регистрах одновременно на выходах появляются данные.

В случае с 244м данные на выходах менялись бы при каждом стробе, и на индикаторах в эти моменты была бы каша. Смотрится это просто как засветка всех сегментов во время обновления.
c2n
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1193
Зарегистрирован: Ср июл 25, 2012 21:40:09
Откуда: Самара

Сообщение c2n »

Нашел:) Q7" соединяется с входом след. микросхемы.
Причем немного не понял, Защелку надо держать постоянно, чтоб буфер выдавал значения? или достаточно просто моргнуть ей в течении нескольких тактов????

Может быть есть уже готовые микросхемы? в которую двоично число загоняешь а она как надо выкидывает на семисегментный индикатор????
Вопрос по схемотехнике еще... на выход с регистра перед индикатором на линии резисторы сажаются так-же, как и в случае использования порта микросхемы? или оно уже там нафиг не надо ??? и какой типовой номинал резистора обычно используется??? 100R ом хватит? или 1КR нужен?
по моим подсчетам 20мА - ток сегмента, 5вольт напряжение питания... по закону Ома 250 ом должно быть...

Я просто сомневаюсь... а то контроллеры палить не жалко, а сегментник - 75рублей стоит :( его жалко....
Контактная информация:
Ответить

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