Несколько слов об особенностях внутрисхемного программирования микроконтроллеров AVR ATtiny13, ATmega8 и подобных. Неоднократно наступая на грабли решил кратко обрисовать важные моменты.
Для того, что бы внутрисхемное (In-System Programming) программирование было возможным его нужно предусмотреть на этапе разработки схемы проекта — нужно добавить в схему разъем для программатора и учитывать обвязку портов микроконтроллера. Т.е., еще на начальном этапе разработки проекта нужно иметь в виду, что использование цепей (линий) программирования одновременно для других целей, может в последствии «сыграть злую шутку».
Так сложилось, что наиболее распространены два вида разъемов для ISP — 6- и 10-контактный. Причем 6-контактный используется чаще потому, что в нем есть необходимое количество контактов и он занимает меньше места на плате. На рисунке ниже изображены штыревые контакты разъемов впаянные в плату — вид на плату со стороны деталей (сверху).
Теперь по порядку о подключении выводов:
VDD и GND — при подключении программатора можно не обесточивать схему в которую он впаян при условии, что уровень питающего напряжения и напряжение программатора одинаковые. Т.е. для 5-вольтовой схемы используем 5-вольтовый программатор, а для 3.3-вольтовой схемы 5-вольтовый программатор использовать нельзя. Программируемый МК может питаться и даже запуститься от программатора, поэтому питание на схему можно не подавать.
RESET — для того, что бы внутрисхемное программирование работало нельзя в МК использовать его как порт входа/выхода. Как правило этот вывод «подтянут» к плюсу питания МК внешним или внутренним резистором. При использовании внешнего резистора не стоит выбирать его меньше 10кОм — это увеличит ток потребляемый схемой. Это правило касается всех подтягивающих резисторов и на других выводах.
SCK — главное, что бы на нем не «висел» конденсатор. Иначе МК будет определяться через раз или вообще «залочится». Тоже условие применимо и к выводам MISO/MOSI.
MISO, MOSI — можно использовать как и все порты входа/выхода, главное сильно не «прижимать» к земле или питанию. Нельзя подключать программатор к этим выводам через диоды и резисторы — возможен конфликт уровней.
RXD и TXD — можно напрямую соединять с линиями приема/передачи, но рекомендуется не оставлять висящим в воздухе RXD, дабы микроконтроллер не наловил помех. Дело в том, что в некоторых приемо-передатчиках RS-232 во время приема данных на вход RXD выход TXD переходит в неопределенное состояние (ни «0», ни «1»). Таким образом прерывание по UART в микроконтроллере может начать принимать данные по линии RXD во время передачи и заполнять буфер UART данными вперемешку в передаваемыми. Т.е. в итоге, на выходе получится каша. Поэтому, рекомендуется на оставлять без присмотра вывод RXD микроконтроллера и подтягивать его к лог. «1»:
По поводу подключения UART в микроконтроллерах ATMega есть еще одна любопытная особенность — микроконтроллер или подключенное к нему устройство по линии RXD-TXD может получать питание от входа RXD и начинать кое как работать. Честное слово, сам не верил пока не попался ибо звучит бредово. Но факт есть — подал питание на МК, а на другую половину схемы забыл. МК запустился и… начал общаться с соседней микросхемой по UART. Получается соседняя микросхема тоже включилась, хотя питание на нее не приходило 100%. Из-за такой особенности я убил пару дней, пытаясь наладить качественный прием-передачу данных микроконтроллера с «обесточенной» микросхемой.
Вот такой получился краткий «курс молодого яйца» и помните: люди, которые все знают, тоже наступают на грабли потому, что забывают их куда положили. Дополнения и пожелания как всегда приветствуются.
Здравствуйте.
Прошил МК 328Р с минимальной обвязкой, выставил фюзы на внешний кварц. МК заработал. Подключил графический дисплей, прошил еще раз и фсе. На дисплее светится только верхних две полоски и МК не прошивается и не читается. SCK, MISO, MOSI при прошивке были подключены к шине данных экрана S12232ZA. Может быть что из-за этого МК заблокировался?
А внешний квар поставили?
Еще, линии программирования с дисплеем не совпадают?
Кварц стоит. Про «линии программирования с дисплеем не совпадают?» не понял. У меня MOSI, MISO, SCK используются как порты вывода PB3, PB4, PB5 (шина данных экрана S12232ZA). Вот схема https://drive.google.com/open?id=1TwOYq5i90sqEb6k1Mrq5uRIICyIneNlg
Привет. Нужно разделить линии, идущие к дисплею и к программатору. Попробуй отсоединить дисплей и считать прошивку. И, что-бы, ни линиях программатора НИЧЕГО не «висело», даже флюс.
Есть еще один нюанс — если пытался прошить МК с «нагруженной» линией — он запросто может «впасть в кому» из-за ошибок в «контрольных суммах». Совет — перед прошивкой МК всегда сделай сначала «чтение».
Только появилось время. Дисплей снял, МК не читается. Пока запаял запасной МК и не знаю как его программировать или как ардуину (записал бут ардуины) или пробовать как тут (http://www.proavr.narod.ru/07.htm) пишут что можно прошивать впаяв в разрез резисторы по 4,7К. Так можно? Коматозного МК буду пробовать собирать Atmega fusebit doctor и реанимировать.
П.С. Перед программированием с дисплеем пробовал читать, правда только фъюзы и читались.
Вообщем рискнул, поставил резисторы на 4,7К и прошил. Все работает. Теперь код пишу в ардуино, по usbasp через progisp загружаю и питаю. Можете добавить в статью, что можно внутрисхемно прошивать и использовать порты MISO, MOSI, SCK как порты вывода одновременно.
Может.
А проверка прошла?
А если отключить дисплей и пробовать считать МК без него?
Совет: перед тем как стартануть прошивку МК, сначала выполнить чтение. Если считалось без ошибок, тогда прошивайте.
Тот МК который заглючил не читается и не пишется никак, даже с внешним генератором на кварц. Другой МК сейчас пишется (пока пишу/отлаживаю код прошиваю каждые 5 мин) и читается в схеме с резисторами без проблем. .
Может схему кинете: domen82@bk.ru (в любом формате)?
Укажите как соединен МК с дисплеем, как подключены линии программирования, наименования и номиналы компонентов.