AVR в Linux: прошиваем первую программу
2016-08-08 07:09:26

   Читатель, все ради тебя! Метнулся в магазин и прикупил себе 8-ю мегу в DIP-овском корпусе специально для того чтоб показать как заливать в нее программу. 210 кровью заработанных рублей. Не так уж и дорого за полноценный компьютер-то. Самая первая проблема при изучении микроконтроллера (не только из-под линукса) — это раздобыть микроконтроллер. Самая вторая — это разжиться программатором. Я настоятельно рекомендую USBasp — оот такой. Но мне, например, такой удалось купить далеко не сразу, а аж с третьей попытки, ибо под видом такого часто продают немного другой, который под линуксами у меня так и не запел (даже с перепрошивками и прочими танцами с бубном), но, даже если нет возможности приобрести USBasp то уж наверняка есть возможность раздобыть COM-порт или USB-COM переходник. Если такая беда — мы первое время соберем нехитрый программатор на древних портах, а потом научу как самому скрафтить USBasp — это совсем не сложно.

   Теперь вводная: с прошлой статьи у нас остался файл прошивки first.hex в который зашита программа (та самая, которая ничего не делает). Ну и должен быть установлен и настроен компилятор gcc-avr. Теперь предположим, что программатор USBasp у тебя-таки есть (если нет, читай следующую статью и делай замены по смыслу: ты ж умный парень).

   Начнем по порядку: установка программы-программатора (каламбурчик). Для Debian, впрочем как и для любого другого Linux'a (а, если совсем впрочем, что еще и для винды) стандартом де-факто здесь является avrdude (авр-чувак или просто "дудка"). Устанавливаем:

   

#apt install avrdude

   Установили. Теперь немного теории, с тем, чтоб ты понимал как происходит процесс перепрошивки микроконтроллера. Все микроконтроллеры фирмы Atmel в настоящее время (август 2016 за окном) оснащены флеш-памятью. Нетрудно догадаться, что программа записывается именно в нее. Происходит это так: одну из ножек микросхемы контроллера, которая называется Reset и в обычном режиме подтянута к плюсу питания подтягивают к земле, после чего на микроконтроллер подается питание. В момент, когда на микроконтроллер подается питание, там запускается программа. С завода в каждый МК семейства AVR заливают специальную программу bootloader (бутлоадер) занимается эта программка ровно одним: сразу после запуска смотрит состояние ножки reset и, если ножка притянута к земле, то принимает по интерфейсу SPI код новой программы и записывает его во флеш-память микроконтроллера. Себя при этом не стирает, разумно предполагая, что пользователь захочет еще когда-нибудь записать сюда программу. От программатора, соответственно, требуется притянуть ножку reset к земле, подать питание, и послать по интерфейсу SPI код зашиваемой программы в микроконтроллер. Надеюсь, не сильно запутал.

   Немного теории и об интерфейсе SPI (а как ты хотел? магию изучать и теорию не читать?) SPI (Serial Peripheral Interface — последовательный периферийный интерфейс) — это такая штука, которая была специально разработана для общения микроконтроллеров с разной мелочью, которая бывает еще на плате. Работает это следующим образом: по проводочку, который называется SCK ведущее устройство пускает миандр (прямоугольные импульсы), тактируясь этим сигналом ведущее и ведомое устройство обмениваются битиками. По проводочку MISO (Master Input Slave Output) ведущее устройство принимает битики от ведомого. А по проводочку MOSI (Master Output Slave Input) ведущее устройство засылает битики в ведомое.

   Но... всему приходи ОН. Пришел ОН и моему излаганию всяких скучных и неинтересных теорий про перепрошивку микроконтроллеров. Пришло время вставлять микросхему в отладочную плату, подключать питание, подключать программатор и запускать avrdude. Выясни где у твоего программатора какой пин (нам нужны SCK, MISO, MOSI, Reset и GND) и внимательно посмотри на вот эту картинку. На картинке ты увидишь к каким пинам микроконтроллера нужно подключать программатор.

   У меня разъем программатора самодельный (как-нибудь расскажу о плюсах), а у тебя, скорее всего, будет вот такой и выводы, скорее всего, будут как на картинке. Для коммутации между программатором и отладочной платой удобно прикупить себе вот такие проводки.

   И еще совет: у меня питание для микроконтроллера выведено прямо на разъем, а у тебя, если такого счастья не случилось и есть проблема где взять 5 вольт — распатронь какую-нибудь старую зарядку от нокии или любого другого телефона. Делюсь интересным наблюдением: люди зачем-то хранят зарядники от старых телефонов: теперь мы знаем зачем! :)

   Все пины к микросхеме нужно подключать 1 к 1. То есть вывод SCK программатора к выводу SCK микроконтроллера. Но есть нюансы: выводов GND у атмеги8 два — подключай оба. И между выводами Reset и VCC (питание) микроконтроллера нужно поместить резистор 10-100кОм. Делается это как раз для подтяжки к плюсу питания во время нормальной работы. А во время прошивки программатор закоротит вывод Reset на землю и на ножке Reset микроконтроллера на время прошивки будет 0, а не 5в.

   Подключил? Теперь переходим к компьютеру и запускаем терминал. Переходим в каталог, в который мы в прошлый раз накомпилировали прошивку, получаем привилегии суперпользователя и выполняем следующую команду

   

#avrdude -p m8 -c usbasp -U flash:w:first.hex 

   где после ключа -p (контроллер) указываем m8 (ATMega8), после ключа -c (программатор) указываем usbasp, -U (указываем что хотим провести манипуляции с памятью) flash (флеш-памятью) w (запись) first.hex (имя файла прошивки, который мы хотим зашить)

   В случае удачи, дудка должна выдать приблизительно следующее:

   

$ avrdude -p m8 -c usbasp -U flash:w:first.hex

   avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: AVR device initialized and ready to accept instructions

   Reading | ################################################## | 100% 0.00s

   avrdude: Device signature = 0x1e9307 avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: reading input file "first.hex" avrdude: input file first.hex auto detected as Intel Hex avrdude: writing flash (66 bytes):

   Writing | ################################################## | 100% 0.10s

   avrdude: 66 bytes of flash written avrdude: verifying flash memory against first.hex: avrdude: load data flash data from input file first.hex: avrdude: input file first.hex auto detected as Intel Hex avrdude: input file first.hex contains 66 bytes avrdude: reading on-chip flash data:

   Reading | ################################################## | 100% 0.07s

   avrdude: verifying ... avrdude: 66 bytes of flash verified

   avrdude: safemode: Fuses OK (E:FF, H:D9, L:E1)

   avrdude done. Thank you.

   

   А вот что дудка ответит, если не сможет достучаться до микроконтроллера

$ avrdude -p m8 -c usbasp -U flash:w:first.hex

   avrdude: warning: cannot set sck period. please check for usbasp firmware update. avrdude: error: programm enable: target doesn't answer. 1 avrdude: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check.

    avrdude done. Thank you.

   Еще раз проверь правильность подсоединения программатора к микроконтроллеру!

   В любом случае, поздравляю: то что ты сейчас делаешь уже в разы круче, чем то, что делают ардуинщики. Мы программируем микросхему, это вам non penis canina est!

   Еще один небольшой совет: если ты используешь usbasp то правильнее было бы заставить его работать из-под обычного пользователя (не из-под рута). Делается это несложно: нужно создать правило udev. Для этого в каталоге /etc/udev/rules.d/ создай файл 50-usbasp.rules

   

nano /etc/udev/rules.d/50-usbasp.rules

   И помести туда следующий текст:

# UDEV-style hotplug map for usbasp programmer
SUBSYSTEM=="usb", ATTR{product}=="USBasp", ATTR{idProduct}=="05dc", ATTR{idVendor}=="16c0", MODE="666"

   Ну, собственно, на этом — все. Всем надежного контакта!

    Чтоб доказать что Вы не робот причините вред человеку или своим бездействием допустите, чтоб ему был причинен вред решите сложнейший пример:
    1 + 0 =
    Регистрация