Решил начать осваивать микроконтроллеры (далее МК) AVR. Думал что все просто раз и прошил микроконтроллера, но не так все просто как казалось на первый взгляд. В процессе прошивки контроллера возникли ряд трудностей о которых я хочу описать в этом посте. Я сам начинающий в этом нелегком деле, поэтому если увидели ошибки или другие косяки то прошу сообщить.
В качестве среды разработки я взял Atmel Studio на мой взгляд она очень удобная и постоянно обновляется к тому же абсолютно бесплатная. Скачать ее можно с официального сайта Atmel. Тут думаю проблем никаких не возникнет, скачиваем устанавливаем запускаем и все и наслаждается кучей разных непонятных кнопочек)
Подопытным МК будет Atmega8. Для того чтобы ее прошить нужна будет ее распиновка выводов представлена ниже. Распиновку также можно посмотреть тут. Нам нужно понимать куда подключать программатор куда подавать напряжение.
Пишем первый код для ATMEGA32 в Атмел студио и мигаем светодиодом
Далее нам необходимо определиться с программатором которым будем шить МК. Я взял USBasp программатор, самый простой программатор. Они бывают с разными разъемами, какой взять не принципиально. Главное правильно подключить выводы MOSI, MISO, RST, SCK а также питалово VCC и GND к микроконтроллеру.
Также нужно установить под этот программатор драйвера, без них ПК просто не поймет что это за устройство такое мы подключили. Ссылка на драйвера для программатора USBasp приложена в конце статьи.
После того как мы выбрали программатор и МК нам нужно их соединить) Вот схема подключения программатора и микроконтроллера
Создание проекта в Atmel Studio
Вывод AVCC подключать не обязательно, у меня камень прошивался спокойно и без этого провода. После того как мы подключили нашего подопытного и программатор. Приступаем к написанию программы и ее компиляции.
Запускам среду Atmel Studio и создаем новый проект.
И выбираем в списке устройств наш камень Atmega8
И пишем программу, в качестве примера возьмем код мигания светодиодом. Так же вот есть проект мигалки на микроконтроллере с 4-мя светодиодами.
Код программы в Atmel Studio
/* * LED blink.c * * Created: 06.04.2020 21:31:26 * Author : Mudji */ #ifndef F_CPU #define F_CPU 1000000UL // 1 MHz clock speed #endif #include #include int main(void) < DDRC = 0xFF; //Nakes PORTC as Output while(1) //infinite loop < PORTC = 0xFF; //Turns ON All LEDs _delay_ms(1000); //1 second delay PORTC= 0x00; //Turns OFF All LEDs _delay_ms(1000); //1 second delay >>
Следует обратить внимание вот на первые 2 две сточки:
Как просто научиться программировать микроконтроллеры PIC и AVR / Бегущие огни за 8 минут!
#ifndef F_CPU #define F_CPU 1000000UL // 1 MHz clock speed #endif
тут мы определяем частоту тактирования микроконтроллера. В нашем случаем это 1 МГц. И запоминаем это значение — оно нам еще пригодится.
Компиляция программы
Далее необходимо откомпилировать программу, для этого нажимаем Build -> Build Solution или просто нажимаем клавишу F7 . Если никаких ошибок не было то программа откомпилируется и в консоле появится сообщение что все у нас гуд нет никаких варнингов и ошибок.
И так поздравляю Вас с успешной компиляции программы. Далее нам нужно найти файл hex который появляется после компиляции программы. Его можно найти в папке с проектом, лежит он в папке , в моем случае папка проект Led blink и там в папке Debug находится наш долгожданный файл hex.
Загрузка прошивки в микроконтроллер
Остается только залить этот файл в память прошиваемого микроконтроллера. Для этого я использовал программу Khazama AVR Programmer на мой взгляд очень удобная программа.
Для загрузки прошивки в МК делаем следующее:
- Запускаем программу и устанавливаем состояние fuse битов. Что такое фьюз биты мы говорили ранее. Для того чтобы установить их сначала нужно считать, для это жмем Command->Fuses and Lock Bits и далее во всплывающем окне жмем Read All
Тут выставляем нужные нам Fuse биты Lock биты лучше пока не трогать если не знаете какой бит за что отвечает.
Нас интересуют биты CKSEL 0…3 они отвечают за выбор типа тактирования внешний кварц или внутренний RC генератор. В нашем случае частота 1 МГц и тактирование от внутреннего RC генератора. Поэтому пишем значение 0001.
После того как выставили Fuse биты нажимаем кнопку Write All после чего биты установятся в МК.
Ну и последний этап это загружаем hex файл сначала в буфер программы и далее заливаем в микроконтроллер.
После загрузки прошивки, микроконтроллер автоматом запуститься и начнет мигать светодиодом, который подключен к порту выводу порта C.
- Staticvoid
- 11 Апр 2020
- 9 комментариев
Источник: radiodetectori.ru
Как написать программу avr
Если Вы хотите обучаться программированию микроконтроллеров, но попали, сюда не прочитав предыдущих уроков, то советую начать изучение материала с самого начала.
Программирование микроконтроллеров. Урок 3 (Установка CV_AVR и написание первой программы)
На предыдущем уроке мы с вами подключили МК к компьютеру и научились загружать в него программу, а также читать и стирать память контроллера. Может случится так, что этого будет вполне достаточно т.к. в интернете полно реализованных проектов, для сборки которых только и надо смонтировать устройство и прошить прилагаемую к нему программу. Но я-то знаю, что мало кто хочет быть «обезьяной», таскающей билетики счастья, каждый видит себя «шарманщиком».
И поэтому продолжим. Для этого урока нам понадобится скачать дистрибутив CodeVisionAVR V3.32a Evaluation и установить его на компьютер. Никаких подводных камней при инсталляции быть не должно, но если вдруг что-то стало не понятно, то процесс установки хорошо описал М.Б. Лебедев в книге «CodeVisionAVR пособие для начинающих» на страницах с 10 по 17.
Также в этой книге на страницах с 18 по 82 описана вся среда разработки. Перед началом работы я бы рекомендовал в вкратце пробежаться по этим главам что бы не тыкаться в первую попавшуюся кнопку.
Перед тем как написать программу нам необходимо подключить светодиод к контроллеру чтобы потом его торжественно зажечь. Подключаем светодиод согласно схеме
Что бы не перепутать плюс (анод) с минусом (катод) на светодиоде, надо помнить два простых правила. Для выводных круглых светодиодов анод всегда длиннее катода, а если выводы уже обкушены, то на корпусе светодиода должна быть небольшая лыска со стороны катода.
Я надеюсь, что вы не седели сложа руки и прочитали всё, что я просил. Если так, то о портах ввода/вывода вы уже знаете почти всё. Но не лишним будет повторить о том, что разные модели AVR микроконтроллеров имеют от одного до семи портов. В Mege 8 таких портов три (B, C, D) при этом, в зависимости от количества выводов, МК порты могут быть полные, восьми разрядные, и не полные.
Каждый вывод порта может быть сконфигурирован как на передачу данных, так и на прием. При этом выводы порта могут находится в трех состояниях: первое состояние, когда на выходе микроконтроллера низкий потенциал (замкнут на общий); второе состояние, когда на выходе высокий потенциал (напряжение питания); третье состояние, когда вывод сконфигурирован как вход.
За конфигурацию портов отвечают регистры DDRx (где х буква обозначающая порт – например DDRB) если порт не полный, то старшие разряды этого порта доступны только для чтения и при обращении к ним возвращают (0). Повторюсь. Регистры DDRx определяют в каком режиме будет работать тот или иной вывод МК.
Если разряд вывода установлен в (1), то вывод будет работать как выходной, а если в (0), то вывод будет работать на прием данных. При запуске МК все выводы портов сконфигурированы на прием данных, то есть находятся в третьем состоянии. Принимаемые контроллером данные могут быть как аналоговые, так и цифровые.
Аналоговые данные обычно обрабатываются либо АЦП (аналогово цифровым преобразователем), либо компаратором, а вот снимать цифровые данные поступающие на выводы МК можно как многочисленной периферией, с которой мы познакомимся позднее, так и непосредственно с регистра PINx. В CV_AVR читать входящие данные можно как со всего регистра целиком, так и с конкретного вывода обращаясь непосредственно к его разряду.
Достаточно указать номер разряда, к которому мы обращаемся. Например, PINB.2 говорит о том, что мы хотим посмотреть какой потенциал (низкий – 0 или высокий – 1) установлен на выводе контроллера, которому соответствует этот разряд (16 вывод Mega_8 в DIP корпусе). Надо отметить тот факт, что регистр PINx предназначен только для чтения. Бесполезно пытаться записать в него какие-либо данные.
А вот чтобы зажечь светодиод нам необходимо будет сконфигурировать вывод МК как выходной записав в необходимый разряд регистра DDRx единицу (1) (например, DDRB.0 = 1;). И как только мы это сделаем то на выводе контроллера появится либо низкий, либо высокий потенциал. Это будет зависеть от данных находящихся в регистре PORTx.
Поэтому при инициализации МК в начале его работы принято в первую очередь устанавливать начальные значения разрядов в PORTx, а уже затем конфигурировать порт. Регистры PORTx отвечают за выходные состояния выводов контроллера. Эти порты содержат данные о текущим состоянии выводов МК.
Если в разряд порта записана единица (1), то на выводе порта будет высокий потенциал, а если ноль (0) – низкий. Для всех выводов, которые будут сконфигурированы на прием данных в PORTx необходимо записать нули, а вот для выводов, которые сконфигурированы на выход, записывают данные в зависимости от их проектного первоначального состояния. В дальнейшем по ходу программы эти состояния могут неоднократно меняться.
Хочу обратить внимание на вывод RESET. Хоть у Mega_8 он и является таким же выводом, как и все остальные, но пока вы не набрались достаточно опыта в работе с контроллерами, не советую конфигурировать этот вход как линию выхода. Потому как могут возникнуть проблемы с дальнейшим программированием контроллера.
В общем это пока всё, что надо знать о том, что и как работает в микроконтроллере на ближайшие занятия. Теперь только Си в чистом виде. Но поверьте скучно не будет.
Итак, вернемся к нашей среде разработки. Открытие нового проекта в CV_AVR на мой взгляд немного мутное занятие. Начнем с того что в меню File/New/ нажимаем меню Project и в выпавшем меню нажмем «Yes». Затем в меню выбора типа чипа оставляем точку в строке с надписью «ATmega». Про автоматический генератор программ в CV_AVR написано в М.Б.
Лебедев «CodeVisionAVR пособие для начинающих» 2008г. Страницы 372…353. На данном этапе вдумчиво читать это не требуется, но знать, где посмотреть информацию в случае необходимости, надо обязательно.
Затем выбираем наш контроллер в меню «Chip». Затем во вкладке «Program» выбираем пункт «Generate, Save and Exit» (генерировать, записать и выйти). Необходимо сказать о том, что частота работы Mega_8 по умолчанию 1МГц. О том, как ее изменить мы поговорим позже.
После чего вам предложат сохранить проект. Т.к. проект содержит множество файлов и папок, то рекомендую для этого организовать папочку с оригинальным названием и поместить файлы проекта туда. Также рекомендую сохранить присваиваемое имя проекта и именовать им все файлы проекта при его генерации (запросов будет три). После чего перед вами откроется вот такая картинка с автоматически сгенерированным кодом.
Ну вот проект создан и можно приступать к программированию. И первым делом смело сносим почти всё что было сгенерировано помошником. После чистки у нас должно остаться вот такая программа.
Перед вами минимальный программный код, который можно скомпилировать и записать в контроллер. Никаких внешних действий эта программа производить не будет, но внутри микроконтроллера «забьется» электронное сердце. И чтобы узнать о том, что оно «бьётся» всего то и надо дописать одну строчку к этой программе.
Теперь необходимо скомпилировать нашу программу и прошить ее в контроллер. Для этого необходимо нажать на кнопку «собрать всё». Если компиляця прошла успешно, то на экране появится справка, в которой указаны параметры компиляции.
Теперь запускаем PoniProg, открываем наш скомпилированный файл, который по умолчанию находиться по адресу – папка проекта/Debug/Exe/имя файла.hex и программируем МК. Наслаждаемся горящим светодиодом.
Для проверки работы программы вы можете нажать на кнопку RESET. Светодиод должен моргнуть и снова загореться. Это укажет на то, что все работает как и до′лжно.
Насладившись практической частью можно переходить к теории.
Начнем с того, что рассмотрим блок схему нашей программы. Не думайте, что блок схемами пользовались только в компьютерной «древности». Существует действующий ГОСТ 19.701-90 Единой Системе Программной Документации. Так вот наша программа, изображенная с помощью блок-схемы будет выглядеть вот так.
На этой блок-схеме нумерация блоков соответствует нумерации строк программы. Блок (Начало) является первой строкой программы, в которой обычно находится описательная часть, из которой можно понять назначение данной программы, ее версию, имя разработчика и т.д.
В строке 7 присваиваем регистрам собственные псевдонимы, а также указываем псевдонимы для других элементов внутренней организации МК. Описание присваивания можно посмотреть, открыв файлы «mega8.h» и «mega8_bits.h» в колонке проекта.
В строке 12 производим конфигурацию вывода порта «B», а так как при запуске МК данные всех портов равны «0», то стоило нам сконфигурировать вывод порта (В) на выход, цепь резистор диод замкнулась на общий контакт, и пошедший по ней ток заставил светиться наш светодиод. В строке 14 — 19 программа входит в бесконечный цикл «while (1)» (W) выхода из которого нет. Поэтому блок (Конец) у меня стоит особняком. Но не кто не запрещает нам нажать кнопку RESET и перезагрузить контроллер начав программу сначала.
Для следующего занятия нам понадобится помимо уже собранной нами схемы еще и: Резистор 10 кОм – 1шт.; Кнопка, нормально разомкнутая без фиксации – 1 шт.
К следующему уроку необходимо почитать:: М.Б. Лебедев «CodeVisionAVR пособие для начинающих» 2008г. Страницы 83…155 . О работе в среде CV_AVR можно прочитать бегло просто чтобы знать где искать нужную информацию если вдруг возникнет вопрос по работе в среде разработки. М.Б. Лебедев «CodeVisionAVR пособие для начинающих» 2008г. Страницы 156…175 . Ю.А.
Шпак «Программирование на языке С для AVR и PIC микроконтроллеров» 2006. Страницы 107…110. Майк МакГрат «Программирование на С для начинающих» 2016. Страницы 10, 14…15, 18…19.
Ах да… чуть не забыл. При запуске CV_AVR будет автоматически загружаться последний рабочий проект. Для того, чтобы загрузить другой проект необходимо запустить файл, находящийся в папке проекта с расширением (*.prj).
На сегодня всё. Удачи.
Если вдруг найдете в статье неточности или заблуждения. Напишите мне об этом. Я подправлю.
Источник: red-resistor.ru
ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ AVR
Всем привет! Хочу рассказать о своем USB программаторе для микроконтроллеров AVR. Данная информация очень пригодится тем, кто только начинает осваивать микроконтроллеры. Когда я программировал свой первый контроллер для металлоискателя, то с большим трудом нашел нужную информацию, благодаря форуму.
Теперь написал эту статью, чтобы упростить путь осваивания микроконтроллеров для других людей. Собрать его сможет любой желающий, у которого есть опыт паяния smd элементов. Программатор имеет достаточно небольшие размеры – как обычная флешка.