Программы для микроконтроллеров

AVR. Учебный курс. Простейшая программа

Итак, прежде чем что то делать надо понять как вообще выполняется программа в контроллере, как работает ядро процессора. Для этого нам хватит AVR Studio и его эмулятора. Не очень интересно, может даже занудно, но если этот шаг пропустить, то дальнейшие действия будут как бег в темноте.

Поскольку в демоплате Pinboard используется процессор ATmega16, то рассматривать мы будем именно его. Впрочем, как я уже говорил, для других контроллеров AVR это также будет справедливо. Отличия, конечно, есть, но они не существенные.

Запускаем AVR Studio (далее просто студия) и в выскочившем мастере сразу же создаем проект:

Откроется окно:

Увеличить

Оно может выглядеть чуток не так. Дело в том, что интерфейс студии очень легко конфигурируется и перекраивается под себя. Так что можно перетащить панели как нам удобно. Что я и сделал.

Систему команд хорошо бы распечатать себе на листочке. Их там всего около 130, кратким списком (тип команды, что делает и какие операнды) занимает пару листов формата А4.

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

Я же команды которые буду использовать буду описывать по мере появления.

В центральном окне пишем код:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
.include “m16def.inc” ; Используем ATMega16 ;= Start macro.inc ========================================  
; Тут будут наши макросы, потом.  
;= End macro.inc ========================================  
 
; RAM ===================================================== .DSEG ; Сегмент ОЗУ  
 
; FLASH =================================================== .CSEG ; Кодовый сегмент  
 
; EEPROM ================================================== .ESEG ; Сегмент EEPROM

.include “m16def.inc” ; Используем ATMega16 ;= Start macro.inc ======================================== ; Тут будут наши макросы, потом. ;= End macro.

inc ======================================== ; RAM ===================================================== .DSEG ; Сегмент ОЗУ ; FLASH =================================================== .

CSEG ; Кодовый сегмент ; EEPROM ================================================== .ESEG ; Сегмент EEPROM

Это вроде шаблона для начала любого проекта. Правда кода тут 0 байт 🙂 Только директивы. Обрати также внимание на оформление кода. Дело в том, что в ассемблере нет никаких структурных

элементов — весь код плоский, тупо в столбик. Так что поэтому чтобы он был читабелен его надо в обязательно порядке разбивать на блоки, активно пользоваться табуляцией и расставлять комментарии. Иначе уже через пару дней ты не сможешь понять, что вообще написал.

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

Как я уже говорил, в микроконтроллере куча раздельных видов памяти. И тут используется гарвардская архитектура. Т.е. исполняемый код в одном месте, а переменные в другом. Причем это разные адресные пространства. Т.е.

адрес 0000 в сегменте данных это не то же что и адрес 0000 в сегменте кода. Это дает большое преимущество в том, что данные не могут испортить код, но не дает писать полиморфные программы.

Такая архитектура является традиционной для микроконтроллеров.

У обычного PC компа используется другая архитектура — Фон Неймановская. Там данные и код находятся в одном адресном пространстве. Т.е., скажем, с адреса 0000 по 0100 идет код, а с 100 до FFFF данные.

В нашей же программе и код и данные располагаются на одном листе, но чтобы компилятор понял где у нас что они выделяются директивами сегментации. Пока нас интересуют директива .CSEG после нее начинается исполняемый код. Там и будем писать нашу программу.

Возьмем и напишем:

1
2
3
4
5
; FLASH =================================================== .CSEG ; Кодовый сегмент NOP NOP NOP

; FLASH =================================================== .CSEG ; Кодовый сегмент NOP NOP NOP

Что мы сделали? А ничего! Команда NOP это команда затычка. Она не делает ничего, просто занимает 2 байта и 1 такт.

Речь не о команде NOP (там и обсуждать то нечего), а о том как оно все будет выполняться.

Запускай симуляцию (Ctrl+F7) когда пробежит прогресс бар компиляции/симуляции и возле первого NOP возникнет стрелочка нажми ALT+O — выскочит диалог настройки симуляции. Там тебе надо там только выставить частоту 8Мгц. Почему 8Мгц? Просто на Pinboard частота главного проца по дефолту 8Мгц. Если у тебя свои идеи на этот счет — можешь поправить как угодно. На симуляцию это не влияет.

Вернемся к нашей симуляции. Давай посмотрим как выглядит наша программа с точки зрения машинных кодов, как размещается в памяти. Интерес, по большей части, чисто теоретический, редко когда пригождается и по этому во многих учебных курсах по AVR на это даже внимание не заостряют. А зря! Т.к. упускается глубинное ощущение кода. Открой окно просмотра программ. View — Memory или Alt+4.

Там выбери тип памяти Programm. Это и есть наш Flash сегмент. Выставим в списке cols две колонки, чтобы было наглядней.

Это наша память программ. На голубом фоне идут адреса, они, как видишь, в словах. Т.е. двум байтам соответствует один адрес. Но, на самом деле это интерпретация адресации компилятором, микроконтроллер же может оперировать в памяти программ с точностью до байта.

0000 это код команды NOP. У нас три команды, поэтому шесть нулей.

Обрати внимание на то, что команды идут с адреса 0000. Это потому, что мы не указали ничего иного. А кодовый сегмент начинается с адреса 0000.

Теперь смотрим на программный счетчик Programm Counter, он показывает адрес инструкции которая будет выполнена.

Поскольку мы только стартанули, то он равен нулю — нулевая инструкция. Нажми F11, процессор сделает шаг, программный счетчик изменится на 1 и покажет следующую инструкцию.

И так до тех пор, пока не дойдет до третьего NOP, а что у нас после него? А после него у нас FF до конца памяти.

FF это несуществующая инструкция, на ней виртуальный контроллер перезагрузится с ошибкой invalid opcode, а реальный контроллер ее проигнорирует, пробежав по ним, как по NOP, до конца памяти.

Сбрось симуляцию микроконтроллера (Shift+F5) и вручную выстави в Program Counter адрес 0x000002 — проц сам перепрыгнет на последнюю команду NOP. Если менять Program Counter то проц будет выполнять те команды, которые мы ему укажем. Но как это сделать в реальном контроллере? В него то мышкой не залезешь!

Программный счетчик меняется командами переходов. Их много (условные, безусловные, относительные), о них я расскажу подробней чуть позже, пока же приведу один пример.

Добавим в наш код команду JMP и ее аргумент — адрес 0x000001.

1
2
3
4
5
.CSEG ; Кодовый сегмент NOP NOP NOP JMP 0x000001

.CSEG ; Кодовый сегмент NOP NOP NOP JMP 0x000001

Команда JMP, как и все команды перехода, работает просто — записывает в Program Counter свой аргумент. В нашем случае — 0x000001.

Перекомпиль проект и посмотри на то, как меняется Program Counter (далее буду звать его PC) и вообще как теперь идет процесс выполнения программы. Видишь, после JMP в программный счетчик заносится новый адрес и процессор сразу же перепрыгивает в начало кода, но не на первую, а на вторую инструкцию. Программа зациклилась.

Это называется абсолютный переход. Он может сигануть куда угодно, в любую область памяти программ. Но за такую дальнобойность приходится платить. Если заглянешь в память, то увидишь там такую картину:

OC 94 — это код нашей комады, а 01 00 адрес перехода. Длина команды стала четыре байта. Два байта ушло на адрес. Вот, кстати, особенность памяти в том, что там данные записываются зеркально, т.е. младший байт числа по младшему адресу (порядок little-endian).

Но поскольку дальнобойные команды применяются редко, основной командой перехода в AVR является относительный переход RJMP. Основное отличие тут в том, что в PC не записывается не точный адрес куда надо перейти, а просто к PC прибавляется смещение. Вот так:

Читайте также:  Компания toshiba выпустила новую nand flash память по 19 нм технологии
1
2
3
4
5
6
7
8
9
.CSEG ; Кодовый сегмент NOP NOP NOP RJMP PC+2 NOP NOP RJMP PC-6 NOP

.CSEG ; Кодовый сегмент NOP NOP NOP RJMP PC+2 NOP NOP RJMP PC-6 NOP

По идее, должно работать напрямую, т.е. RJMP +2. Но компилятор такую запись не понимает, он оперирует абсолютными адресами, приводя их потом в нужные смещения машинного кода. Поэтому применим макроопределение PC — это текущее значение счетчика в данном месте программы. Т.е.

Наглухо зациклит программу в этой строчке.

Благодаря относительному переходу, смещение можно запихать в те же два байта, что занимает команда. При этом код относительного перехода выглядит так Сх хх, где ххх это смещение от +/-2047 команд. Что обычно хватает с лихвой. В памяти же команда перехода выглядит как хх Сх, то есть байты переставлены.

Таким образом, длина команды у относительного перехода составляет 2 байта, против четырех у абсолютного. Экономия!!! Учитывая что в обычной программе подобные переходы на каждом шагу.

Вот только что же, каждый раз самому вручную высчитывать длину перехода? Ладно тут программка в три команды, а если их сотни? Да если дописал чуток то все переходы заново высчитывать?

Угу. Когда то давно, когда компиляторов еще не было так и делали. Cейчас же все куда проще — компилятор все сделает сам. Ему только надо указать откуда и куда. Делается это с помощью меток.

1
2
3
4
5
6
7
8
9
.CSEG ; Кодовый сегмент M1: NOP NOP NOP RJMP M2 NOP M2: NOP RJMP M1 NOP

.CSEG ; Кодовый сегмент M1: NOP NOP NOP RJMP M2 NOP M2: NOP RJMP M1 NOP

Метки могут быть из букв или цифр, без пробелов и не начинаться с цифр. Заканчиваются двоеточием. По факту, метка означает текущий адрес в словах. Так что ее можно использовать и в операциях. Надо только помнить, что она двубайтная, а наш контроллер однобайтный. Разобрать двубайтное значение по байтам можно с помощью директивы компилятора Low и High

Например,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
.CSEG ; Кодовый сегмент M1: NOP NOP LDI ZL,low(M2) ; Загрузили в индекс LDI ZH,High(M2)   IJMP   NOP NOP NOP M2: NOP RJMP M1 NOP

.CSEG ; Кодовый сегмент M1: NOP NOP LDI ZL,low(M2) ; Загрузили в индекс LDI ZH,High(M2) IJMP NOP NOP NOP M2: NOP RJMP M1 NOP

Команда LDI загружает непосредственное значение в регистр старшей (от R16 до R31) группы. Например, LDI R17,3 и в R17 будет число 3. А тут мы в регистры R30 (ZL) загрузили младший байт адреса на который указывает метка М2, а в R31 (ZH) старший байт адреса.

Если протрассируешь выполнение (F11) этого кода, то увидишь как меняются значения регистров R30 и R31 (впрочем 31 может и не поменяться, т.к. там был ноль, а мы туда ноль и запишем — адрес то мал).

Смену значений регистров можно поглядеть в том же окне где и Program Counter в разделе Registers.

Команда IJMP это косвенный переход. Т.е. он переходит не по адресу который заложен в коде операции или идет после него, а по адресу который лежит в индексной регистровой паре Z. Помните я говорил, что шесть последних регистров старшей регистровой группы образуют три регистровые пары X,Y,Z используются для адресации? Вот это я и имел ввиду.

После IJMP мы переходим на нашу же М2, но хитровывернутым способом. Зачем вообще так? Не проще ли применить RJMP и JMP. В этом случае да, проще.

Но вот благодаря косвенному переходу мы можем программно менять точку перехода. И это просто зверский метод при обработке всяких таблиц и создании switch-case структур или конечных автоматов. Примеры будут позже, пока попробуйте придумать сами.

Давай подвинем нашу кодовую конструкцию в памяти на десяток байт. Добавь в код директиву ORG

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; FLASH =================================================== .CSEG ; Кодовый сегмент NOP   .ORG 0x0010 M1: NOP NOP LDI ZL,low(M2) ; Загрузили в индекс LDI ZH,High(M2)   IJMP   NOP NOP NOP M2: NOP RJMP M1 NOP

; FLASH =================================================== .CSEG ; Кодовый сегмент NOP .ORG 0x0010 M1: NOP NOP LDI ZL,low(M2) ; Загрузили в индекс LDI ZH,High(M2) IJMP NOP NOP NOP M2: NOP RJMP M1 NOP

Скомпиль и запусти. Открой память и увидишь что в точке с адресом 0000 у нас стоит наш NOP (Точка входа должна быть, иначе симулятор скукожит от такого когнитивного диссонанса. А вот дальше сплошные FF FF и лишь начиная с нашего адреса 0x0010 пошли коды остальных команд.

То есть мы разбили код, заставив директивой ORG компилятор перетащить его дальше, начиная с 0x0010 адреса.

Зачем это нам потребовалось? Ну, в первую очередь, это требуется чтобы перешагнуть таблицу векторов прерываний. Она находится в первых адресах.

Во-вторых, такая мера нужна чтобы записать код в конец флеша, при написании бутлоадеров (о них тоже дальше в курсе будет).

А еще таким образом можно прятать в коде данные, перемешивая данные с кодом. Тогда дизассемблирование такой программы превратится в ад =) своего рода, обфускация публичной прошивки, сильно затрудняющая реверс инженеринг.

Да, у кристалла есть биты защиты. Выставил которые и все, программу можно считать только спилив крышку кристалла с помощью электронных микроскопов, что очень и очень недешево. Но иногда надо оставить прошивку на виду, но не дать сорцов. И вот тогда превращение прошивки в кашу очень даже поможет =)

Ну или написать ее на Си ;))))))) (Есть вариант шифровки прошивки и дешифровки ее на лету бутлоадером, но это отдельная тема. О ней может быть расскажу)

Еще, там, в студии, же где и программный счетчик, есть ряд интересных параметров. Во-первых, там отдельно вынесены наши индексные пары X,Y,Z и можно не лазать на дно раздела Registers.

Во-вторых, там есть Cycle counter — он показывает сколько машинных циклов протикал наш контроллер. Один машинный цикл в AVR равен одному такту.

Frequency содержит частоту контроллера в данный момент, но мы задаем ее вручную.

А в-третьих, есть Stop Watch который показывает время выполнения. В микросекундах. Но можно переключить и в миллисекунды (пошарь в контекстном меню).

Если тебе кажется, что все слишком просто и я чрезмерно все разжевываю. Хы, не расслабляйся, у меня сложность растет по экспоненте. Скоро пойдет работа на прерываниях, а потом будем писать свою операционную систему :))))))

Источник: http://easyelectronics.ru/avr-uchebnyj-kurs-prostejshaya-programma.html

Занятие №1. Простейшая программа

Дата публикации: 18 декабря 2010.

Рейтинг:  5 / 5

Угловые скобки указывают компилятору, что подключаемые файлы нужно сначала искать в стандартной папке WinAvr с именем include. Двойные кавычки “ и “ указывают компилятору начинать поиск с директории, в которой хранится проект.

Для каждого типа микроконтроллера есть свой заголовочный файл. Для ATMega8 этот файл называется iom8.h, для ATtiny2313 – iotn2313.h.

В начале каждой программы мы должны подключать заголовочный файл того микроконтроллера, который мы используем. Но есть и общий заголовочный файл io.h.

Препроцессор обрабатывает этот файл и в зависимости от настроек проекта включает в нашу программу нужный заголовочный файл.

Для нас первая строчка программы будет выглядеть вот так:#include Любая программа на языке Си должна обязательно содержать одну главную функцию. Она имеет имя main. Выполнение программы всегда начинается с выполнения функции main. У функции есть заголовок – int main(void) и тело – оно ограниченно фигурными скобками {}.

int main(void)

{тело функции

}

В тело функции мы и будем добавлять наш код. Перед именем функции указывается тип возвращаемого значения. Если функция не возвращает значение – используется ключевое void.

int – это целое 2-х байтное число, диапазон значений от – 32768 до 32767

После имени функции в скобках () указываются параметры, которые передаются функции при ее вызове. Если функция без параметров – используется ключевое слово void. Функция main содержит в себе набор команд, настройки системы и главный цикл программы.

Далее настраиваем порт D на вход. Режим работы порта определяется содержимым регистра DDRD(регистр направления передачи информации). Записываем в этот регистр число “0x00” (0b0000000 – в двоичном виде), кроме кнопки к этому порту ничего не подключено, поэтому настраиваем весь порт D на вход.

Настроить порт поразрядно можно записав в каждый бит регистра числа 0 или 1 (0-вход, 1-выход), например DDRD = 0x81 (0b10000001) – первая и последняя линия порта D работают на выход, остальные на вход. Необходимо также подключить внутренний нагрузочный резистор.

Включением и отключением внутренних резисторов управляет регистр PORTx, если порт находится в режиме ввода. Запишем туда единицы.

Настраиваем порт B на выход. Режим работы порта определяется содержимым регистра DDRB. Ничего кроме светодиода к порту B не подключено, поэтому можно весь порт настроить на выход.

Это делается записью в регистр DDRB числа “0xFF”. Для того чтобы при первом включении светодиод не загорелся запишем в порт B логические нули.

Это делается записью PORTB = 0x00;

Для присвоения значений используется символ “=” и называется оператором присваивания, нельзя путать со знаком “равно”

Настройка портов будет выглядеть так:DDRD = 0x00;PORTD = 0xFF;DDRB = 0xFF;

PORTB = 0x00;

Пишем основной цикл программы. while (“пока” с англ.) – эта команда организует цикл, многократно повторяя тело цикла до тех пор пока выполняется условие, т. е пока выражение в скобках является истинным. В языке Си принято считать , что выражение истинно, если оно не равно нулю, и ложно, если равно.

Команда выглядит следующим образом:

while (условие)

{тело цикла

}

В нашем случае основной цикл будет состоять лишь из одной команды. Эта команда присваивает регистру PORTB инвертируемое значение регистра PORTD.

PORTB = ~PIND; //взять значение из порта D, проинвертировать его и присвоить PORTB (записать в PORTB)

// выражения на языке Си читаются справа налево

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

Только после этого на данный вывод можно подавать цифровой сигнал с внешнего устройства. Далее микроконтроллер прочитает байт из регистра PINx. Содержимое соответствующего бита соответствует сигналу на внешнем выводе порта.

Наша программа готова и выглядит так:

#include int main (void) { DDRD = 0x00; //порт D – вход PORTD = 0xFF; //подключаем нагрузочный резистор DDRB = 0xFF; //порт B – выход PORTB = 0x00; //устанавливаем 0 на выходе while(1) { PORTB = ~PIND; //~ знак поразрядного инвертирования } }

В языке Си широко используются комментарии. Есть два способа написания.

/*Комментарий*/
//Комментарий

При этом компилятор не будет обращать внимание на то что написано в комментарии.

Если используя эту же программу и подключить к микроконтроллеру 8 кнопок и 8 светодиодов, как показано на рисунке 2, то будет понятно что каждый бит порта D соответствует своему биту порта B. Нажимая кнопку SB1 – загорается HL1, нажимая кнопку SB2 – загорается HL2 и т.д.

Рисунок 2

В статье были использованы материалы из книги Белова А.В. “Самоучитель разработчика устройств на AVR”

Печать E-mail

Авторизация

Сейчас 200 гостей и ни одного зарегистрированного пользователя на сайте

Источник: https://radioparty.ru/prog-avr/program-c/224-lesson1

Что нужно для программирования микроконтроллеров? ⋆ diodov.net

Теперь, когда мы уже ознакомлены с некоторыми возможностями и функциями микроконтроллеров, естественно, возникает логичный вопрос: что нужно для программирования микроконтроллеров? Какие необходимы программы и устройства, где их взять?

Для того чтобы микроконтроллер мог решать задачи и выполнять определенные функции, его нужно запрограммировать, т. е. записать в него программу или же код программы.

Структура и порядок написания программы

Первым делом, прежде чем приступить к написанию любой программы, а точнее кода программы, следует четко представлять, какие функции будет выполнять микроконтроллер. Поэтому сначала нужно определить конечную цель программы.

Когда она определена и полностью понятна, тогда составляется алгоритм работы программы. Алгоритм – это последовательность выполнения команд.

Применение алгоритмов позволяет более четко структурировать процесс написания кода, а при написании сложных программ часто позволяет сократить время, затрачиваемое на их разработку и отладку.

Следующим этапом после составления алгоритма является непосредственное написание кода программы. Программы для микроконтроллеров пишутся на языке Си или Ассемблере. Только Ассемблер больше относится к набору инструкций, нежели к языку программирования и является языком низкого уровня.

Мы будем писать программы на Си, который относится к языку высокого уровня. Программы на Си пишутся гораздо быстрее по сравнению с аналогичными на Ассемблере. К тому же все сложные программы пишутся преимущественно на Си.

Здесь мы не будем сравнивать преимущества и недостатки написания программ на Ассемблере и Си. Со временем, приобретя некоторый опыт в программировании МК, вы сами для себя сделаете полезные выводы.

Сам код программы можно писать в любом стандартном текстовом редакторе, например в Блокноте. Однако на практике пользуются более удобными редакторами, о которых будет сказано далее.

Компиляция программы

Написанный нами код на Си еще вовсе не понятен микроконтроллеру, поскольку МК понимает команды только в двоичной (или шестнадцатеричной) системе, которая представляет собой набор нулей и единиц. Поэтому Си-шный код нужно преобразовать в нули и единицы. Для этого применяется специальная программа, называемая компилятор, а сам процесс преобразования кода называется компиляция.

Далее откомпилированный готовый код нужно поместить в микроконтроллер, а точнее записать его в память микроконтроллера или, проще говоря, прошить микроконтроллер.

Для прошивки МК применяется устройство, называемое программатор. В зависимости от типа программатора вход его подключается к COM или USB порту, а выход к определенным выводам микроконтроллера.

Существует широкий выбор программаторов и отладочных плат, однако нас вполне устроит самый простой программатор USBASP, который в Китае стоит не более 3 $.

После того, как микроконтроллер прошит, выполняется отладка и тестирование программы на реальном устройстве или, как еще говорят, на «железе».

Теперь давайте подытожим этапы программирования микроконтроллеров.

При написании простых программ можно обойтись без второго пункта, т. е. без составления алгоритма на бумаге, его достаточно держать в голове.

Следует заметить, что отладку и тестирование программы также выполняют до прошивки МК.

Необходимый набор программ

Существует множество полезных и удобных программ для программирования МК. Они бывают как платные, так и бесплатные. Среди них можно выделить три основных:

1) Atmel Studio

2) CodeVisionAVR

3) WinAVR

Все эти программы относятся к IDEIntegrated Development Environment – интегрированная среда разработки. В них можно писать код, компилировать и отлаживать его.

Следует обратить внимание на Code Vision AVR. Эта IDE позволяет упростить и ускорить написание кода. Однако программа платная.

На начальном этапе программирования все программы лучше прописывать вручную, без каких-либо упрощений.

Это поможет быстро приобрести необходимые навыки, а в дальнейшем хорошо понимать и редактировать под свои нужды коды, написанные кем-то другим. Поэтому я рекомендую использовать программу Atmel Studio.

Во-первых, она абсолютно бесплатна и постоянно обновляется, а во-вторых она разработана компанией, изготавливающей микроконтроллеры на которых мы будем учиться программировать.

Прошивка и отладка программы

Прошивать микроконтроллеры мы будем с помощью дополнительной программы AVRDUDE.

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

При прошивке и отладке МК его удобно располагать на макетной плате, но это вовсе не обязательно. Поэтому для большего удобства пригодится и макетная плата. Существует большой выбор макетных плат, однако я вам рекомендую брать ту, которая имеет по возможности большее число отверстий. Когда мы начнем подключать семисегментные индикаторы, вы оцените преимущества «больших» макетных плат.

Еще один важный элемент, который нам пригодится – это техническая документация на МК, называемая datasheet. В общем, нужно скачать datasheet на микроконтроллер ATmega8.

Итак, полный набор для программирования МК состоит из таких элементов:

1) Atmel Studio

2) Datasheet на ATmega8

3) Proteus

4) AVRDUDE

5) Программатор USB ASP (+ драйвер на него)

6) Макетная плата

7) Микроконтроллер ATmega8

Если микроконтроллера нет в наличии, не стоит откладывать изучение микроконтроллеров на потом, достаточно скачать и установить:

1) Atmel Studio

2) Datasheet на ATmega8

3) Proteus

Скачать AVRDUDE

Скачать datasheet ATmega8

Скачать Atmel Studio

Источник: http://diodov.net/chto-nuzhno-dlya-programmirovaniya-mikrokontrollerov/

Заказ программы для микроконтроллера

Современную электронику трудно представить без микроконтроллеров. Примение микроконтроллеров позволяет упростить процесс разработки устройства, позволяет удешевить его, сделать его более гибким и интеллектуальным.

На данный момент существует огромное множество микроконтроллеров разных фирм, например PIC-контроллеры фирмы Microchip, AVR-контроллеры фирмы Atmel, STM-микроконтроллеры фирмы STMicroelectronics, микроконтроллеры на ядре ARM различных производителей.

Я занимаюсь разработкой программ для устройств на микроконтроллерах. 

Микроконтроллеры, на которые мы разрабатываем программы:

  • PIC12, PIC16, PIC18, PIC24 и dsPIC фирмы Microchip;
  • AVR семейства tinyAVR, megaAVR и др. фирмы Atmel;
  • STM8S003, STM8S103, STM32F103RBT6, STM32F103C8T6 фирмы STMicroelectronics (возможна разработка и на другие микроконтроллеры STM8);
  • MSP430 (пока только для тех, которые есть в протеусе)
  • Возможна также разработка программ для микроконтроллеров других фирм;

Каким образом проверяется работоспособность программы:

  • Проверка программы в системе Proteus Professional 7.10 или 8.3;
  • Проверка на отладочной плате. Имеются отладочные платы на PIC16F877, ATmega128, STM8S003, STM8S103, STM32F103RBT6;
  • Я отсылаем вам по электронной почте или через другие средства связи тестовую версию программы, а Вы проверяете ее на Вашем устройстве;
  • Я отсылаю по электронной почте видео, на котором демонстрируется работа устройства в Proteus или на отладочной плате (в зависимости от функционала устройства);
  • Возможны и другие варианты, например: Вы присылаете готовое устройство, а я его программирую в соответствии с Вашими требованиями, либо за дополнительную оплату изготавливаю опытный образец устройства и тестирую на нем программу;
  • Также рассмотрю Ваши варианты;

Какими средами разработки мы пользуемся:

  • MPLAB IDE (компилятор Hi-Tech PICC, MPLAB C30);
  • MPLAB X (компилятор MPLAB XC);
  • mikroC PRO;
  • IAR Embedded Workbench for AVR, for STM8, for MSP430, for ARM;
  • AVR Studio 4.19
  • WinAVR;
  • Eclipse;
  • Qt Creator

Языки, используемые для написание программ:

  • Cи;
  • Возможна также разработка несложных графических приложений по Windows или Linux на языке C++ в среде Qt Creator

Как происходит оплата и что Вы получаете в конце разработки:

  • Оплата осуществляется через Яндекс.Деньги либо на электронную карту Visa;
  • Другие варианты оплаты не приветствуются, но также возможны (об этом мы договариваемся в процессе переписки);
  • Вы получаете проект с исходными файлами, файл DSN – модель устройства в Proteus Professional 7.10 или 8.3, а также hex-файл прошивки и инструкцию по настройке фьюзов.

Заказать программу Вы можете прямо сейчас, заполнив форму заказа. Я получу от Вас сообщение и отвечу Вам сразу же как появится возможность по электронной почте, указанной вами в форме заказа. Далее можно будет указать Skype, ICQ или другие средства общения через интернет.

Посмотреть примеры выполненных работ

Источник: http://hamlab.net/mcu_development.html

Анализ сред программирования для МК

Программирование микроконтроллеров является неотъемлемой частью разработки самостоятельного электронного устройства. На данном этапе развития электроники, наиболее популярными микроконтроллерами (МК) есть: PIC, MSP, AVR, STM, ARM (процессор).

Для каждого вида МК есть узконаправленная среда программирования. Это связано с внутренней структурой МК и технического обеспечения записи программы в память МК.

Если проанализировать существующие среды программирования МК, то найти универсальные среды программирования МК очень сложно.

При анализе сред программирования было выявлено только одну универсальную среду программирования микроконтроллеров – FlowCode, функции которой позволяют программировать МК PIC, AVR, ARM.

– графическая универсальная среда программирования МК. Программирование осуществляется благодаря построению логической структуры, т.е. блок-схем, аналогично среде HiAsm.

Функция экспорта позволяет экспортировать написаний код PIC МК в программу AVR МК и наоборот.

  Дополнением данной среды программирование является создание HEX-кода, который может быть использовать при прошивки МК, или при проектировании схемы с поддержкой МК, например, в среде Proteus.

Большинство проанализированных сред программирования МК были предназначены для AVR. Среда – это графическая среда программирования МК AVR. Тип графической разработки в данной среде, отличается от . Як говорит автор программы, написание кода осуществляется в 3-5 раз быстрее.

Среда русифицирована и поддерживает автоматическое перекодирование строк в ANSI-кода Windows в код русифицированного буквенно-цифрового ЖКИ.

Среда программирования объединяет в себе графический редактор, компилятор алгоритма, симулятор микроконтроллера, внутрисхемный программатор, функции работы с EEPROM.

Среди платных сред программирования AVR МК есть AVR Studio, IAR Systems, Image Craft, WinAVR, CodeVisionAVR.

–популярная условно-бесплатная среда программирования AVR МК. Объединяет в себе Си-подобный язык программирования и ассемблер. Функции программы позволяют самостоятельно прошивать МК и устанавливать fuse-бити и ПЗУ.Конечным результатом разработки программы под. МК есть создание HEX, BIN или ROM-файла, для прошивки МК с помощью программатора.

Среда поддерживает программирования МК AVR и MSP430, но функции программирования двух МК не объединены в одной среде. Для каждого МК были разработаны отдельные среды программирования. Аналогичным образом была разработана среда программирования Image Craft (ICC).

ICC поддерживает Си-подобный синтаксис и ассемблер. IAR Systems и Image Craft в их состав входит целенаправленные библиотеки по работе с отдельными частями МК.

В состав ICC добавлена утилита для генерации кода и инициализации периферии МК, внедрен ANSI Terminal Emulator, который предоставляет возможность работать с COM-портом.

Среда (CCS) для программирования МК MSP основана на базе стоковой универсальной среды программирования  Eclipse. CCS как вышеперечисленные среды программирования, имеет Си-подобный язык программирования.

Данная среда программирования поддерживает разработку для DSP (Digital signal processor) микроконтроллеров, процессоров АРМ семейства TMS320 и MSP430.

Данная среда в сравнении с ICC или CCS использует Java-машину и требует больше системных ресурсов.

среда программирования для МК MSP430, которая наиболее популярной средой программирования среди начинающих. Имеет Си-подобный язык программирования, но он отличается от языков, которые используются в вышеперечисленных средах. Язык Energia (и Arduino IDE) более понятный, подобный английским словам.

Energia поддерживает дополнительные библиотеки, в состав которых входят драйвера для подключение платформы LaunchPad MSP430 на базе ARM Cortex, FraunchPad и lm4f120 StallerPad. Данная среда программирования является модифицированной версией среды Arduino IDE. Работает c 1, 16МГц МК MSP430 и 80 МГц lm4f120.

Внедрена функция просмотра COM-порта.

– середа разработки с поддержкой проектирования электрической схемы на базе платформы Arduino под управлением МК ATMEL AVR. При анализе использовалась программа версии 4.2.

9, которая поддерживает разработку программ под. МК PIC. Синтаксис подобный среде программирования Energia и Arduino IDE.

Данная среда является платной, в программу внедрены примеры, и модели электронных элементов на основе которых проектируется устройство.

Для разработки программ под МК PIC существует среда .

Создание программы проходит в структурированном виде, встроенный программный симулятор моделирования исполнения программ в МК с учетом состояния портов ввода-вывода, эмулятор работы МК в масштабе реального времени непосредственно в устройстве пользователя. Разработка проекта ведется на языке С или ассемблер. Еще одной средой программирования для МК PIC является mikгоС. Среда mikгоС включает в себя библиотеки, которые поддерживают следующие устройства и интерфейсы:

  • встроенный аналого-цифровой перекодировщик (АЦП) микроконтроллера;
  • встроенную энергонезависимую память EEPROM микроконтроллера;
  • встроенные широтно-импульсные модуляторы (PWM) микроконтроллера;
  • внешние сменные карты памяти типа MMC, SD и Compact Flash;
  • файловую систему FAT;
  • алфавитно-цифровой жидкокристаллические индикаторы (LCD PKI);
  • графические жидкокристаллические индикаторы (GLCD, РК-дисплей);
  • интерфейсы I2C, SPI, 1-Wire, USART, RS-485, CAN, PS / 2, USB (HID) и Ethernet.

Подведя итоги, хочу сказать, что при выборе среды программирования необходимо учитывать ее основной функциональный состав, язык программирования, поддерживаемые порты и интерфейсы.

Если Вы используете другую среду программирования МК, которая в данном посте не указана, пожалуйста, напишите. Указанная вами среда будет проанализирована и добавлена в пост.

Источник: http://entropiya-blog.ru/analiz-sred-programmirovaniya-dlya-mk.html

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}