Pull to refresh

Большие подводные камни маленького контроллера

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

image

Эти контроллеры относятся к семейству tinyAVR, как и популярная ATtiny85, однако значительно отличаются от остальных. Во-первых, только ATtiny4, 5, 9 и 10 корпусируются в маленький, но легко паяемый SOT23-6. Во-вторых, для программирования используется интерфейс TPI, который несовместим с традиционным ISP. В-третьих, это единственные tinyAVR, источник тактирования которых можно переключать «на лету», что роднит их с более современными решениями.

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

Микроконтроллеры в корпусе SOT23-6 интересны малыми размерами, они занимают около 9 кв.мм. С этим показателем могут потягаться только «безвыводные» корпуса, которые несравнимо сложнее в монтаже и часто требуют многослойных плат.

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

Я составил сравнительную таблицу некоторых МК этих семейств, потребление указано на МГц в активном и спящем режимах.
Название Flash,
байт
RAM,
байт
Тактирование АЦП Аналоговый
компаратор
ИОН Таймер Питание,
В
Потребление
ATtiny4 512 32 8 МГц
128 КГц
- + - 1, 16 бит
2 PWM канала
1.8 — 5.5 200 мкА
<0.1 мкА
ATtiny5 512 32 8 МГц
128 КГц
1, 8 бит
4 канала
+ - 1, 16 бит
2 PWM канала
1.8 — 5.5 200 мкА
<0.1 мкА
ATtiny9 1024 32 8 МГц
128 КГц
- + - 1, 16 бит
2 PWM канала
1.8 — 5.5 200 мкА
<0.1 мкА
ATtiny10 1024 32 8 МГц
128 КГц
1, 8 бит
4 канала
+ - 1, 16 бит
2 PWM канала
1.8 — 5.5 200 мкА
<0.1 мкА
PIC10F206 768 24 4 МГц - + + 1, 8 бит
Нет PWM
2 — 5.5 <175 мкА
0.1 мкА
PIC10F222 768 23 8 МГц
4МГц
1, 8 бит
2 канала
- + 1, 8 бит
Нет PWM
2 — 5.5 <175 мкА
0.1 мкА
PIC10F320 ~460 64 16 МГц
32 КГц
1, 8 бит
3 канала
- + 2, 8 бит
Есть PWM
1.8 — 3.6
2.3 — 5.5
25 мкА
0.02 мкА
PIC10F322 ~920 64 16 МГц
32 КГц
1, 8 бит
3 канала
- + 2, 8 бит
Есть PWM
1.8 — 3.6
2.3 — 5.5
25 мкА
0.02 мкА

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

Стоимость продукции Atmel находится в пределах 58-72 центов в партии 1000 штук. PIC чуть дешевле от 46 до 75 центов, но достать их в корпусе SOT23-6 не так просто. В локальных магазинах все эти МК можно купить по цене от 70–80 рублей за штуку.

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

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

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


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

CLKPSR = (1<<CLKPS2);

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

CCP = 0xD8;
CLKMSR = (1<<CLKMS0);
CLKPSR = (1<<CLKPS0);

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

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


Выбор режима «собачки» происходит через регистр WDTCSR, который также защищён регистром CCP. Думаю, комментарии тут излишни.

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


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

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


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

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


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

Несмотря на кажущуюся маломощность, ATtiny10 может не только мигать светодиодами или преобразовывать интерфейсы. Позднее я расскажу о программном USB для этих крохотных контроллеров.
Tags:avrattiny10TPIмикроконтроллерыatmelmicrochipPIC10для начинающихпрограммирование микроконтроллеров
Hubs: Programming microcontrollers
Total votes 38: ↑37 and ↓1 +36
Views40.4K

Popular right now

Top of the last 24 hours