Файлы

Как прошить микроконтроллер avr? - практическая электроника

____________________________________________________________________

Нам нужен бесконечный цикл. Помещаем наши строчки        PORTC = 0;    __delay_cycles(4000000);    PORTC = 255;      __delay_cycles(4000000);внутрь бесконечного цикла, и вот что в итоге должно получиться://первая прога на Си для  AVR#include <ioavr.h>#include <intrinsics.h>int main(void){  DDRC = 255;  while(1){    PORTC = 0;    __delay_cycles(4000000);    PORTC = 255;      __delay_cycles(4000000);  }  return 0;}   Если у вас другой результат – пройдитесь снова по тексту. Может, я что-то полохо объяснил, может, вы что-то плохо поняли.         Кликаем Make на  панели с кнопками (можно нажать F7). Если все сделано правильно, IAR откомпилирует и соберет проект, а внизу откроется окно Messages, в котором будет написано:…..Total number of errors: 0Total number of warnings: 1   Все прошло без ошибок, но компилер выдал warning — statement is unreachable. Ничего страшного – он просто сообщает нам, что функция main() никогда не возвратит значение. Просто у нас в программе бесконечный цикл и микроконтроллер при работе никогда не дойдет до строчки return 0.   Ищем папку проекта на жестком диске. Там, в директории Release лежит файл прошивки led.hex. Грузим в микроконтроллер… Светодиод заморгал? Отлично. А теперь легко проверить правильно ли работает наша программа. Берем механические часы и смотрим, моргает ли светодиод в такт с секундной стрелкой. У меня моргает, а у вас?

Комплектующие

Микроконтроллеры AVR имеют некоторые преимущества по сравнению с другими аналогичными микросхемами, включая более высокую MIPS и более дружественную архитектуру. В этой статье мы узнаем, как использовать AVR IDE, как создать исполняемый проект, построить базовую схему AVR, а затем запрограммировать ее. Для этого нам понадобится набор компонентов, а также некоторое программное обеспечение.

Оборудование:

  • ATMEGA168 DIP IC x 1
  • Кварцевые резонаторы, кристалл (4-20 МГц) x 1
  • 20 пФ конденсатор x 2
  • 680 резистор x 1
  • 5.6K резистор x 1
  • Светодиод LED x 1
  • Источник 5 В (цепь 7805, плавное регулирование и т.д.) x 1
  • Провода

Программное обеспечение:

  • USBASP
  • WINAVR (20100110)
  • Atmel Studio 7

Типы данных в Си

-Базовые типы данных: char, int, float, double.

-Модификаторы знака: signed, unsigned.

-Модификаторы знака: long, short.

void — тип без значения

При этом следущие типы равны:

В Си логический тип реализован неявно (с помощью int): false = нуль, true = не нуль.

Введение псевдонимов для ранее описанных типов данных:

typedef тип имя

где тип — любой существующий тип данных, имя — новое имя для этого типа.

Пример: typedef unsigned char byte;

Преобразование типов:

Если операнды операции имеют разные типы, то происходит неявное приведение типов:

(чтобы здесь получить 0.4 нужно было бы написать x=2.0/5 или 2/5.0)

Явное приведение типов:

Принудительное преобразование типов:

(тип) выражение;

(желательно вообще избегать преобразования типов)

Переменные и константы

Переменная представляет собой блок памяти, на который мы ссылаемся по её имени (идентификатору).

Декларация переменных (вместе с инициализацией):

тип идентификатор = инициатор;

Например,

Здесь «;» — составляющая часть конструкции, завершающая часть.

Допустима (хотя и редко используется) запись: const x = 100; (по умолчанию int).

Квалификаторы (или «модификаторы доступа»): const, volatile.

const — означает, что переменные не могут изменяться во время выполнения программы; инициалиировать можно только при декларации;

volatile — содержимое переменной может измениться само собой (используется в многопоточных программах при взаимодействии процессов)

Возможен вариант const volatile, когда писать могут только снаружи.

Спецификторы хранения (описатель класса памяти): auto, register, extern, static.

auto — локальные переменных (по умолчанию) — программный стек.

register — просьба компилятору положить переменную в регистр ЦПУ (но он эту просьбу редко выполняет);

extern — объявление (declaration) переменных, но не определение (definition) (определение где-то в другом месте); определение может идти ниже по файлу (но как глобальная) или в другом файле.

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

Внешние и статические объекты существуют и сохраняют свои значения на протяжении всего времени выполнения программы.

Автоматические и регистровые объекты создаются и существуют только внутри блока, в котором они описаны, и уничтожаются при выходе из этого блока.

Описание области действия идентификаторов (имен):

— внутреннее (локальное) — внутри блока {…}

— внешнее (глобальное) — вне всех блоков

Идентификатор, описанный внутри блока, известен только в этом блоке (локальный идентификатор).

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

Стоит избегать использования глобальных имен.

Переменные с классом памяти static видны только в пределах текущего блока (для локальных) или в пределах файла (для объявленных глобально).

Статические переменные хранятся в сегменте данных (data) и по умолчанию инициализируются нулем. Т.е. память под static-переменные выделяется при старте программы и существует до конца программы.

Замечание: Инициализация выполняется одни раз при выделении памяти!

Статическими могут быть также функции. Такая ф-ция может исп-ся только внутри данного файла.

Следует различать присваивание и инициализацию:

— Присваивание: имя_переменной = выражение;

— Многочисленное присваивание: x = y = z = 0;

— Инициализация переменных: тип имя_переменной = константа;

Константы

Константы являются частью машинных команд и под них память не выделяется.

Константы бывают:

— целые:

10-я система: 127; -127; +127;

8-я система: 0127; (начинается с нуля — значит 8-ричная!)

16-я система: 0x7F; (x или X, f или F — регистр не влияет)

— вещественные: 3.14; 2. ; .25 (0 можно опускать); 2E3; 2e3; 2E-3; 2.0E+3;

— символьные: 8-битные ASCII: ‘A’, ‘=’, ‘\n’, ‘\t’, ‘\370’, ‘\xF8’ (символ градуса);

— строковые литералы (в двойных кавычках): «Hello, world!\n». Строки заканчиваются нулевым байтом — ‘\0’.

Макроопределения:

Методические указания к выполнению лабораторной работы по курсу

«Микропроцессорные устройства систем
управления»

Комсомольск-на-Амуре

2007

УДК 681.3.06

Создание и отладка проекта для AVR микроконтроллеров с использованием
среды программирования CodeVisionAVR: Методические указания к лабоpатоpной pаботе по куpсу  «Микропроцессорные
устройства систем управления» /Сост. В.А.Егоpов, Е. И. Ефимов — Комсомольск-на-Амуpе:
Комсомольский-на-Амуpе гос. техн. ун-т, 2007. — 8 с.

Описывается порядок создания и
отладки проекта для AVR микроконтроллеров
с использованием среды программирования CodeVisionAVR.

Пpедлагаемые методические указания
пpедназначены для студентов специальности  210100 —  «Управление и информатика
в технических системах» дневной фоpмы обучения.

Печатается по постановлению
pедакционно-издательского совета Комсомольского-на-Амуpе госудаpственного
технического унивеpситета.

Согласовано с отделом стандаpтизации.

Рецензент: С.М. Копытов

Цель работы: овладеть навыками
создания и отладки проекта в среде программирования CodeVisionAVR.

Теоретические сведения

Создание проекта в CodeVisionAVR:

1. Запустить компилятор Пуск->Программы->CodeVisionAVR

->CodeVisionAVRCCompiler

2. После загрузки окна программы CodeVisionAVR  выполнить File->New. В окне CreateNewFile (рис. 1) выбрать тип файла – project и нажать OK.

Рис. 1. Окно «Create
New File

3. На запрос «Хотите ли использовать CodeWizardAVR» (рис. 2) ответить No

Рис. 2.
Запрос «Хотите ли использовать CodeWizardAVR»

4. В окне CreateNewProject создать новую папку и войти в неё. В
поле Имя файла ввести имя проекта с расширением *.prj и нажать кнопку Сохранить.

5. В окне ConfigureProject (рис. 3) перейти на закладку CCompiler.

Рис. 3. Окно «Configure
Project

В поле Chip выбрать тип процессора Atmega128, в поле Clock задать частоту тактовых импульсов 7,372800 МГц. В
каталоге проекта с помощью программы блокнот создать пустой файл с расширением *.c . Перейти на закладку Files и нажать кнопку Add(добавить). В раскрывшемся окне выбрать
созданный файл с расширением *.c и нажать Открыть. Нажать кнопку
OK в окне Configure
Project
.

6. В окно файла с расширением *.c ввести текст программы.

7. Сохранить проект командой File->SaveAll..

8. Произвести компиляцию проекта
командой Project->Make (Shift+F9).
При наличии синтаксических ошибок устранить их. При отсутствии ошибок
компилятор выдаёт сообщение Noerrors и размер
программы в процентах от общего объёма флэш памяти программ контроллера (рис.
4.).

Рис. 4. Окно Information

9. Загрузить проект в отладчик среды AVRStudio4 командой Tools->Debugger (Shift+F3)
или соответствующей кнопкой на панели инструментов  (Run the debugger). В результате загружается программа
AVRStudio4 и раскрывается окно WelcometoAVRStudio4.

Создание проекта для отладчика среды
AVRStudio4:

1. В окне Welcome to
AVRStudio4
нажать кнопку Open.

2. Перейти в папку с проектом и
выбрать файл  расширением *.cof , затем нажать кнопку Открыть. В появившемся окне
нажать кнопку Сохранить.

3. В открывшемся окне выбрать
отладочное устройство (Debug platform) – AVRSimulator и микроконтроллер (Device) – Atmega128, затем нажать кнопку Load(рис.5.).

Рис. 5. Окно
выбора платформы и устройства

В результате проделанных действий в
левой части экрана появляется окно IOView с ресурсами микроконтроллера. В окне можно наблюдать содержимое
регистрового файла процессора (R0-R15, R16-R31),
содержимое  управляющих регистров процессора (Processor) и состояние регистров ввода/вывода
(I/O ATmega128).

Выполнение тестовой программы в
отладочном режиме:

В тестовой программе происходит
изменение состояния (мигание) бита D7 порта
D. Для просмотра изменения состояния
указанного бита необходимо раскрыть список IO ATmega128 и в нём раскрыть список регистров порта D.

Покомандное выполнение программы
осуществляется командой Debug->Stepover (F10). В этом же меню находится полный список команд работы в
отладочном режиме (подробное описание работы в отладочном режиме находится в
приложении) .

Перевести фокус в окно и исходным
текстом программы (файл *.c) и
при помощи клавиши F10 выполнить
программу в пошаговом режиме.

Внесение изменений в исходный текст
программы:

1. Перейти в окно AVRStudio и выйти из отладочного режима командой
Debug-> StopDebugging.

2. Перейти в окно CodeVisionAVR и внести изменения в исходный текст
программы.

3. Перекомпилировать проект командой Project->Make (Shift+F9).

4. После успешной компиляции закрыть
окно Information, нажав OK.

5. Перейти в окно AVRStudio и на запрос о перезагрузке изменений
с диска (changeondiskreload) ответить Да. Запустить
отладку командой Debug->StartDebugging.

Теперь рассмотрим поближе нашего фаворита, микроконтроллер ATMEGA 8

Энергонезависимая память программ и данных 8 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash) Обеспечивает 1000 циклов стирания/записи Дополнительный сектор загрузочных кодов с независимыми битами блокировки Обеспечен режим одновременного чтения/записи (Read-While-Write) 512 байт EEPROM Обеспечивает 100000 циклов стирания/записи 1 Кбайт встроенной SRAM Программируемая блокировка, обеспечивающая защиту программных средств пользователя

Встроенная периферия Два 8-разрядных таймера/счетчика с отдельным предварительным делителем, один с режимом сравнения Один 16-разрядный таймер/счетчик с отдельным предварительным делителем и режимами захвата и сравнения Счетчик реального времени с отдельным генератором Три канала PWM 8-канальный аналого-цифровой преобразователь (в корпусах TQFP и MLF) 6 каналов с 10-разрядной точностью 6-канальный аналого-цифровой преобразователь (в корпусе PDIP) 4 канала с 10-разрядной точностью 2 канала с 8-разрядной точностью Байт-ориентированный 2-проводный последовательный интерфейс Программируемый последовательный USART Последовательный интерфейс SPI (ведущий/ведомый) Программируемый сторожевой таймер с отдельным встроенным генератором Встроенный аналоговый компаратор

Специальные микроконтроллерные функции Сброс по подаче питания и программируемый детектор кратковременного снижения напряжения питания Встроенный калиброванный RC-генератор Внутренние и внешние источники прерываний Пять режимов пониженного потребления: Idle, Power-save, Power-down, Standby и снижения шумов ADC

Выводы I/O и корпуса 23 программируемые линии ввода/вывода 28-выводной корпус PDIP, 32-выводной корпус TQFP и 32-выводной корпус MLF

Рабочие напряжения 2,7 — 5,5 В (ATmega8L) 4,5 — 5,5 В (ATmega8)

Рабочая частота 0 — 8 МГц (ATmega8L) 0 — 16 МГц (ATmega8)

отличия ATMEGA16 от 8
16 Кбайт внутрисистемно программируемой Flash памяти (In-System Self-Programmable Flash)

Интерфейс JTAG (совместимый с IEEE 1149.1) Возможность сканирования периферии, соответствующая стандарту JTAG Расширенная поддержка встроенной отладкиПрограммирование через JTAG интерфейс: Flash, EEPROM памяти, перемычек и битов блокировки

Четыре канала PWM / ШИМ

8-канальный 10-разрядный аналого-цифровой преобразователь 8 несимметричных каналов 7 дифференциальных каналов (только в корпусе TQFP)2 дифференциальных канала с программируемым усилением в 1, 10 или 200 крат (только в корпусе TQFP)

Шесть режимов пониженного потребления: Idle, Power-save, Power-down, Standby, Extended Standby и снижения шумов ADC

32 программируемые линии ввода/вывода

40-выводной корпус PDIP и 44-выводной корпус TQFP

Создание первого проекта

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

Сначала перейдите в: Файл -> Создать -> Проект (англ. File -> New -> Project) и в открывшемся окне выберите: Исполняемый проект GCC C (англ. GCC C Executable Project), а в текстовом поле Имя (англ. Name) дайте любое название вашему проекту.

Следующее окно, которое должно появиться, — это окно выбора устройства. Из списка выберите Atmega168. Насколько мне известно, это окно не имеет никакого смысла, так как мы все равно передаем имя устройства в AVRDUDE вручную (пока я не могу найти способ заставить Atmel Studio 7 автоматически отправлять имя устройства в AVRDUDE через аргументы).

Результатом должен стать файл main.c, содержащий код нашей программы, который будет запускать AVR. Однако сгенерированный код ничего не делает, поэтому замените все содержимое файла main.c с помощью приведенной ниже программы (обязательно сохраните файл после ввода нового кода).

#define F_CPU 800000UL // Я использую кристалл 8 МГц

#include <avr/io.h>
#include <avr/delay.h>

int main(void){
	DDRD = 0xFF; // Сделать порт D портом выхода

	while(1){
		PORTD = 0xFF;
		_delay_ms(1000);
		PORTD = 0x00;
		_delay_ms(1000);
	}
}

Теперь пришло время скомпилировать код и загрузить его на устройство AVR. Первый шаг — убедиться, что наш проект использует компилятор WINAVR. Щелкните правой кнопкой мыши проект и выберите «Дополнительно» (англ. — Advanced) в окне свойств.

В окне «Дополнительно» убедитесь, что в поле «Набор инструментов» (англ. — Toolchain Flavour) выбран WINAVR.

Сохраните проект и скомпилируйте его, нажав: Build -> Build Solution (или нажав F7). Если все идет по плану, в окне вывода должно появиться следующее сообщение:

Build succeeded.

========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========

Это означает, что наш проект успешно скомпилирован и готов к передаче на наш чип. Чтобы запрограммировать устройство, убедитесь, что USBASP подключен как к ПК, так и к цепи Atmega, к цепи подано питание и что к микросхеме подключен кристалл (в случае, если микросхема была настроена для использования внешнего кристалла).

Затем, после всего этого, нажмите: Инструменты -> USBASP (англ. Tools -> USBASP), и все будет работать автоматически.

Если все хорошо, светодиод в вашей цепи должен начать мигать. Ниже приведен вывод AVRDUDE в Atmel Studio 7, показывающий, как выглядит успешная программа.

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

Reading | ################################################## | 100% 0.01s

avrdude.exe: Device signature = 0x1e9406
avrdude.exe: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
avrdude.exe: erasing chip
avrdude.exe: warning: cannot set sck period. please check for usbasp firmware update.
avrdude.exe: reading input file "0x26"
avrdude.exe: writing lfuse (1 bytes):

Writing | ################################################## | 100% 0.00s

avrdude.exe: 1 bytes of lfuse written
avrdude.exe: verifying lfuse memory against 0x26:
avrdude.exe: load data lfuse data from input file 0x26:
avrdude.exe: input file 0x26 contains 1 bytes
avrdude.exe: reading on-chip lfuse data:

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

avrdude.exe: verifying ...
avrdude.exe: 1 bytes of lfuse verified
avrdude.exe: reading input file "c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex"
avrdude.exe: writing flash (184 bytes):

Writing | ################################################## | 100% 0.11s

avrdude.exe: 184 bytes of flash written
avrdude.exe: verifying flash memory against c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex:
avrdude.exe: load data flash data from input file c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex:
avrdude.exe: input file c:\users\robinlaptop\Documents\Atmel Studio\7.0\OurFirstAVR\OurFirstAVR\Debug\OurFirstAVR.hex contains 184 bytes
avrdude.exe: reading on-chip flash data:

Reading | ################################################## | 100% 0.10s

avrdude.exe: verifying ...
avrdude.exe: 184 bytes of flash verified

avrdude.exe: safemode: Fuses OK

avrdude.exe done.  Thank you.

AtmelStudio

Проект

Чтобы создать проект, надо открыть программу, появиться такая заставка,

и откроется страница создания проекта

Чтобы создать новый проект, нужно кликнуть по «New Project…»
В этом случае откроется новое окно, где можно выбрать язык программирования, название проекта, его месторасположение, название пакета с файлами проекта и возможность создания каталога для дальнейшего использования в других перекрестных проектах. Чтобы создать проект, где мы будем программировать в ассемблере, нужно выбрать — Assembler
, после этого поменяем название проекта, его расположение, и выбираем ОК.

Появится следующее окно

Выбираем “megaAVR, 8-bit”
и находим нужный нам микроконтроллер, мы выбрали ATmega8.
В правой части заставки появляется список устройств, работающих с этим микроконтроллером, один из которых мы можем подключить. Выбираем ОК.

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

AVR-микроконтроллеры предоставляют пользователю несколько различных интерфейсов для программирования. Это последовательное программирование при высоком напряжении, последовательное программирование при низком напряжении через SPI, параллельное программирование при высоком напряжении и программирование по интерфейсу JTAG. Первый тип программирования встречается только в моделях AVR семейства ATtiny, последний — доступен некоторым моделям старшего семейства. Модели ATmega с наиболее развитой периферией могут поддерживать до трех различных интерфейсов программирования.

Подавляющее большинство AVR-микроконтроллеров обладают также способностью самопрограммирования, благодаря чему содержимое памяти программ можно модифицировать непосредственно из пользовательской программы. Кроме этого FLASH-память может быть перепрограммирована в режиме отладки через однопроводной интерфейс dW, имеющийся в ряде моделей ATmega и во всех новых моделях ATtiny.

Программирование при высоком напряжении (параллельное и последовательное) требует значительного числа выводов микроконтроллера и дополнительного источника напряжения 12 В. По этой причине конструкция программаторов достаточно сложна. При высоковольтном программировании достигается наибольшая скорость записи и предоставляется максимальный доступ к ресурсам AVR. Чаще всего этот вид программирования применяется при крупносерийном заводском производстве.

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

Низковольтное последовательное программирование через SPI, наиболее распространено. Это способ стоит признать основным при программировании AVR-микроконтроллеров. Его поддерживают все модели с ядром AVR, за исключением двух устаревших представителей младшего семейства ATtiny11x и ATtiny28x. В данном разделе будет приведено описание двух программаторов работающих в подобном режиме. Первый из них можно рекомендовать для быстрого старта. Он имеет простую конструкцию и работает под управлением популярной радиолюбительской программы . Второй, намного более совершенный, является функциональным аналогом AVR ISP фирмы ATMEL. Этот программатор интегрируется с и позволяет реализовать алгоритмы программирования с максимально возможной точностью.

Операции и операторы

Оператор (инструкция, англ. statement) — это единица выполнения программы.

В языке Си любое выражение, заканчивающееся символом «точка с запятой» (;), является оператором.

Фигурные скобки { } — это составной оператор.

Например,

Кроме того { } является отдельным блоком и в нем можно определять локальные переменные.

; — пустой оператор.

Операции:

— Арифметические операторы: — + * / %

— Инкрименты и декрименты: ++a, —a, a++, a— (могут выполняться быстрее)

— Операторы сравнения (отн-ний): > >= < <= == != (возвращают 1 или 0)

— Логические операторы: && || ! (возвращают 1 или 0)

— Битовые операторы: & | ^ ~ >> <<

— Оператор ?: x ? y : z, напр.: r = 10>9 ? 100 : 200

— sizeof — унарный оператор для вычисления размера переменной или типа

— , — оператор запятая (последовательное вычисление): a = (b=3, b+2);

Порядок выполнения операторов:

— Унарные операторы выполняются справа-налево.

— Бинарные выполняются слева-направо.

— Присваивание выполняется справа-налево.

Порядок можно менять с помощью скобок!

Примеры:

Выражение а + b + c интерпретируется как (а + b) + с.

sizeof() — возвращает длину в байтах переменной или типа; sizeof(int); sizeof(a);

sizeof выражение; — само выражение не вычисляется.

Оператор запятая:

левая сторона оператора вычисляется как void и не выдаёт значения, переменной x присвается значение выражения в правой стороне, т.е. y+1.

Что такое «прошить» и «прошивка»?

Давайте первым делом определимся, что означает слово «прошить»?  Думаю, вы часто слышали такие словосочетания, как «прошить телефон», «слетела прошивка», «кривая прошивка» и тд.  А что такое «прошивка»?

Прошивка — это грубо говоря, операционная система для маленьких устройств, таких как мобильный телефон, MP3-плеер, цифровой фотоаппарат и тд. То есть это  небольшая программка, которая управляет этим устройством. Также часто можно услышать и такое:» У меня «глючит» сотовый телефон, его надо срочно «перепрошить«.

В данном случае это означает, что надо заново установить операционную систему на мобильный телефон. Значит, «прошить МК»  означает закачать во внутрь него программу, которая бы управляла этим МК, а МК уже управлял бы каким-нибудь устройством.  То есть по идее, МК — это посредник между программой и каким-либо устройством, которым надо управлять ;-)

Пример простой программы на Си для микроконтроллера AVR

Это текст программы компиляторов типа AvrStudio, CodeVisionAVR и т.п.

Функция main — это точка входа в программу, с которой компьютер начинает выполнение программы.

Допускается из main возвращать void, хотя это не по стандарту, так что лучше int.

В функцию main можно передавать аргументы командной строки:

Вообще говоря, мы можем писать программу для MK AVR также на языке Processing/Wiring. Это тот же Си, но упрощенный. Но компилироваться это будет только в Arduino IDE или т.п., а потом можно загружать полученный hex в наш микроконтроллер. При этом не обязательно, чтобы МК стоял на плате Arduino. Разницы то нет.

Вот так выглядит аналогичная программа на Processing/Wiring:

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

http://ar.com/basic/uno

а пока мы вернемся к языку Си.

2. Какую среду разработки использовать для программирования выбранного микроконтроллера?

IDE

Наиболее распространенные из них AVRStudio, ATmelStudio, WINAVR, CodeVision, IAR Embedded Workbench
.Для того, чтобы писать программы, мы воспользуемся бесплатной IDE ATmelStudio версии 6
и выше. Скачать Atmel Studio можно с официального сайта после регистрации (регистрация абсолютно бесплатная и ни к чему не обязывает!)

ATmelStudio позволяет создавать проекты, и писать программы как в ассемблере, так и на СИ.

Изначально всегда стоит вопрос: какой язык программирования выбрать, чтобы писать эффективные программы?

Отвечу просто: нужно уметь писать как минимум на двух языках ассемблере и СИ. Ассемблер просто необходим, когда нужно написать быстрые и компактные подпрограммы и макросы, различные драйверы устройств. Но, когда требуется создать объемный проект, построенный на сложных алгоритмах, без знания СИ может быть потрачено очень много времени, особенно в процессе отладки, а если возникнет желание перенести на другую платформу, например PIC18, или STM, может стать неразрешимой проблемой. Кроме этого, сейчас появились аппаратные вычислительные платформы Arduino
, работа с которыми требует знаний языка СИ++.Поэтому будем писать программы как в ассемблере, так и на СИ.

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

Система команд

Система команд микроконтроллеров AVR весьма развита и насчитывает в различных моделях от 90 до 133 различных инструкций. Большинство команд занимает только 1 ячейку памяти (16 бит). Большинство команд выполняется за 1 такт.

Всё множество команд микроконтроллеров AVR можно разбить на несколько групп:

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

Управление периферийными устройствами осуществляется через адресное пространство данных. Для удобства существуют «сокращённые команды» .

Понравилась статья? Поделиться с друзьями:
Зинг-Электро
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: