Внутрисхемное программирование AVR

Несколько слов об особенностях внутрисхемного программирования микроконтроллеров AVR ATtiny13, ATmega8 и подобных. Неоднократно наступая на грабли решил кратко обрисовать важные моменты.

Для того, что бы внутрисхемное (In-System Programming) программирование было возможным его нужно предусмотреть на этапе разработки схемы проекта — нужно добавить в схему разъем для программатора и учитывать обвязку портов микроконтроллера. Т.е., еще на начальном этапе разработки проекта нужно иметь в виду, что использование цепей (линий) программирования одновременно для других целей, может в последствии «сыграть злую шутку».

Так сложилось, что наиболее распространены два вида разъемов для ISP — 6- и 10-контактный. Причем 6-контактный используется чаще потому, что в нем есть необходимое количество контактов и он занимает меньше места на плате. На рисунке ниже изображены штыревые контакты разъемов впаянные в плату — вид на плату со стороны деталей (сверху).

077a76deaceef30450c4232c0eda7162 Теперь по порядку о подключении выводов:

VDD и GND — при подключении программатора можно не обесточивать схему в которую он впаян при условии, что уровень питающего напряжения и напряжение программатора одинаковые. Т.е. для 5-вольтовой схемы используем 5-вольтовый программатор, а для 3.3-вольтовой схемы 5-вольтовый программатор использовать нельзя. Программируемый МК может питаться и даже запуститься от программатора, поэтому питание на схему можно не подавать.

VDD

RESET — для того, что бы внутрисхемное программирование работало нельзя в МК использовать его как порт входа/выхода. Как правило этот вывод «подтянут» к плюсу питания МК внешним или внутренним резистором. При использовании внешнего резистора не стоит выбирать его меньше 10кОм — это увеличит ток потребляемый схемой. Это правило касается всех подтягивающих резисторов и на других выводах.

RESET

SCK — главное, что бы на нем не «висел» конденсатор. Иначе МК будет определяться через раз или вообще «залочится». Тоже условие применимо и к выводам MISO/MOSI.

SCK

MISO, MOSI — можно использовать как и все порты входа/выхода, главное сильно не «прижимать» к земле или питанию. Нельзя подключать программатор к этим выводам через диоды и резисторы — возможен конфликт уровней.

MISO

RXD и TXD — можно напрямую соединять с линиями приема/передачи, но рекомендуется не оставлять висящим в воздухе RXD, дабы микроконтроллер не наловил помех. Дело в том, что в некоторых приемо-передатчиках RS-232 во время приема данных на вход RXD выход TXD переходит в неопределенное состояние (ни «0», ни «1»). Таким образом прерывание по UART в микроконтроллере может начать принимать данные по линии RXD во время передачи и заполнять буфер UART данными вперемешку в передаваемыми. Т.е. в итоге, на выходе получится каша. Поэтому, рекомендуется на оставлять без присмотра вывод RXD микроконтроллера и подтягивать его к лог. «1»:

UART1

По поводу подключения UART в микроконтроллерах ATMega есть еще одна любопытная особенность — микроконтроллер или подключенное к нему устройство по линии RXD-TXD может получать питание от входа RXD и начинать кое как работать. Честное слово, сам не верил пока не попался ибо звучит бредово. Но факт есть — подал питание на МК, а на другую половину схемы забыл. МК запустился и… начал общаться с соседней микросхемой по UART. Получается соседняя микросхема тоже включилась, хотя питание на нее не приходило 100%. Из-за такой особенности я убил пару дней, пытаясь наладить качественный прием-передачу данных микроконтроллера с «обесточенной» микросхемой.

UART2

Вот такой получился краткий «курс молодого яйца» и помните: люди, которые все знают, тоже наступают на грабли потому, что забывают их куда положили. Дополнения и пожелания как всегда приветствуются.

Скачать материалы статьи одним архивом