Avr attiny26 самоделки

Добавил пользователь Дмитрий К.
Обновлено: 18.09.2024

Часто можно слышать отзывы об Arduino, что это дорого, неэффективно, профанация идеи и т.п. Если задуматься, то окажется, что во многом эта критика справедлива. Одним Arduino сыт не будешь. Если мне требуется микроконтроллер для чего-то простого, например: дисплей и пара кнопок, то использование для такой тривиальной задачи Arduino, действительно можно сравнить с забиванием гвоздей электронным микроскопом. Но если отбросить эмоции и подумать, что наиболее ценное в Arduino-проектах? На мой взгляд, это колоссальный объем открытого кода написанного под различные проекты. Называя вещи своими именами, я не хочу писать с нуля программу для работы микроконтроллера с дисплеем, я хочу использовать уже готовую библиотеку, которую я использовал для Arduino. И не потому что мне "слабо", а потому что я не вижу смысла в изобретении еще одного велосипеда.

О портировании проектов Arduino для “младшего” семейства микроконтроллеров AVR ATtiny пойдет речь в этом посте.

Из литератуты рекомендую почитать книгу: Андрей Евстифеев "Микроконтроллеры AVR семейства Tiny"

Arduino использует старшее семейство микроконтроллеров ATmega. Портируя программы на ATtiny придется отказаться от некоторых плюшек. Что мы теряем кроме меньшей памяти и меньшего количества ног? Отказаться придется от UART и I2C интерфейсов(ATtiny2313 это по сути не совсем ATtiny). Если вас это не пугает, то идем дальше.


из всего этого следует только одна команда: после чего можно запускать Arduino IDE
Если все нормально, то в меню: “Сервис->Плата” увидим список поддерживаемых микроконтроллеров ATtiny:

Здесь, пожалуй, сразу следует пояснить. oscillator - генератор тактовой частоты. Если вы купили микроконтроллер и еще не успели поменять fuse-биты, то генератор должен быть встроенным и работать на частоте 1MГц. Что будет, если ошибешься с частотой? Работать будет, но или медленнее или быстрее.

BOD - детектор пониженного питания ака Brown-out Detection. Датчик позволяющий определить пониженный уровень питания и “мягко” выключить чип предотвратив дребезг питания. Дело в том, что выключение питания, процесс не мгновенный, чип доли секунды работает при не достаточном питании. В таком состоянии, программа зашитая в нем, начинает выполняться с произвольных адресов т.е. работать хаотически. Это чревато чем? Если ваша программа пишет в EEPROM, то в этом состоянии она запишет туда кашу.


У меня под рукой оказался ATtiny45

Эта публикация — ответ на часто задаваемые вопросы по семейству микроконтроллеров ATtiny4/5/9/10. Большинство из них решается внимательным чтением документации. Тем не менее, я решил описать основные отличия в работе с этими МК. Под катом вы найдёте рассказ о самых младших AVR'ах, а также описание проблем, появляющихся при знакомстве с ними.

Старший представитель семейства — ATtiny10 появился в 2009 году и может быть легко приобретён у большинства поставщиков.

Кроме Atmel контроллеры в таком корпусе есть у Microchip. Однако PIC10F2xx уступают по характеристикам, а гибридные PIC10F3xx имеют меньше программной памяти, хотя у них на борту есть программируемая логика и они значительно экономичнее.

Я составил сравнительную таблицу некоторых МК этих семейств, потребление указано на МГц в активном и спящем режимах.

В таблице не указан размер EEPROM, ведь её нет.

Учитывая более мощный ассемблер AVR'ов мой выбор однозначно склоняется в их сторону. Хотя PIC10F3xx выглядят весьма неплохо, мне пока не приходилось с ними работать.

При знакомстве c микроконтроллерами ATtiny10 возникает несколько проблем. Вот 5 самых распространённых.

1. Не переключается тактовая частота

Особенно это проявляется в программах на С, поэтому примеры будут на нём.
Система тактирования этого семейства имеет ряд отличий от остальных AVR'ов. Поскольку соответствующих фьюзов нет, их функции выполняют 3 регистра: CLKMSR, CLKPSR и, обратите особое внимание — CCP.
После сброса контроллер всегда запускается от внутреннего источника 8 МГц и имеет пределитель 8. Чтобы переключится на другой источник, надо изменить содержимое CLKMSR, а изменить пределитель — CLKPSR. Что с ними можно сделать написано в таблицах 6-3 и 6-4 даташита.
Дело в том, что конструкция следующего вида не имеет ожидаемого эффекта:


Некоторых это обескураживает, но регистры, отвечающие за тактирование, защищены от записи.
Чтобы изменить их содержимое надо в CCP записать значение 0xD8, это даст 4 такта на работу с этими регистрами, причём в течение этих 4 тактов любые прерывания игнорируются.
Правильно делать так:


Такие выражения присваивания обычно выполняются за два такта. Однако может генерироватся менее эффективный код. В случае возникновения такой проблемы имеет смысл записывать CCP перед каждым изменением защищённого регистра, окружая группу конструкции запретом прерываний.

2. Проблемы со сторожевым таймером

3. Перевод RESET в режим GPIO

Как и у остальных микроконтроллеров AVR вход сброса может быть переключён в режим порта ввода-вывода. Возможность прошивать контроллер последовательным программатором при этом теряется. Семейство интересно тем, что для решения этой проблемы достаточно подать 12 вольт на RESET в течение всего времени программирования, предварительно отключив эту линию от программатора.

4. Контроллер не программируется, не видится программатором

У тех кто впервые использует это семейство, очень частая проблема. Обычно, дело в питающем напряжении, интерфейс TPI по которому прошиваются эти контроллеры, работает только при питании равном 5 вольтам, и соответствующих логических уровнях программатора.

5. А где фьюзы?

У рассматриваемого семейства осталось совсем немного фьюзов.
Половина уместилась в младший байт по адресу 0x00. Это RSTDISBL — выключающий сброс, WDTON — разрешающий сторожевой таймер, и CKOUT — выводящий сигнал с частотой тактового генератора на порт PB2.
Lock Byte, необходимый для защиты от программирования и чтения памяти контроллера, остался на своём месте.

Несмотря на кажущуюся маломощность, ATtiny10 может не только мигать светодиодами или преобразовывать интерфейсы. Позднее я расскажу о программном USB для этих крохотных контроллеров.

// в цыкл вкинул TCNT0=0; для отладки в Atmel Studio. Если цыкл оставить пустым не отлаживается.
2. Судя по даташит я включил два ШИМ канала, соответственно сигналы должны меняться на ножках PB0, PB1,PB2,PB3. Один прямой и инвертированый выход.
3. При отладке в Atmel Studio изменение состояния данных выходов не происходит. Счетчик увеличивается но при достижении OCR1B не обнуляется.

В чем ошибка? Или это режим отладки в Atmel Studio не показывает или причина в другом ? Програму не прошивал и непосредственно на контролере не испытывал.

Не могу понять в чем проблема. Неужели такой сложный вопрос.

Attiny 85 - программный ШИМ в прерывании
Здравствуйте. Прошу помощи, у самого понять не получается. Хочу сделать программный ШИМ на.

Dell Vostro 3560 (LA-8241P) - Не включался, после замены шим сдохла и шим и ещё что-то
Имеется бук бп в защиту не уходил, но ни на что не реагировал. После изучения схемы и проверки.

Attiny 13 ADC
решил сделать автовключение света в ванной. купил дальнометр 2Y0A21, подключил его к ардуино и.

Так сложилось, что основной МК с которым я работаю постоянно и на котором делаю подавляющее большинство задач это ATTiny2313 — он популярен, а, главное, это самый дешевый контроллер из всей линейки AVR с числом ног более 8. Я их брал числом около трех сотен за 18, чтоль, рублей штучка. Но вот западло — у него нет АЦП . Совсем нет. А тут он понадобился — нужно замерить сигнал с датчика. Засада. Не переходить же из-за такой фигни на более фаршированную ATTiny26 — она и стоит дороже и фиг где купишь у нас, да и что тогда делать с той прорвой ATTiny2313 что уже закуплена? Пораскинул мозгами…

А почему бы не сварганить АЦП последовательного сравнения? Конечно, быстродействие и точность будет не фонтан, зато, не меняя тип МК и всего с двумя копеечными деталями дополнительного обвеса, я получу полноценный, хоть и тормозной, 8ми разрядный АЦП, вполне удовлетворяющий моим скромным запросам!

Как работает АЦП последовательного сравнения.
Что у нас есть в ATTiny2313 аналогового? Правильно — аналоговый компаратор . Теперь достаточно подать на его вход замеряемый сигнал и методично сравнивать с опорным напряжением, линейно изменяя величину опорного напряжения. На каком из опорных напряжений произойдет сработка компаратора, тому и примерно равен измеряемый сигнал +/_ шаг изменения опорного.

Осталось получить переменное опорное напряжение, а чем, из сугубо цифрового выхода контроллера, можно вытянуть аналоговый сигнал? ШИМом! Предварительно его проинтегрировав. Для интеграции используем простейший RC фильтр. Конденсатор у нас будет интегрировать заряд, а резистор не даст сдохнуть порту при зарядке кондера. Результатом прогона ШИМ’а через подобный фильтр станет достаточно стабильное постоянное напряжение.

Осталось только прикинуть номиналы фильтра. Частота среза — частота, начиная с которой, фильтр начинает глушить переменную составляющую, у Г образного RC фильтра равна обратной величине из его постоянной времени w=1/RC . Я воткнул кондер на 0.33Е-6 Ф и резистор на 470 Ом, получилось что w=6447 рад/c . Поскольку угловая частота нам никуда не уперлась, то делим ее на 2pi = 6.28 получили около килогерца, 1026.6 Гц, если быть точным. Раз частота ШИМ а у нас запросто может быть порядка десятков килогерц, то на выходе будет гладенькая такая постоянка, с незначительными пульсациями.

Теперь заворачиваем эту ботву на вход компаратора, на второй пускаем наш измеряемый сигнал и начинаем развлекаться с кодом. Получилась вот такая схема, собранная на той же макетке, что и прошлый раз. Тут, правда, не ATTiny2313, а Mega8 у которой АЦП есть, но мы пока забудем о его существовании. Красными линиями нарисован наш фильтр.

А это фотография платы. Резистор напаян снизу, на дорожки, а вот конденсаторы видно. Их два, так как я тут и на второй канал ШИМ повесил фильтр, правда так и не задействовал. Также видно, что белый провод от переменного резистора теперь идет на инверсный компаратора, а оранжевый идет с ноги конденсатора на прямой вход.


Код будет простецкий, чтобы не заморачиваться выложу архив проекта и отдельные исходники в виде файлов:

  • UARTundADC.asm — Головной файл
  • vectors.asm — Таблица векторов прерываний
  • init.asm — Инициализация периферии
  • macro.asm и define.asm — Макросы и макроопределения
  1. Конфигурируется аналоговый компаратор и, главное, активизируются его прерывания. Описание и настройка компаратора уже были описаны ранее
  2. Затем в сканирующий регистр (R21) закидывается начальное значение сканирования 255.
  3. После чего это значение забрасывается в регистр сравнения ШИМ OCR1AL . ШИМ был заранее, в разделе init.asm сконфигурирован и запущен, так что сразу же на его выходе появляется сигнал скважностью (скважность это отношение длительности сигнала к периоду этого сигнала) 1 т.е., фактически, пока это просто единица.
  4. Выжидаем в функции Delay некоторое время, чтобы закончился переходный процесс (конденсатор не может мгновенно изменить свое напряжение)
  5. Уменьшем значение сканирующего регистра (что при загрузке в OCR1AL уменьшит скважность на 1/255), проверяем не стало ли оно нулю. Если нет, переходим на пункт 3.


А остальное сделает компаратор . Как только он сработает, а он сработает в любом случае — ведь какое нибудь да напряжение обязательно есть на входе. То его прерывание возьмет текущее значение регистра сравнения OCR1AL , ведь именно на нем у нас совпало напряжение, и выдаст нам в качестве результата замера.

По окончании скан цикла, выданное значение отправляется в регистр UDR и улетает в комп, рисуя в окне Terminal’a график вращения ручки переменного резистора.

Как видно, вверху есть некоторый срез. Это связано с тем, что максимальное напряжение, которое может выдать нога МК, с учетом падений на всех резисторах, порядка 4.7 вольта, а с задающего потенциоматера я могу и все 5 выкрутить. Ну еще и верхушки заваливаются чуток. Если понизить частоту, то диапазон несколько расширится.

Вот так, применив немного смекалки, а также две дополнительные детали общей суммой в один рубль и десяток строк кода, я сэкономил кучу бабла =)

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.

Читайте также: