Показаны сообщения с ярлыком AVR. Показать все сообщения
Показаны сообщения с ярлыком AVR. Показать все сообщения

02.05.2012

Анонс

По многочисленным просьбам читателей Artem Volk обновил свою статью 
Минимальный клон Arduino за $3 на ATmega8A с модифицированным bootloader'ом, специально осветив моменты, касающиеся последних изменений в ArduinoIDE 1.0 и дополнив новым вариантом клона, уже за $3.5 :)

15.03.2012

ArduinoIDE в Ubuntu 11.10

К сожалению, дистрибутив ArduinoIDE для Linux не включает в себя сам компилятор gcc (или, если быть более точным, его порт для AVR, avr-gcc). С одной стороны - это хорошо, поскольку дистрибутив становится меньше. С другой стороны - плохо, потому что произвольные сочетания версий компонентов компилятора могут давать существенные "вывихи" и генерить  неверный код.

Например, после апдейта своей Ubuntu до 11.10, я обнаружил у себя такие версии:
  • binutils-avr: 2.20.1
  • gcc-avr: 4.5.3
  • avr-libc: 1.7.1
В то время как в комплекте с ArduinoIDE 1.0 для Windows, который и поныне можно скачать на сайте arduino.cc, версии выглядят более консервативно:
  • binutils-avr: 2.19
  • gcc-avr: 4.3.2
  • avr-libc: 1.6.4
Что с этим делать и как бороться?...

03.08.2011

USBasp и TPI

Thomas Fischl, являющийся автором отличного программатора USBasp (поддерживается avrdude), разразился новой версией прошивки. А я уже и не надеялся на какие-то изменения - просто случайно зашел на страничку проекта USBasp.

По сравнению с предыдущей прошивкой, выпущенной более двух лет назад, в этой изменилось следующее:
  • добавилась поддержка протокола программирования TPI для ATtiny4, ATtiny5, ATtiny9, ATtiny10;
  • теперь поддерживаются MCU, у которых flash превышает 128К;
  • поправлен небольшой косяк с синхронностью последовательности разрешения программирования и сигналом RESET;
  • использовано новое ядро V-USB.
Автор первых двух изменений - Slawomir Fraś, фанатик USBasp. Однажды зимним вечером 2010 года он обнаружил, что его любимый usbasp не желает прошивать свежезакупленные ATtiny10, и не смог отказать себе в удовольствии сделать патч и для firmware, и для avrdude.

В отличие от стандартного MISO/MOSI/SCK + RESET, режим TPI предназначен для шестиногих MCU и использует сигналы TPIDATA/TPICLK + RESET (то есть, на одну линию меньше). Но если программатор не умеет поддерживать такой режим - увы, запрограммировать шестиногие ATtiny как-то по-другому невозможно :(

Если вы решились использовать последнюю версию, надо знать о паре интересных моментов.

Во-первых, поскольку USBasp поддерживается только avrdude, а новая версия 5.11 пока еще не вышла, для программирования новых ATtiny придется тянуть рабочий срез svn и собирать из исходников (звучит грозно, но на самом деле - несложно). Если поддержка TPI пока не требуется - новая прошивка будет замечательно работать и с версией 5.10.

Во-вторых, результирующая прошивка перестала влезать в 4К и использовать можно только ATmega88 или ATmega8. 

Новую версию прошивки USBasp я буду шить в этот набор - работает она вполне нормально.


С TPI, правда, возможности проверить пока не представилось, но если попадется соответствующий чип - обязательно проверю. Avrdude из svn собирается без шаманства - и вот, например, пакеты для Матерой Машки x64 ( Ubuntu Maverick Meerkat 10.10 ):
Если надо еще какие-то пакеты под иной debian-совместимый дистрибутив - пишите, постараюсь собрать.

23.07.2011

A6 & A7

Еще раз убедился, что учиться никогда и никому не поздно.



Почему-то всегда считал, что "лишние" выводы ADC6 и ADC7 у MCU cемейства ATmega в корпусе TQFP32 - это полноценные выводы. И только сейчас понял, что это не так - они могут работать только как вход АЦП. Иными словами, их нельзя сконфигурить в качестве цифровых входов или выходов, увы :(

Относится это только к тем платам, которые имеют "на борту" SMD-версию ATmega328 - как правило, это Nano и Seeeduino. Счастливые обладатели ATmega в PDIP-корпусе вообще, наверное, не поймут, о чем речь ;) 

09.01.2011

Минимальный клон Arduino за $3 на ATmega8A с модифицированным bootloader'ом

Сразу признаюсь, что заголовок призван привлекать внимание — конечно, за $3 полноценную Arduino-плату не собрать, но минимальное решение вполне можно.

Платы проекта Arduino идеальны для макетирования и сборки прототипов, а для законченных устройств хотелось найти что-то более дешевое и доступное. В этой заметке будет описана минимальная Arduino-совместимая конструкция.

В качестве отправной точки использовались статьи Minimal Arduino with ATmega8 (внимание: в этой статье есть ошибка, значения fuse-битов неверны) и страница об ArduinoISP из официальной wiki. К сожалению, ни одна из этих статей в своё время не ответила на все мои вопросы, кроме того появилось желание немного «подкрутить» стандартный bootloader, но об этом ниже.

Поддержка новых плат и IDE
(дополнение от 01.05.2012
, файлы исправлены 27.05.2012)

Действия, описанные в статье, проверялись на Arduino IDE 0023 и клоне Arduino Duemilanove. С момента написания статьи были выпущены новые платы и обновлена среда. Судя по комментариям пользователей к этой записи, всё работало если в качестве платы-программатора использовались Arduino Uno и Arduino Mega 2560. Для новой версии среды Arduino IDE 1.0.1 я подготовил обновлённый архив (доступен в конце статьи), обновление необходимо из-за незначительных изменений в формате файла boards.txt
 
Минимальная Arduino-конструкция за $3.5
(дополнение от 02.05.2012) 

Этот способ является альтернативным описанному в статье ниже!
В комплекте Arduino IDE 1.0 поставляется новый бутлоадер Optiboot, который занимает всего 512 байт (бутлоадер, описанный в этой статье в два раза больше — 1 Кб) и работает на высоком бодрейте — 115200 (в статье ниже — 38400). Для работы этого бутлоадера дополнительно к описанным в статье компонентам нужен внешний кварц на 16МГц и два конденсатора на 22пФ его обвязки (этим объясняется увеличение стоимости на $0,5 :)). В комплекте с Arduino IDE 1.0 есть уже скомпилированная версия для ATmega8, достаточно только добавить в boards.txt следующее и прошить бутлоадер:
##############################################################
atmega8optiboot.name=ATmega8 (optiboot, 16Mhz XTAL)

atmega8optiboot.upload.protocol=arduino
atmega8optiboot.upload.maximum_size=7680
atmega8optiboot.upload.speed=115200

atmega8optiboot.bootloader.low_fuses=0xBF
atmega8optiboot.bootloader.high_fuses=0xCC
atmega8optiboot.bootloader.path=optiboot
atmega8optiboot.bootloader.file=optiboot_atmega8.hex
atmega8optiboot.bootloader.unlock_bits=0x3F
atmega8optiboot.bootloader.lock_bits=0x0F

atmega8optiboot.build.mcu=atmega8
atmega8optiboot.build.f_cpu=16000000L
atmega8optiboot.build.core=arduino:arduino
atmega8optiboot.build.variant=arduino:standard
 
В версии файлов к статье от 14.07.2012 настройки для этого способа добавлены в состав архива, поэтому править главный boards.txt больше нет необходимости.

10.11.2010

V-USB module

Идея проекта посетила меня после двух-трех успешных реализаций на библиотеке V-USB (для тех, кто не в курсе - это специальная библиотека для avr gcc, позволяющая почти любому МК из семейства AVR программно эмулировать USB в режиме low speed transfer).

Как известно, уже давно успешно существует проект Metaboard - плата, совместимая на 90% с Arduino и bootloader-ом на основе V-USB. Но у нее есть две чувствительных особенности - для загрузки скетча надо сначала замкнуть специальный джампер, а затем - нажать сброс. Второй недостаток - по понятным причинам (панелька) для экспериментов подходит только МК в 28-выводном корпусе. Вот что у меня получилось в поисках более универсального решения:



Девайс получил гордое название V-USB module for solderless breadboard и предназначен, как это следует из названия, для работы с беспаечной макеткой. Для этого в него впаяны вертикальные контактные штырьки:



Они позволяют "усадить" модуль поверх центрального желобка (туда обычно ставят микросхемы):



Одновременно они служат для подключения модуля к схеме - на них выведены D+, D-, +5V, и GND, согласно схеме:



Естественно, при наличии всех деталей в выводном исполнении, схема собирается на  макетке и без специального модуля. С другой стороны, его преимущества очевидны - во-первых, это экономия времени (как на втыкание самих деталей, так и на поиск ошибочно воткнутых), во-вторых - простая установка разъема, ибо никогда не видел разъем USB, который бы состыковался с макетной платой без паяльника и дополнительных проводков и вилочек; В-третьих, далеко не всегда под рукой оказывается выводной самовосстанавливающийся предохранитель: часто им вообще пренебрегают, а здесь он всегда в наличии.

И, конечно же - занимаемое место на самой беспаечной макетке. Плата довольно компактна - 33 х 18 мм, причем ее можно установить так, чтобы она частично выходила за пределы breadboard-а.

После установки остается только подключить микроконтроллер, согласно конфигурации. Сначала надо выяснить, где у МК будут расположены входы D+ и D-, по содержимому usbconfig.h:



...после чего подключить их к соответствующим контактам микроконтроллера по маркировке на модуле:



(на этом фото проект ребутера внешних модемов на ATtiny2313-20PU, использован внешний кварц 12МГц, пара конденсаторов 22пФ).

Своей цели я добился - с таким модулем можно довольно быстро собрать схему для V-USB на беспаечной макетке. Плата выполнена односторонним способом, не содержит перемычек и минимально требует сверления лишь четырех отверстий диаметром 1 мм для установочных штырьков.



Скачать файл проекта V-USB moule for solderless breadboard (лицензия CC-SA).

21.07.2010

AVR-Doper

До недавнего времени я пользовался для программирования своих МК USBasp и не знал никаких проблем. Но однажды приключилась необходимость запрограммировать ATmega1280 на плате Arduino Mega, и каково же было мое удивление, когда avrdude... выругался на несовпадение записанных и считанных данных в процессе верификации.


При этом зашитый в Mega бутлоадер функционировал корректно, скетчи заливались и исправно работали -  скорее всего ошибку можно было игнорировать, но - с другой стороны - а что, если при программировании случится настоящая ошибка? Как я об этом узнаю?

Пришлось лезть в интернет и искать что-то для самостоятельного изготовления. Честно говоря, мне хотелось двух вещей - программное управление скоростью прошивки и совместимости с AVRStudio. Первый пункт - весьма важная деталь, когда надо программировать партию МК: чтобы это произошло быстро, на USBasp надо сначала поставить перемычку "SLOW SCK", зашить фьюзы - чтобы МК перешел с внутренней RC-цепочки 1МГц на внешний кварц, потом снять эту перемычку и шить на нормальной скорости. Вот именно это "снять-поставить" слегка раздражало. Ну а про AVRStudio - тут все ясно, чтобы не страдало удобство работы в родной для МК ATMEL среде. Бывает нужно крайне редко, но все-таки полезная вещь.

В такой ситуации многие посоветовали бы мне схему Андрея Рыжкова, использующую libusb и релизующую функционал AVR910. Спору нет, отличная конструкция (даже в наборах МастерКит видел), но лично меня она в свое время опечалила скоростью работы. Однако стоит учесть тот момент времени, когда Андрей опубликовал свою разработку - это было очень сильно востребовано. Поэтому я еще раз мысленно поблагодарил его за труд, но поиски - продолжил.

К моему сильному удивлению, необходимое мне устройство нашлось на просторах все того же проекта V-USB, и называется это чудо техники  AVRDoper:


Первое и самое главное - он совместим с протоколом STK500 v2, а значит будет работать с AVRStudio. Далее, кроме внутрисхемного последовательного программирования, он умеет последовательное высоковольтное - было бы актуально, если бы я собирал схемы на ATtiny. Программное управление скоростью программирования - есть. Есть даже возможность считывания через USB отладочной информации с подключенного МК - именно это хотел сделать автор USBasp Thomas Fischl, но так у него, видать, руки и не дошли.

Вот схема с выброшенным из нее узлом высоковольтного программирования:



Программное обеспечение у него построено в любимом стиле Objective Development - блоками. То бишь, фичи можно включать и отключать выборочно, "втискивая" в доступный объем памяти МК необходимый набор. В классическом варианте есть режимы STK500 и USB-HID, но нет возможности обновить прошивку самого программатора без извлечения из схемы его МК. Однако, можно чем-то пожертвовать (например, функцией прозрачной передачи последовательных данных для отладки МК) и включить возможность обновления прошивки по USB через bootloader (требует навыков обращения с компилятором avr-gcc ;)

Кстати, это еще не всё ;) Предусмотрены программные конфигурации для работы AVRDoper-а внутри родственных ему проектов USBasp и metaboard. Правда, для этого надо, чтобы USBasp был собран на ATmega8. Готовые прошивки лежат в тарболле с исходниками - остается только залить и протестить ;)

Построить прототип на макетке, к сожалению, не представлялось возможным - авторы использовали микруху 74AC126, которую мне не удалось достать в DIP-корпусе. Так что сразу пришлось травить плату, которая, по счастью, оказалась полностью работоспособной.

Краткий итог: по скорости AVRDoper не уступает USBasp, шьет ATmega1280 "на ура", схема без  высоковольтной части влезла на одностороннюю плату под корпус GAINTA 403:


Единственное, не смог заставить работать в режиме STK500 под Linux - есть какие-то заморочки с  /dev/ttyACM0. Разбираться лень, тем более, что под Windows оно работает во всех режимах, а под Linux я пользую avrdude и меня вполне устраивает USB HID.

Основную часть скриптов уже переделал - наслаждаюсь отсутствием надобности передергивать SLOW SCK ;)

Купить AVRDoper можно, например, здесь.

15.07.2010

V-USB жив!

Почти год прошел с момента предыдущего релиза V-USB, драматически выросло число опубликованных гаджетов, улучшился раздел документации. Поэтому, встречайте новый релиз 2010-07-15, ChangeLog:
  • совместимость для новых МК с суффиксом "P" - например, ATmega328P
  • поддержка устройств, у которых более 64К флеша через USB_CFG_DRIVER_PAGE
  • теперь надо обязательно определять USB_CFG_CLOCK_KHZ в usbconfig.h
  • мелкие фиксы
Новую версию можно скачать здесь.

05.02.2010

JTAG на макетке

Микроконтроллеры ATmega можно условно разделить на две категории: те, что программируются только через ISP (шина из проводов MISO, MOSI, SCK + управление сбросом) и те, что имеют в дополнении к этому интерфейс JTAG.

Из набора "горячо любимых" Arduino-контроллеров к первой категории относятся ATmega8, ATmega168, ATmega328P. Но и во второй категории тоже присутствует один экземпляр: ATmega2560, используемый в Arduino/Freeduino MEGA 2560.

JTAG - это механизм, позволяющий автоматически контролировать качество монтажа печатных плат: не закоротилось ли чего или, наоборот, плохо припаялось. Очень полезная вещь в промышленном масштабе, особенно когда на одной плате "счастливо" уживаются микросхемы разных фирм (стандарт IEEE 1149.1, на котором базируется JTAG - открытый). Тем более логично, что многие производители микросхем добавили возможность программирования и отладки своих чипов через все тот же JTAG.

Для чего может потребоваться JTAG в повседневной жизни?

В моем случае - вдруг потребовалось читать и писать содержимое flash ATmega128, а вместо привычной вилочки ISP наружу торчит только JTAG. В этом случае уже простой программатор типа USBasp, увы, не поможет.

Фирменное устройство от ATMEL стоит немало (а я и так уже прикупил нанопаяльник,   денег после этого осталось ноль отрицательное количество):

Что же делать? Я уже говорил, что стандарт - открытый, а процесс программирования через JTAG хорошо документирован - достаточно открыть любой даташит на микроконтроллер ATMEL с JTAG-интерфейсом.

Кстати, когда-то, на заре появления микроконтроллеров фирмы ATMEL, фирма-конкурент Microchip дразнила ATMEL показательно разобрала какой-то инструментальный девайс для разработчика программ микроконтроллеров ATMEL и демонстрировала, что он собран на микроконтроллерах её производства - то бишь, на PIC-ах. Впрочем, было это невероятно давно, мир теперь уже совсем другой (c).

В интернете есть масса вариантов самодельных копий фирменного AVR JTAG ICE. Одну из таких упрощенных до полного безобразия можно найти, например, здесь. Что самое забавное -  работает, хотя состоит практически из одного МК: ATmega16. Оригинальный программатор использует чип, полностью совместимый с ATmega16, что делает возможным заливание в самопальный программатор прошивок от фирменного (правда, новые навряд ли будут появляться, поскольку AVR JTAG ICE дано снят с производства).

Для начала надо достать основной компонент - микроконтроллер ATmega16-16PU и кварц 7.3728 МГц, после чего собрать на макетке минимальную схему для программирования:



Схема - классическая, необходима для запуска ATmega. Напомню, что обычно делают в таком случае:

  • подключают питание -  все GND и VCC (обычно выводов GND не менее двух);
  • ставят между GND и VCC поближе к ножкам ATmega фильтрующий помехи конденсатор 100 нФ (или 0.1 мкФ - кому как больше нравится);
  • подключают между XTAL1 и XTAL2 кварц и соединяют их через два одинаковых конденсатора на землю (разброс номинала указан в документации, не обязательно использовать 22 пФ, можно, например, и 33 пФ);
  • притягивают линию сброса к VCC через резистор 10К и вешают конденсатор 100 нФ на землю, чтобы обеспечить небольшую задержку линии сброса после подачи питания.

Выглядеть это будет приблизительно так (всё благополучно влезает на макетку 300+100):



Соединяем схему через вилку ISP с программатором и запитываем от него же, затем зашиваем прошивку и выставляем фьюз-биты:

avrdude -C avrdude.conf -c usbasp -p m16 -U hfuse:w:0x1f:m -U lfuse:w:0xcf:m

avrdude -C avrdude.conf -c usbasp -p m16 -U flash:w:miniICE.hex

Если операция прошла успешно, полдела сделано. Можно аккуратно удалить ISP-разъем и преобразовать схему к следующему виду:



На макетке это выглядит так:



Наверное, вы обратили внимание, что в схеме я использовал USB-чип последовательного порта - FT232RL. Это гораздо удобнее, чем COM-порт, по многим причинам. Но в макетку SSOP не воткнешь, поэтому я использую самостоятельно изготовленный переходник USB-TTL:



В классическом варианте линий JTAG чуть больше, чем на схеме:



Обязательные сигналы - TCK, TDO, TDI и TMS (тактовая, выход данных, вход данных и управление режимом теста).

NSRST и NTRST - это управление сбросом на шине JTAG. В нашем случае не обязательны, поскольку сброс МК можно инициировать командной последовательностью на линиях обязательных сигналов.

Теперь разберемся с питанием. Желательно, чтобы внутрисхемный программатор питался от программируемой схемы. Этим сразу решается проблема стыковки уровней программируемой схемы и программатора. С другой стороны, если в программаторе есть конвертер уровней сигналов, различие VCC программатора и target уже не является проблемой (не считая усложнение схемы программатора).

С обязательной линии VTref должно подаваться напряжение питания устройства. По идее, он нужен вышеуказанному чипу конвертера уровней, внутри программатора. Но если JTAG ICE планирует питаться от target-а, то используется линия Vsupply. Для простоты, их можно объединить, но это не обязательно.

В зависимости от положения джампера SV2 на схеме ATmega16 будет питаться либо от USB, либо от target-а. Я на макетку ставить переключающий джампер поленился, ибо предполагалось питание только от target. Зато перед включением три раза проверил, что питание с USB не подается. Для надежности, на плате USB-TTL разомкнул джампер подачи питания. Далее контакт M8RX соединяется с ножкой МК RX, M8TX - с TX.

Подключаемся к программатору через AVR Studio, и если все правильно соединено, то можно будет прочитать сигнатуру и прошивку.



(устройство справа я обязательно рассмотрю позже, пока что могу только повторить, что внутри у него ATmega128)

Единственный минус клона AVR JTAG ICE - сравнительно небольшой список поддерживаемых МК:

  • ATmega128
  • ATmega128A
  • ATmega16
  • ATmega162
  • ATmega165
  • ATmega169
  • ATmega16A
  • ATmega32
  • ATmega323
  • ATmega32A
  • ATmega64
  • ATmega64A
Еще, говорят, поддерживается AT90CAN128, но проверить это нет возможности :(

13.12.2009

Программирование SO-корпусов

Недавно мне подкинули вопрос: нужно запрограммировать ATtiny2313-20SU до пайки, как это сделать? 

Действительно, в отличие от корпуса DIP, предназначенный для поверхностного (SMD) монтажа SO-20 вызывает ряд вопросов, среди которых главный - где брать панельку?!



Переходники на DIP существуют, но стоят около 1000 рублей. И тут я вспомнил про замечательное видео на easyelectronics.ru, где демонстрировали, как пользоваться Розе на примере платы подобного переходника. Недолго думая, я взял Eagle и соорудил простую печатную плату:



Чтобы сделать ее более универсальной, я разместил на ней кварц 4.0 МГц (общеизвестно, что внутрисхемное программирование не запустится без питания и тактовых импульсов) и снабдил разъемом BH-10R, чтобы можно было подключать к любому программатору, а не только к USBasp.

Сначала надо аккуратно установить программируемую "тиньку" на контактные площадки, соблюдая положение первого контакта:



Затем воспользоваться самым обычным канцелярским биндером (зажимом для бумаг), на фото экземпляр 15 мм шириной и с 9 мм "глубиной" захвата:





Конечно, биндер надо разжать, завести в над платой с установленным микроконтроллером и опустить плавно и аккуратно - чтобы чип не сдвинулся с контактных площадок. Немного потренировавшись, с третьего раза я это проделывал уже безошибочно ;) Далее, подключаем при помощи 10-контактного кабеля к программатору:



Резюме: в случае промышленного применения для массового программирования, стоит обратить внимание на время установки микросхемы в подобную панельку. Я не знаю, сколько занимает это в "дорогой" панельке-переходнике, но зато переходник, полученный в домашних условиях выглядит значительно дешевле. Ну и всё это актуально только для случая, когда в схеме не предполагается ICSP-разъема.



Как всегда, публикую файлы для Eagle и экспортированное в eps тонер-трансфер изображение для изготовления по технологии ЛУТ. Лицензия - сс sa ;)

13.10.2009

ATmega1284P

ATMEL сообщило о готовящемся к выходу в IV квартале 2009 г. чипе ATmega1284P.

В нем 128К flash - сколько же, сколько и в ATmega1280 (используется в Arduino Mega и Seeeduino Mega), но при этом есть несколько серьезных плюсов:

  • объем оперативной памяти (RAM) возрос до 16 К
  • будет релиз в корпусе PDIP
  • предполагается совместимость по ногам с ATmega164PA, ATmega324PA и ATmega644PA, а значит им можно будет заапгрейдить Sanguino ;)

Кроме шуток, 16К памяти в умелых руках - более чем. По крайней мере, вероятность необходимости применения внешней памяти заметно падает. Мало того, в голову приходят разные безумные идеи по повторению ретрокомпьютеров типа РК-86 или Микро-80 на одном кристалле ;)

Докуметация на ATmega1284 - естественно, пока только драфт.

11.09.2009

ATmega644PA

Фирма-изготовитель процессоров для Arduino ;) заявила, что она "надругалась" над МК ATmega644P аналогичным способом, как и над другими МК семейства mega в этом году (индексы 64, 164P, 8, 128, 168P).

В названии добавилась буква A. За этой скромной буквой скрывается полная переразводка топологии кристалла с целью снижения энергопотребления.  Например, для питания 3В в Idle-моде им удалось понизить до 200 мкА или на 60%.

Приятно, что вместо прекращения выпуска и взвинчивания цен на модели чипов, которым исполнилось полтора года (как это делает, например, Infineon), ATMEL совершенствует старые.

23.08.2009

Новый V-USB

Вчера вышла новая сборка V-USB - программной реализации USB 1.1 для микроконтроллеров ATmega (именно на ней основаны AVR910 by prottoss и мой SMPReaderUSB). ChangeLog гласит:
  • исправлена бага определения End Of Packet в режиме 16.8 МГц;
  • исправлена бага с битстаффингом и рассинхронизацией в режиме 16.0 МГц;
  • дескриптор конфигурации чуть подкорректирован для USB 1.1, чтобы был установлен старший бит в bmAttributes (там, где флажок SELF_POWERED);
  • процедура подсчета CRC заменена на более быструю - но по-прежнему, необходим кварц 18.0 МГц.
Буду иметь ввиду на будущее, хотя, на первый взгляд, изменения по отношению к апрельскому релизу - минимальные. Реализация для частоты 12 МГц пока что находится вне конкруенции ;)

23.06.2009

Измеряем температуру ATmega328P

Изучая последнюю версию документации на ATmega328 - даташит №8161 для предыдущей статьи, наткнулся на интересное упоминание о встроенном температурном датчике:

21.8 Temperature Measurement

The temperature measurement is based on an on-chip temperature sensor that is coupled to a single ended ADC8 channel. (...) The internal 1.1V voltage reference must also be selected for the ADC voltage reference source in the temperature sensor measurement.

When the temperature sensor is enabled, the ADC converter can be used in single conversion mode to measure the voltage over the temperature sensor. The measured voltage has a linear relationship to the temperature (...) is approximately 1 mV/°C and the accuracy of the temperature measurement is +/- 10°C.


То есть, получается, что в ATmega328P/168P есть некий восьмой канал ADC, на котором висит температурный сенсор. Правда, крайне неточный: плюс-минус целых 10°C.

Градуировка:
  • 242 mv = -45°C
  • 314 mV = +25°C
  • 380 mV = +85°C

Ради интереса набросал скетч:

uint16_t temperature = 0;

void setup(){
Serial.begin(57600);
analogReference(INTERNAL);
temperature = analogRead(8);
}

void loop(){
temperature = analogRead(8);
Serial.print(temperature);
Serial.println(" temp");
delay(1000);
}



(нам понадобятся модификации wiring_analog.c из предыдущей статьи, чтобы читать ADC8).

Опытным путем выяснил, что если заливать его в старые ATmega без температурного сенсора, на выходе будем практически стабильно получать константу. Однако, мое удивление удвоилось, когда в ATmega328P-PU он показал... 360. При величине опорного напряжения в 1.1 В разрядность будет равна 1,07 мВ (1.1/1024), следовательно получается 385,2 мВ: чуть больше максимума по документации.

Еще раз перепроверив документацию, скетч и даже ядро Arduino, я пошел за феном и погрел работающий МК: действительно, реакция на изменение температуры наблюдалась весьма однозначная. Действительно, температурный сенсор, блин.

Даже с поправкой на погрешность, имеем довольно солидное смещение. Правда, в том же даташите прямо говорят о разбросе показаний в зависимости от экземпляра МК и необходимости калибровки с записью вычисленного смещения в EEPROM. Ради интереса вставил другой ATmega328P - увидел значение 350.

В результате экспериментов выяснилось, что процессоры ATmega168-20PU/MU такого сенсора не имеют (из ADC8 читается 1023), равно как и ATmega168V (читается 217). К сожалению, ATmega168P под рукой не оказалось.

Можно ли использовать температурный датчик ATmega328P? Мне кажется, ценность такого "термометра" крайне низкая - разве что фиксировать относительное повышение температуры кристалла - например, чтобы избегать перегрузок. Даже самый простой аналоговый датчик мне кажется предпочтительнее, постараюсь рассказать про это подробнее в следующих статьях.

01.06.2009

Калькулятор fuse-битов

Случайно наткнулся на прикольный калькулятор fuse-битов, позволяет наглядно выбрать fuse-биты для устройств AVR - по смыслу. В какой-то степени даже может заменить datasheet.

Хотя, в datasheet все-таки тоже смотреть надо, мало ли что ;)