Atmel studio 7 инструкция на русском

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

Содержание

  • Комплектующие
  • Схема
  • Как установить AVR Studio
  • Как установить WINAVR
  • Как подключить USBASP и установить драйвер для Windows
  • Как настроить Atmel Studio 7 и WinAVR
  • Создание первого проекта
  • Заключение

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

Микроконтроллеры 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

Схема

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

Схема в этом проекте показывает использование простой цепи регулятора мощности (с использованием 7805), которую обеспечивает устройство ATMEGA 5В, но оказывается, что программатор USBASP обеспечивает приблизительно 3,3 В. Несмотря на это, лучше обеспечить внешнее питание, чтобы USBASP не потреблял слишком много тока из любого USB-порта.

Программатор USBASP, который я купил, также шел с конвертером, который преобразует 10-контактный разъем в более удобный 6-контактный программный разъем. Тем не менее, header использует двухрядный шаг 2,54 мм, что означает, что он не может быть подключен к макету. Чтобы обойти это, я просто подключил разъем к проводам, которые соединяются с различными пинами на макете.

Как установить AVR Studio

Устройства AVR программируются с использованием специально модифицированной Visual Studio 2015 под названием AVR Studio 7, которую можно найти на сайте AVR. Первым шагом в программировании устройств AVR является скачивание установщика (небольшого приложения, которое загружает потом необходимые файлы). После скачивания нужно запустить установщик.

Первое, что он вас спросит, будет текст лицензионного соглашения и вопрос про отправку анонимной информации. Я лично рекомендую вам не отправлять анонимные данные по ряду причин (из-за крайней паранойи).

На следующей странице спрашивается какую архитектуру вы хотите установить. Поскольку наш материал охватывает только устройства из диапазона 8-битных микроконтроллеров AVR, то это будет единственная выбранная опция. Однако, если у вас приличная скорость загрузки (у меня всего 4 Мбит/с), тогда выбор всех опций может пригодиться в будущем.

После выбора поддерживаемого устройства на следующей странице будет задан вопрос про расширения — Atmel Software Framework и примеры проектов. Убедитесь, что галочка стоит.

Следующая страница просто проверяет ваш компьютер на наличие потенциальных проблем, таких как отложенный перезапуск (из-за обновления), или если система не сможет запустить IDE. Если все проверено и ОК, жмите «Далее».

Если вы уже установили более раннюю версию AVR IDE, вы можете увидеть следующее окно. Если это так, просто нажмите «Установить».

Теперь нужно подождать пока IDE загрузит все необходимые компоненты и установит их.

После этого вам будет предложено запустить Atmel Studio 7.0. Убедитесь, что стоит галочка перед закрытием окна установки.

Как установить WINAVR

Хотя Atmel Studio 7 полезная штука для написания кода, она не самый лучший выбор, когда речь идет о программировании устройств AVR с использованием инструментов с открытым исходным кодом. Поэтому, чтобы сделать жизнь проще на этапе компиляции и/или программирования, мы будем использовать WINAVR, которая также поставляется с AVRDUDE для загрузки нашего кода на устройства Atmega. Чтобы скачать WINAVR для Windows, просто нажмите на эту ссылку и выберите исполняемый exe-файл.

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

Лучшее место для установки WINAVR — это рекомендуемое расположение: C:\WinAVR-20100110. Следующая опция спросит про компоненты и вы должны убедиться, что установлены все галочки (показано ниже).

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

Как подключить USBASP и установить драйвер для Windows

Если вы используете Windows, вам необходимо изменить драйвер USB для USBASP. Это сделать не сложно с помощью инструмента под названием Zadig. Проще говоря:

  • загрузите Zadig,
  • подключите устройство USBASP к компьютеру,
  • дождитесь пока Windows автоматически установит USBASP,
  • запустите Zadig,
  • найдите устройство USBASP в раскрывающемся списке,
  • выберите драйвер libusb-win32 (v1.2.6.0).

После того, как вы нажмете «Заменить драйвер» (или Переустановить драйвер), Zadig автоматически установит драйвер, необходимый для работы USBASP в Windows.

Как настроить Atmel Studio 7 и WinAVR

Atmel Studio 7 не будет изначально использовать WINAVR или AVRDUDE, поэтому мы должны настроить её для этого. Это может показаться пугающим, но не паникуйте; для программирования устройства AVRDUDE необходима только одна строка инструкций, и только один каталог требуется определить. Фактически, вы должны быть в состоянии скопировать и вставить код в этой статье для любого проекта на базе ATMEGA168.

Итак, первый шаг — сообщить Atmel Studio 7 какой компилятор она должна использовать. Для этого откройте Atmel Studio 7 (если она еще не открыта) и нажмите: Инструменты -> Параметры (англ.: Tools -> Options).

В открывшемся окне используйте список слева, чтобы перейти к: Набор инструментов -> Конфигурация пакета (англ.: Toolchain -> Package Configuration) и в опциях, которые теперь должны быть доступны справа, выберите Atmel AVR 8-bit (язык C) (Atmel AVR 8-bit (C language)) из раскрывающегося списка, а затем нажмите: Добавить особенность (англ.: Add Flavour).

Предполагая, что вы установили WINAVR в папку по умолчанию на диске C и что у вас та же версия, что и в WINAVR, как в этой статье, во всплывающем окне мы пишем так, как показано ниже. После заполнения полей нажмите «Добавить» (англ. add), а когда вы вернетесь в предыдущее окно, нажмите «ОК».

Atmel Studio 7 теперь может использовать WINAVR для компиляции программ AVR, но все равно не может программировать устройства. Для этого нам нужно добавить внешний инструмент в Atmel Studio 7 и настроить его для устройства ATMEGA168.

Первый шаг — перейти в: Инструменты -> Внешние инструменты (англ. Tools -> External tools). Открывшееся окно — единственное окно, необходимое для работы программатора USBASP. Скрин ниже показывает большинство деталей, которые вам нужно будет заполнить.

Поле «Аргументы» (англ. Arguments) не полностью отображает всю информацию, которая необходима, и поэтому приведу ниже то, что было заполнено:

avrdude -c usbasp -p atmega168 -U lfuse:w:0x26:m -U flash:w:$(ProjectDir)Debug\$(TargetName).hex:i

Большая часть информации в этом не важна для нас, кроме двух фрагментов текста. Первый — это -p atmega168;, который говорит AVRDUDE, что мы программируем ATMEGA168. Если в вашем проекте используется другой чип, замените текст atmega168 на используемое вами устройство (например, atmega88).

Второй параметр -U lfuse:w:0x26:m, который специфичен для ATMEGA168. Эта инструкция указывает AVRDUDE настроить устройство на использование внешнего кристалла, и после программирования устройство будет работать только при подключении к схеме кристалла. Обратите внимание, что это также означает, что устройству требуется кристалл при программировании. Этот аргумент будет работать только для ATMEGA168.

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

Следующая задача состоит в том, чтобы создать проект на основе 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.

Заключение

Начало работы с устройствами AVR может показаться несколько сложным, если вы не используете официальный программатор, который может работать «из коробки» с Atmel Studio 7. Однако в инструментах программирования требуется определить только одну командную строку (тип устройства, биты и т.п.). И все будущие проекты могут использовать один и тот же инструмент/компилятор, который нужно настроить только один раз.

Т.е. следующий проект ATMEGA168, который вы будете делать, сможет использовать тот же компилятор и внешний инструмент, что и в этом проекте и не потребуется никаких дополнительных настроек. Конечно, в более сложных проектах может потребоваться замена бит (англ. fuse), например, но в данном материале я хотел просто помочь вам освоить работу с устройствами AVR.

24 июля 2019 в 15:56
| Обновлено 7 ноября 2020 в 01:20 (редакция)
Опубликовано:

Статьи, AVR

Atmel Studio 7 — Создание нового проекта для ATmega16 на языке C (си)

Для начала запускаем Atmel Studio 7 (или 5, или 6, или 8, или старый и надёжный AVR Studio 4). Ярлык данной программы можно найти на рабочем столе или в меню Start > All Programs > Atmel Studio 7.

  1. В Atmel Studio, выбираем File > New > Project…Новый проект (New Project) - Atmel Studio 7 (1)
  2. В левой колонке Installed выбираем C/C++ и тип проекта GCC C Executable Project, а так же введём название проекта (Name: и Solution name:) и путь к папке (Location:) где будут расположены все необходимые файлы нашего нового проекта. Если все указали нажимаем на кнопке ОК.
    Новый проект (New Project) - Atmel Studio 7 (2)
  3. Выбираем микроконтроллер для которого мы будем писать нашу программу, в нашем случае ATmega16. Справа вверху данного окна есть строка сортировки и поиска нужного нам микроконтроллера по его названию. Далее нажимаем на кнопку ОК.Новый проект (New Project) - Atmel Studio 7 (3)
  4. На этом наш проект создан, перед нами появится листинг чистой программы с синтаксисом по умолчанию.
    Новый проект (New Project) - Atmel Studio 7 (4)
  5. Если нам нужно симулировать (отлаживать код), то необходимо настроить симулятор. Для этого выбираем Project > Hello World Properties…Новый проект (New Project) - Atmel Studio 7 (5)
  6. Выбираем Tool, и в Selected debugger/programmer выбираем Simulator.Новый проект (New Project) - Atmel Studio 7 (6)Новый проект (New Project) - Atmel Studio 7 (7)
  7. Сохраняем изменения File > Save Selected Item или Ctrl+S.
    Новый проект (New Project) - Atmel Studio 7 (8)

Спасибо за внимание.

Похожие записи

Существует несколько способов программирования микроконтроллеров семейства AVR. В данной статье мы рассмотрим один из наиболее популярных в настоящее время способов программирования данных микроконтроллеров – с помощью программатора USBASP v2.0 и программы Atmel Studio 7.0. Хотя на нашем сайте уже есть достаточно подробные статьи про программатор USBASP и программу Atmel Studio 7.0 я все таки решил перевести с иностранного сайта и эту статью – вдруг кто то найдет в ней для себя что то интересное.

USBASP и Atmel Studio 7.0 - инструменты для программирования микроконтроллеров AVR

В данной статье будут рассмотрены следующие вопросы:

  1. Установка драйвера USBASP.
  2. Скачивание и установка Atmel Studio.
  3. Установка WinAVR для Atmel Studio.
  4. Установка микроконтроллера Atmega16 с кварцевым генератором и одним светодиодом.
  5. Создание и загрузка программного кода в Atmega16.

Рассмотрим подробно все эти вопросы. Установку драйвера для программатора USBASP будем рассматривать на примере операционной системы Windows10 – но все сказанное в этом разделе будет справедливо и для других версий Windows.

Установка драйвера для USBASP в Windows 10

Если вы используете интерфейс JTAG, вам может потребоваться установка драйвера для USBASP если он не установился автоматически. Если вы не установите этот драйвер, то вы не сможете найти порт USBASP в программе Atmel Studio. Скачать драйвер USBASP можно по этой ссылке — http://www.mediafire.com/file/z576zrku371qyjs/windows-8-and-windows-10-usbasp-drivers-libusb_1.2.4.0-x86-and-x64-bit.zip/file.

После скачивания драйвера выполните следующую последовательность действий:

1. Распакуйте из архива скачанные файлы и поместите их на рабочий стол.

2. Подсоедините модуль USBASP v2.0 к своему компьютеру.

3. Откройте в Windows диспетчер устройств (Device Manager).

4. Теперь вы можете увидеть подсоединенный USBASP в списке устройств.

USBASP в диспетчере устройств

5. Кликните правой кнопкой мыши по “USBasp” и выберите “Обновить драйвер (Update Driver)”.

Меню обновления драйвера для USBASP

6. Select “Произвести поиск драйвера на своем компьютере (Browse my computer for driver software)”.

Выбор способа обновления драйвера для USBasp

7. Найдите в открывшемся окне распакованную папку с драйвером для USBASP и щелкните «Открыть».

Выбор папки с драйвером для USBASP

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

Драйвер для USBASP успешно установлен

9. Если вы увидите сообщение об ошибке как на приведенном рисунке, то вы в этом случае должны отключить цифровую подпись драйвера.

Произошла ошибка при установке драйвера для USBASP

Чтобы сделать выполните следующие шаги:

— нажмите кнопку Shift и удерживая ее нажатой перезагрузите свой компьютер (кликните Restart в меню Windows пока держите ее нажатой);

— когда ваш компьютер перезагрузится не отпускайте кнопку Shift до тех пор пока не увидите “Advanced Options (Расширенные настройки)” на синем экране;

Выбор расширенных настроек

— отпустите кнопку Shift и кликните на “Startup Settings”;

— кликните на “Troubleshoot (Устранение проблем)”;

Выбор устранения проблем

— выберите “Advanced Options (Расширенные настройки)”;

Выбор расширенных настроек при устранении проблем

— после этого вы увидите на экране список расширенных опций и кнопку “Restart” в правом нижнем углу – кликните на ней;

Список расширенных опций перезагрузки

— подождите пока компьютер снова перезагрузится. После этого вы увидите на экране ряд настроек;

— в открывшемся списке настроек выберите пункт “Disable Driver Signature Enforcement (Отключить цифровую подпись драйвера)”. Чтобы ее выбрать просто нажмите кнопку «7» на вашей клавиатуре (не путать с кнопкой «F7»);

Отключение цифровой подписи драйвера при перезагрузке

— после нажатия этой кнопки компьютер перезагрузится и цифровая подпись драйвера будет отключена;

— после этого снова выполните шаги 1-8 из данного раздела статьи и драйвер для программатора USBASP будет успешно установлен.

Выполните следующую последовательность действий:

1. Скачайте Atmel Studio 7.0.

2. Также вам необходимо скачать приложение WinAVR чтобы иметь возможность загружать программы в микроконтроллер AVR с помощью USBASP.

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

3. Подсоедините USBASP v2.0 к USB порту вашего компьютера и подождите пока он правильно определится.

4. Откройте Atmel Studio.

5. Выберите пункт меню “File”, в нем “New” и выберите “project”.

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

6. Теперь назовите ваш проект, выберите место расположения проекта и выберите компилятор “GCC C Executable Project”. Кликните на “Ok” и продолжайте.

Выбор компилятора в Atmel Studio

7. После этого вам будет необходимо выбрать ваше устройство для программирования. В нашем случае это будет микроконтроллер Atmega16A. Если вы будете программировать другие микроконтроллеры, например, Atmega8, Atmega32, то для их программирования также можно использовать программатор USBASP.

Выбор типа микроконтроллера в Atmel Studio

8. После этого для вас будет создан файл main.c, где вы можете писать ваш программный код.

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

Установка WinAVR в Atmel Studio

1. В пункте меню “Tools (Инструменты)” выберите “External Tools (Внешние инструменты)”.

Выбор внешних инструментов в Atmel Studio

2. У вас откроется окно, где вы должны будете ввести имя вашего инструментального средства.

3. В пункте “Title (название)” введите имя вашего внешнего инструментального средства. Можно выбрать любое имя, но в рассматриваемом примере мы выбрали имя “USBasp”. Поставьте галочку в пункте ”Use Output Window” и снимите галочку с пункта “Prompt for arguments” как показано на нижеприведенном рисунке.

4. Теперь ведите “Command”. Там будет необходимо указать путь к “avrdude.exe” – его вы можете найти в папке где установлена WinAvr. Просто найдите “WinAVR-20100110” на диске “C” вашего компьютера – куда вы устанавливали WinAvr.

5. Введите аргументы. Это самый важный шаг в этой последовательности действий поскольку от них будет во многом зависеть корректность работы приложения. Поскольку в рассматриваемом нами случае мы используем внешние инструментальные средства, то можно ввести следующие аргументы:

<avrdude -c usbasp -p atmega8 -U flash:w:$(ProjectDir)Debug\$(TargetName).hex:i>

6. Больше аргументов можно найти по этой ссылке.

7. Введите аргументы в поле для ввода аргументов. Оставьте поле “Initial directory (Начальный директорий)” без изменений.

Окно для ввода аргументов

8. После заполнения всех полей нажмите “Apply” и затем “Ok”.

В результате этих шагов вы сможете использовать внешние инструментальные средства чтобы загружать программы в микроконтроллер. Проверим это с помощью тестового проекта (программы) “blink.c”. Файл main.c вы можете найти в конце этой статьи. Теперь скопируйте main.c в Atmel studio.

Схема устройства с мигающим светодиодом для Atmega16

Схема устройства, которую необходимо собрать, приведена на следующем рисунке. Соедините кварцевый генератор и светодиод с микроконтроллером Atmega16.

Схема конструкции с мигающим светодиодом

Внешний вид макетной платы в этом случае будет выглядеть следующим образом:

Внешний вид макетной платы с собранной конструкцией

Также вы должны соединить микроконтроллер и USBASP как показано на следующей схеме:

Схема соединений USBASP и микроконтроллера AVR ATmega16

Компоновка и загрузка программного кода в Atmega16

1. Сохраните файл main.c.

2. Подсоедините светодиод к контакту PORTA0 микроконтроллера Atmega16 как было показано на вышеприведенном рисунке.

3. Выберите пункт меню “Build” и затем выберите “Build Blink”.

Компоновка проекта в Atmel Studio

4. Если программа не содержит ошибок, то вы увидите сообщение как на представленном рисунке.

Успешная компиляция проекта в Atmel Studio

5. Теперь выберите пункт меню “Tools” и выберите в ней созданные внешние инструментальные средства. В нашем случае это будет “USBasp”. Кликните по нему.

Выбор USBASP в Atmel Studio

6. Если после этого вы увидите сообщение об успешности операции (как показано на рисунке ниже), то значит вы успешно загрузили программу в микроконтроллер. Если вы получили сообщение об ошибке, то проверьте правильность выполнения всех предыдущих шагов, а также проверьте исправность соединительных проводов между USBASP и Atmega16.

Загрузка программы в микроконтроллер AVR с помощью программатора USBASP и Atmel Studio 7.0

7. Вы успешно загрузили тестовую программу с мигающим светодиодом в микроконтроллер используя USBASP v2.0 and Atmel Studio 7.0 и можете увидеть как мигает светодиод в собранной схеме. Теперь вы можете аналогичным образом загружать в микроконтроллер любые другие программы.

Код тестовой программы с мигающим светодиодом

/*

Blink.c

*/

#define F_CPU 16000000UL /* Define CPU Frequency e.g. here its 16MHz */

#include <avr/io.h>

#include<util/delay.h>

int main(void)

{

DDRA=0x01;

while (1)

{

PORTA=~PORTA; // Put value for PortA0

_delay_ms(500);

}

}

Видео, демонстрирующее работу схемы

Загрузка…

20 659 просмотров

Программирование микроконтроллеров Курсы

В этом статье мы напишем первую программу и научимся программировать порты ввода-вывода микроконтроллера.

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

Светодиод и микроконтроллер

По умолчанию, на всех выводах незапрограммированного микроконтроллера напряжение близкое к нулю, поэтому светодиод не будет светиться. Наша задача состоит в том, чтобы написать программу, с помощью которой на выводе МК появится напряжение +5 В. Это напряжения (точнее буде ток) засветит светодиод.

Подключение светодиода к микроконтроллеру

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

Микроконтроллер ATmega8 имеет 28 выводов, каждый из них выполняет определенные функции. Светодиод можно подключить к большинству выводов, однако, не ко всем, ведь минимум пара выводов занята под питание. Чтобы четко знать назначение каждого вывода МК воспользуется даташитом. В даташите находим распиновку (обозначение) всех выводов.

Обозначение выводов микроконтроллера ATmega8

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

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

Плюс («+») источника питания подсоединяется в 7-й ножке, обозначенной VCC. Минус («-») – к 8-й или 22-й ножке, которые имеют обозначение GND (GND – сокращенно от ground – «земля»).

Выводы питания микроконтроллера ATmega8

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

Порты ввода-вывода микроконтроллера ATmega8

Микроконтроллер ATmega8 имеет три порта ввода-вывода: B, C и D. Порты могут быть полными и неполными. Полный порт состоит из восьми бит и соответственно имеет столько же одноименных выводов. У неполного порта меньше 8 бит, поэтому число выводов такого порта также менее восьми.

У данного МК порты B и D полные. А порт C неполный и имеет семь бит. Еще раз обращаю внимание, что нумерация битов начинается с нуля, например PB0, PB1, PB2…

Не удивляйтесь, что у ATmega8 отсутствует порт A. Другие МК, имеющие большее число выводов, могут содержать как порт A, так и порт E. У микроконтроллеров с меньшим числом выводов может быть только один порт и тот неполный.

Знакомство с Atmel Studio 7

Теперь перейдем к написанию кода программы. Наша первая программа будет устанавливать + 5 В на нулевом бите порта C PC0, т.е. на 23-м выводе микроконтроллера.

Схема подключения светодиода к выводам микроконтроллер ATmega8

Запускаем Atmel Studio.

Запуск Atmel Studio 7

Сначала необходимо создать проект. Для этого в открывшемся окне кликаем по вкладке New Project.

Atmel Studio New Project Новый проект

Также проект можно создать, кликнув по вкладке File. В выпавшем меню следует выбрать New и далее Project. Или нажать комбинацию клавиш Ctrl+Shift+N.

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

В появившемся окне выбираем язык программирования C/C++ и кликаем по вкладке.

Atmel Studio 7 GCC C Executable Project

Далее нам нужно задать имя и место на диске для нашего проекта. Назовём наш первый проект именем 1 в строке для ввода Name. Изменить место расположения файла можно кликнув по кнопке Browse напротив строки Location. Если оставить галочку возле Create directory for solution, то в выбранном месте автоматически создастся папка с именем проекта. В данной папке помимо проекта будут созданы и другие вспомогательные файлы, поэтому я рекомендую не убирать галочку.

Atmel Studio 7 настройка проекта

После того, как имя проекта и его место выбраны, нажимаем кнопку OK. Снова появляется окно. В нем нам нужно выбрать тип микроконтроллера. В нашем случае – это ATmega8. Кликаем по вкладке Device Family. В выпавшем меню выбираем серию микроконтроллеров ATmega.

Atmel Studio 7 Выбор типа микроконтроллера

С помощью прокрутки находим и выделяем микроконтроллер ATmega8 и наживаем кнопку OK.

Atmel Studio 7 ATmega8

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

Atmel Studio 7 Первая программа

Рассмотрим все по порядку.

Atmel Studio 7 | Первая программа

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

Цвет комментариев и других элементов программы можно изменять в настройках Atmel Studio.

/*

 * 1.c

 *

 * Created: 07.08.2017 16:57:59

 * Author : ZBL

 */

Комментарии бываю однострочные и многострочные. В данном шаблоне программы применяются многострочные комментарии. Они начинаются косой линией со звездочкой, а заканчиваются звездочкой с косой линией.

/* — начало комментария

.

.

.

.

*/ — конец комментария

Весь текс, который помещен между /* и */ полностью пропускается компилятором.

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

// Здесь пишется однострочный комментарий

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

Директива препроцессора

Следующим элементом программы является строка

#include <avr/io.h>

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

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

Знак # означает, что данная команда – это директива препроцессора. Дело в том, что прежде чем скомпилировать файл компилятору необходимо выполнит предварительную его обработку. Поэтому сначала выполняется некая подготовка файла к компиляции путем добавления некоторых инструкций, прописанных в файле io.h

io – название файла, которое происходит от сокращения input/output – ввод/вывод.

.h – расширение файла, название его происходит от слова header – заголовок.

Теперь все вместе. io.h – это заголовочный файл, в котором записана информация о настройках ввода-вывода микроконтроллера.

Главная функция main 

Ниже нам встречается следующая строка:

int main(void)

В данной строке объявляется функция, носящая имя main. С нее начинается выполнение программы. Эта функция является как бы точкой начала всей программы, написанной в текущем файле. Имя main зарезервировано в языке Си, поэтому во избежание конфликтов, таким именем нельзя называть другую функцию, находящуюся внутри данной. main переводится главный, т. е. данная функция является главной.

В синтаксисе языка Си идентификатором функции служат круглые скобки

()

Внутри скобок помещено слово void (void). Оно обозначает пустота. Это указывает на то, что функция main ничего не принимает, т. е. не принимает никаких аргументов. По мере написания более сложных программ, мы детальнее остановимся на этом моменте.

int – это целочисленный тип данных. В данном случае функция работает с целыми числами: как положительными, так и отрицательными. Существуют и другие типы данных, например с плавающей запятой, символьные и др. Более подробно мы будем рассматривать типы данных по мере необходимости или в отдельной статье. Однако для функции main рекомендуется всегда использовать тип данных int, поскольку конструкция int main(void) определена стандартом языка Си и распознается любым компилятором.

Область действия функции определяется фигурными скобками

{

.

.     → тело функции

.

}

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

В общем случае любая функция имеет следующую конструкцию:

тип данных имя функции(агрумент)

{

тело функции (код)

}

Функция while

Внутри функции main находится функция while:

while (1)

    {

    }

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

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

#include <avr/io.h>

int main(void)

{

         while (1)

    {

    }

}

Программирование портов ввода-вывода микроконтроллера ATmega8

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

Мы уже знаем, что МК может, как принимать, так и выдавать сигнал, т.е. выводы (порты) его могут работать как входы и как выходы. Поэтому предварительно нужно настроить вывод МК на соответствующий режим. Для этого в микроконтроллере есть специальный регистр, который называется DDR – direct data register – регистр направления данных.

У каждого порта есть свой такой регистр. Например, регистр порта C называется DDRC, порта B – DDRB, порта D – DDRD.

Регистры направления данных DDR

Чтобы настроить вывод порта на вход в регистр DDR необходимо записать ноль, а на выходединицу.

Настройка портов ввода-вывода микроконтроллера

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

DDRC = 0b0000001;

Данной командой в регистр DDRC записывается двоичное число равное десятичному 1. Префикс 0b идентифицирует данное число, как двоичное.

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

Программирование портов ввода-вывода микроконтроллеров AVR

Также можно записать в регистр шестнадцатеричное число:

DDRC = 0x1;

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

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

DDRB = 0b10001001;

С целью закрепления навыков рекомендую потренироваться настраивать разные порты ввода-вывода микроконтроллера на вход и на выход.

Регистр микроконтроллера PORT

После того, как мы настроили нулевой бит порта C PC0 на выход, нужно еще выполнить настройку, чтобы на данном выводе появилось напряжение +5 В. Для этого необходимо установить нулевой бит в регистре PORT. Если бит установлен в единицу, то на выводе будет +5 В (точнее говоря величина напряжения питания микроконтроллера, которая может находится в пределах 4,5…5,5 В для микроконтроллера ATmega8). Если бит установлен в ноль, — то на выводе будет напряжение, величина которого близка к нулю.

Каждый порт имеет свой регистр: порт A – PORTA, порт B – PORTB, порт C – PORTC.

И так, чтобы получить на выводе PC0 напряжение +5 В, необходимо записать такую команду:

PORT = 0b0000001;

Обратите внимание на то, что каждая команда заканчивается точкой с запятой.

Таким образом, чтобы засветить светодиод, нам необходимы всего лишь две команды:

DDRC = 0b0000001;

PORTС = 0b0000001;

Первой командой мы определяем вывод PC0 как вход, а второй устанавливаем на нем напряжение +5 В.

Полный код программы выглядит так:

#include <avr/io.h>

int main(void)

{

     DDRC = 0b0000001;

    while (1)

    {

     PORTC = 0b0000001;

    }

}

Здесь необходимо заметить следующее: команда DDRC = 0b0000001; выполнится всего один раз, а команда PORTC = 0b0000001; будет выполняться все время в цикле, поскольку она находится в теле функции while (1). Но даже если мы вынесем команду за пределы функции и поместим ее после DDRC = 0b0000001;, светодиод и в этом случае будет светиться все время. Однако, разместив команду PORTC = 0b0000001; в теле while (1), мы делаем явный акцент на том, что светодиод должен светится все время.

Компиляция файла

Теперь, когда код полностью готов, его нужно скомпилировать. Для этого необходимо нажать клавишу F7 или кликнуть по кнопке Build и в выпавшем меню выбрать Build Solution.

Atmel Studio Компиляция файла

Если ошибок в коде нет, то файл скомпилируется, а в нижней части экрана появится запись о том, что проект скомпилирована успешно: Build succeeded.

Atmel Studio 7 Успешная компиляция

Таким образом программируются порты ввода-вывода микроконтроллера практически любого типа. Следующий наш шаг – это запись кода в микроконтроллер. Также можно проверить корректность работы кода с помощью программы-симулятора микроконтроллеров – Proteus.

Скачать файлы Программа 1

Как читать электрические схемы и создавать электронные устройства

Содержание

  • Программирование Arduino из Atmel Studio 7
  • Русификация программы Atmel Studio
  • Atmel Studio и программатор USBasp
  • Atmel Studio для Windowsпоследняя версия: 7.0.790, обновление от 06.06.2018
  • Начало работы с AVR Studio 4 (урок 1)
  • Программирование Arduino на C. Часть 1
  • Отладка В AVR STUDIO

Atmel studio 7 руководство на русском

Программирование Arduino из Atmel Studio 7

Привет Гиктаймс. Новогодние праздники подходят к концу, все салаты съедены, шампанское выпито, и жизнь потихоньку начинает возвращаться в привычное русло. И это хорошо. Но речь совсем не об этом.
Дело, собственно, вот в чем: многие из нас, начиная свой путь программирования микроконтроллеров с платы Arduino, подходили наконец к такому моменту,
когда в родной среде Arduino IDE становилось тесновато, а крутые среды разработки типа Atmel Studio, Keil, Microsoft VS пугали обилием настроек и инструментов.
Мне, например, очень удобно работать с механизмом вкладок Arduino IDE, разрабатывая большие проекты, это чисто мое предпочтение — на самом деле очень много времени занимает перенос кода, функций и переменных в заголовочные файлы и классы. Но на самом деле, есть более весомые аргументы в пользу перехода от Arduino IDE к более серьезным инструментам разработки. Это в первую очередь, наличие отладчика. Для начинающих программистов микроконтроллеров это кажется несущественным, но когда время идет, и сложность программ увеличивается, увеличиваются и требования к работоспособности и функционалу кода МК. И тут как раз возникает необходимость понимать, и видеть, как работает твой код на микроконтроллере. Даже если ты не обзавелся каким нибудь jtag — девайсом, очень приятно наблюдать даже в симуляторе, как нужные значения падают в нужные регистры во время работы программы. Ну и конечно же, если вы всерьез решили изучить программирование микроконтроллеров и архитектуру AVR — то без дебаггера просто никак не обойтись. Я уже молчу про скрытую работу wiring — препроцессора Arduino IDE, который позволяет писать более простые программы, используя функционал библиотек Arduino, и который добавляет в программу очень много мусора, который занимает память программ контроллера, и использует вхолостую ресурсы МК. Также немаловажным фактором является скромность редактора исходного кода среды Arduino IDE. И как водиться в миру, настоящие хардкорные разработчики встраиваемых систем и автоматики пишут только на си и ассемблере, полагаясь на собственный интеллект и опыт, а не на разработки итальянских студентов (против которых ничего плохого не имею, и камней в их огород бросать не буду).
Если вы согласны с вышесказанным — значит вы уже пробовали, или только собираетесь установить и использовать Atmel Studio 7. Я сам программист начинающий, можно сказать, программирование учил очень давно в школе, это был интерпретируемый Бейсик на машинах MSX. И лишь только пару лет назад пришлось, как говорится, по долгу службы приступить к изучению и освоению си и с++. Поэтому с небольшой высоты колокольни собственного опыта, хочу порекомендовать AVR Studio, а именно Atmel Studio 7. На самом деле, эта среда доставила мне достаточно нервотрепки с ее установкой и запуском (окна я использую исключительно для работы и потехи, причем это Win 7 SP1 64), было несколько попыток установить ее с разбегу, но это заканчивалось фэйлом, пока на чистую систему я не установил обновление Windows6.1-KB3033929-x64.msu, после чего все таки мои старания были вознаграждены, и среда запустилась. После было много сказано отнюдь не литературных слов и выражений, пока среда не стала более менее адекватно работать (Atmel Studio 7 у меня жутко тормозила поначалу, на машине с хорошим Core i7 и 8 гигами шустрой ОЗУ DDR4, не пойму, что стало потом, то ли среда каким то мистическим образом прокэшировалась в системе, или же я привык, но сейчас все неплохо работает). Также я хочу подметить, что эта среда так или иначе разработана и выпущена разработчиками AVR и ARM контроллеров Atmel, и посему поддерживает все свои контроллеры, и предоставляет все необходимые для работы библиотеки на с/с++. Огромный плюсом, и как я полагаю, неотъемлемой частью является наличие ассемблера для описанных выше платформ. Также в седьмой версии программы появилась поддержка конвертации скетчей Arduino в код программы для контроллера на языке си. Опция эта работает пока что несовершенно, и неспособна преобразовывать скетчи с несколькими вкладками, из-за чего теряет пока что определенную актуальность.
Но есть у этой среды и определенный недостаток: она не поддерживает наиболее популярный, и самый дешевый программатор USBaSP, и не поддерживает из коробки возможность программирования напрямую(используя порт USB) плат Arduino. И поэтому я в этой статье хочу поделиться определенным лайфхаком, и я надеюсь, что это кому то будет действительно полезным.
Итак, приступим. Что нам необходимо иметь: ПК с установленными Atmel Studio 7, Arduino IDE желательно последней версии, и драйверами для вашей платы Arduino, ну и собственно, сам пациент. Подключаем контроллер к ПК, дальше устанавливаются драйвера, и после вы должны выполнить несколько манипуляций, но это нужно будет сделать один раз для разных плат Arduino.
Сначала открываем среду Arduino IDE, выбираем любимый наш Блинк, и включаем вывод компилятора в окно компиляции внизу редактора:

Потом компилируем скетч, не загружая его в контроллер:

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



После, открыв среду Atmel Studio 7, выбираем во вкладке Tools пункт External Tools, cоздаем новый профиль (можете сделать несколько разных профилей для каждой отдельной платы Arduino, где в соответсвующие строки вставляем наши параметры, где указаны адрес программы avrdude, и команды для компилятора:


Потом можно создать любой проект, написав, к примеру, тот же код любимой моргалки, но уже на си, и загрузить наш код в контроллер, сначала собрав ваш проект, нажав F7 (Build project), и после кликнув на пункте с именем вашего профиля программирования во вкладке Tools:

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

После установки программы Atmel Studio весь интерфейс будет на английском языке. Кому-то, кто знаком с английским, или уже привык работать с программами с английским интерфейсом, это вполне устроит. Меня лично, такой подход создателей программы к великому и могучему не устраивает, мне более комфортно работать с русскими меню.
Оболочку для программы создавали специалисты из Микрософт, и основой ее была программа Visual Studio (они даже похожи внешне), в которой есть возможность установить национальный язык. У Atmel Studio такой возможности нет, хотя в настройках меню присутствует возможность выбрать два языка — английский или такой же, как в системе Windows (что подразумевает русский, или тот на который настроена ваша система) но меню не перестраивается, только английский. Там же есть ссылка на сайт Микрософт для загрузки файла с национальным языком, файл загружается в компьютер, но не устанавливается, требует присутствия программы Visual Studio.
Поэтому, для русификации программы, придется установить программу Visual Studio. Я надеюсь, что в дальнейшем в Atmel Studio появится возможность устанавливать национальный язык без установки дополнительных программ.
Установка Visual Studio
1. Заходим на официальный сайт Микрософт microsoft.com/ru-ru
2. В поисковом окне сайта забиваем visual studio 2015
3. В разделе Загрузки нажимаем просмотреть все и на первой же странице появляется богатый выбор из продукции Микрософта. Я для себя выбрал установку пакета Visual Studio Professional 2015 (устанавливать — так по полной, вдруг в дальнейшем пригодится, хотя все равно устанавливается только определенный базовый набор)

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

После установки Visual Studio и перезагрузки системы, в меню Atmel Studio появится возможность поменять интерфейс на русский.
Где это находится (покажу в картинках):




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

Итог нашей работы:

Atmel Studio и программатор USBasp

В прошлой статье я уже писал, что совместно с программой Atmel Studio мы будем использовать простой и недорогой программатор USBasp и программу для прошивки микроконтроллеров AVRDUDE_Prog. Конечно, если у вас есть программатор, совместимый с Atmel Studio, вы сможете пользоваться и им.
Эта статья для тех, кто имеет только USBasp (хотя и не только для них).
Ближайший родственник USBasp программатора, который совместим с Atmel Studio — STK500. Есть программаторы несколько сложнее USBasp — USBisp, которые можно прошить прошивкой от STK500, но у нас такой возможности нет. Мы можем только, для удобства работы с программой AVRDUDE_Prog интегрировать ее в меню Atmel Studio (вставим в меню кнопку вызова программы). Так как Atmel Studio у нас уже имеет русский интерфейс, то картинок уже не будет.

Итак, вставляем кнопку вызова программы AVRDUDE_Prog в меню:
1. Выбираем меню Сервис
2. В открывшемся окне выбираем Внешние инструменты
3. В открывшемся окне, в графе Название прописываем USBasp, а в графе Команда указываем путь до файла запуска программы AVRDUDE_Prog и нажимаем ОК. Теперь, если снова открыть меню Сервис, мы увидим перед внешними инструментами наш USBasp. Можно программу запускать и отсюда.
4. Выбираем меню Сервис а в нем настройка
5. В открывшемся окне будет два подраздела Панели инструментов и Команды. В панели инструментов нажимаем Создать. В появившемся окне прописываем имя панели инструментов — USBasp и ОК. Сразу увидите как, среди прочего, появилась новая панель USBasp.
6. Переходим в подраздел Команды и ставим галочку (точку) напротив надписи Панель инструментов. В панели инструментов (в окне) выбираем USBasp и ОК. Далее нажимаем Добавить команду. В открывшемся окне выбираем категорию Сервис. В открывшемся окне Команды выбираем Внешняя команда 1 и ОК. Закрываем окно Настроить.
После столь долгого пути и многих манипуляций, в самом конце меню (в 1 или 2 строке) вы должны увидеть кнопку USBasp. Но можете и не увидеть, все зависит от разрешения вашего экрана, она может быть спрятана внутри раскрывающегося меню

Ищем, где находится наша кнопка

И перетягиваем раскрывающееся меню на вторую строчку

Теперь мы можем запускать программу AVERDUDEProg из меню Atmel Studio.
Таким же образом можно прописать и любую другую программу

1. Основы программирования микроконтроллеров AVR

Atmel Studio для Windowsпоследняя версия: 7.0.790, обновление от 06.06.2018

  • ATMEL STUDIO
  • Тип лицензии: Крякнутая
  • Языки: Мульти
  • ОС: Windows 8, 8 64-bit, 7, 7 64-bit, Vista, Vista 64-bit, XP, XP 64-bit
  • Просмотров: 380
  • Скачано: 152

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

Первым, что вы сможете увидеть после перехода в систему это дизайн программы. Он считается достаточно интересным и не вызывает дискомфорта. Теперь для создания новый прошивки вам необходимо пройти уже привычную процедуру File-New project. После выполнения этого процесса вы сможете выбрать необходимый тип файла.

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

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

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

Начало работы с AVR Studio 4 (урок 1)

Для работы с AVR Studio 4 необходимо само собой её установить. Если она уже установлена, то можете пропустить этот шаг.

Установка:
создаешь каталог c:/avr/ – тут будут лежать рабочие программы.
создаешь каталог например c:/works/ – тут будут лежать твои работы.
надо что бы были короткие пути, что бы не было проблем с ними.

Дальше, качаешь и устанавливаешь в каталог c:/avr/
WinVR
AVRStudio4_SP3

Есть вообще AVRStudio5 но и AVRStudio4 пока вполне хватает.

Вся работа будет проходить в AVRStudio4, WinAVR нужна только из-за библиотеки AVR-GCC (Для того, что бы можно было писать на Си)
НО! первым надо установить именно WinAVR , иначе библиотека AVR-GCC не подцепится.

Дальше запускаешь AVRStudio4 и создаешь проект.

Тут думаю разберешься.
AVR-GCC для того, что бы писать на Си
Atmel Avr Assembler соответственно для ассемблера.

Начинать разбираться с МК лучше с нуля. А это значит с Ассемблера, значит создаешь тот, который Atmel AVR Assembler.

Потом выбирай микроконтроллер Atmega8.

дальше нужно выбрать симулятор. выбирай: AVR Simulator — Amega8

ну теперь нажимай финишь.

когда создастся проект, будет большой, белый, чистый лист. тут будет код.

немного про содержимое этого листа

“комментарии” – это текст, пропускаемый компилятором, при компиляции.
перед началом комментария должен стоять спец символ, пользуюсь символом ; “точка с запятой”, есть еще “дабл сшеш” (//),
вот примеры комментариев

/* * Комментарий такого види(многострочный), * обычно используется для * сопроводительной информции * об исходном коде, т.е. * название, разработчик и т.д. */ NOP // Такой комментарий в основном используется для пояснения назначения команды, или куска кода SLEEP ; такой комментарий тоже как и предыдущий, можно использовать для пояснения (для заметок) в коде

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

MOV R16, R17 ; два параметра INC R16 ; один параметр SEI ; без параметров

С этим все ясно. дальше сложнее. Каждая команда, имеет размер 1, 2 или 3 байта.

MOV R16, R17 ; три байта INC R16 ; два байта SEI ; один байт

Видите связь размера команды с параметрами?

У каждого микроконтроллера свой ассемблер, хотя мнимоника у них похожа, т.е. команда MOV у мк одной серии будет выглядеть в машинном коде допустим 0x12 а у другого 0x55.
что бы при компиляции, скомпилировалось в нужном нам коде мы должны сказать компилятору, для какого мк у нас пишется программа.
это вообще выбирается при создании проекта.
По этому мы выбрали микроконтроллер Atmega8.

Но и тут не все. для облегчения нашей жизни, в AVRStudio4 есть набор констант, которые именуются вроде как “Макроассемблер”.

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

.include m8def.inc // командой .include, мы подгрузили файл m8def.inc ;и теперь нам станет легче &#128521;

в самом начале кода, ставится таблица прерываний. Что это такое и как это работает, объясню в другой заметке. Но а пока, будем писать её так:

RJMP RESET ; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Compare Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; USART TX Complete Handler RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Analog Comparator Handler RETI; RJMP TWSI ; Two-wire Serial Interface Handler RETI; RJMP SPM_RDY ; Store Program Memory Ready Handler

После этого идет уже сам код

RESTART: ; маркер инициализации MAIN: NOP ; маркер главного цикла RJMP MAIN

Но тут есть одна (точнее не одна, а много) особенностей.

Для удобства написания кода, для его понятности и для облегчения относительных переходов, нам подарили маркеры, как они выглядят? “RESET:” и “MAIN:” это маркеры, в их именах могут содержаться почти любые символы латинского алфавита и цифры. Маркеры не могут иметь имена функций и команд, допустим “NOP”.
Как к ним переходит? Допустим командой RJMP.

Так же, из Маркеров, можно сделать подпрограмму(процедуру), по завершению которой, мы вернемся туда, от куда её вызывали. Для вызова её, используем команду “RCALL (подпрограмма)”, а что бы вернуться из Подпрограммы(процедуры), нужно закончить её командой “RET”. У нас должен получиться такой код:

RESTART: MAIN: NOP RCALL PPP1 ; вызываем подпрограмму RJMP MAIN PPP1: NOP RET ; выходим из подпрограммы

Как работает команда “RCALL”, при её вызове, адрес из какого места её вызвали, помещается в СТЕК, а по вызове команды “RET”, извлекается из регистра “стек”. СТЕК нужно инициализировать.

Что бы нам работать с нашим мк, нужно его инициализировать. т.к. мк, это устройство универсальное, в нем есть много портов ввода/вывода, и периферийных устройств. таких как УСАПП, ШИМ, ЦАП, АЦП и т.д. Первым делом в инициализации мк нужно указать начало “стека”. Инициализацию мы проводим после маркера “RESET:”.

LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16

Если бы мы не вводили команду .include “m8def.inc” в начале кода, то нам пришлось бы писать так:

LDI R16,0x04 OUT SPH,R16 LDI R16,0x5f OUT SPL,R16

Разница существенная, на мой взгляд.

СТЕК, это память магазинного типа: (последний вошедший, выходит первым).
Магазинного типа – это не супермаркет, а рожок от автомата. надеюсь все представили как в него заряжаются патроны и как они потом от туда извлекаются.
Нужно уделять очень большое внимание памяти СТЕК, т.к. любая незначительная ошибка в работе с ним, может привести к срыву стека. Это на столько важная тема, что я решил посветить ей целую тему и напишу её в отдельной заметке.

Таким образом у нас получился такой код:

.include m8def.inc RJMP RESET ; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Compare Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; USART TX Complete Handler RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Analog Comparator Handler RETI; RJMP TWSI ; Two-wire Serial Interface Handler RETI; RJMP SPM_RDY ; Store Program Memory Ready Handler RESET: LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET MAIN: NOP ; маркер главного цикла RJMP MAIN

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

Для правильного процесса отладки, необходимо задать эмулятору частоту, с которой будет работать МК, это делается только после компиляции и запуска отладки,
значит находим в панели меню “Build”, раскрываем её и видим “Build and Run”, после чего, мы увидим желтую стрелочку на против первой команды в нашем листинге кода. Теперь мы ищем в панели меню “Debug” и нажимаем “AVR Simulator Options”, открывается такое окно:

В котором мы можем поменять МК и его частоту, так же, на панели с права, мы видим некоторую информацию о нашем МК: его максимальную частоту, объемы памяти(EEPROM, RAM, FLASH). Теперь открываем даташит на Atmega8, на странице 203 (общий список регистров) и 205 (общий список команд) и приступай к написанию своей программы.
И запомни, не бойся экспериментировать с симулятором, он от этого не сломается!

Настало время написать первую программу для нашего микроконтроллера!

Для выполнения данного урока, Вам пригодится:

  1. Микроконтроллер (Подойдет почти любой микроконтроллер семейства AVR, однако , лучшим выбором по соотношению цена/функционал станет AtMega8).
  2. Светодиод (Так же любой, однако при покупке уточните его номинальный ток, и падение напряжения).
  3. Резистор (Какой именно, рассчитаем далее).
  4. Программатор.
  5. Провода соединительные.
  6. Источник питания 5v.
  7. Плата макетная (Для Вашего удобства).

Начнем с написания прошивки.

Прошивка(Программа) — Набор инструкций(команд) микроконтроллера, представленный в виде конечного файла(специального формата), используемого в дальнейшем при работе контроллера.

1.Открываем Atmel Studio, создаем проект на языке AVR C или AVR ASSEMBLER и выбираем модель Вашего микроконтроллера.

В окне редактора исходного кода пишем:

Урок 2,AVR C HELLO WORLD C

Урок 2.AVR Assembler hello world

Нажимаем Build-Build Solution. После выполнения данных операций, в папке проекта появится файл формата .hex. Это и есть наша прошивка!

2.Далее, собираем следующую схему:

Резистор R1 необходим для ограничения тока протекающего через светодиод LED1.

Например, возьмем светодиод с напряжением питания 2.2В и током питания 10 мА(0.01А). Напряжение питания соответственно равно 5В.

Согласно приведенной выше формуле, получим:

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

В данном случае берем резистор стандартного значения 330 Ом.

А теперь настало время вдохнуть жизнь в нашу схему!

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

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

Вернув контроллер на его место в схеме(Разумеется, если Вам пришлось его отсоединить), подаем 5v питания на контроллер.

Если все сделано верно, вы увидите что светодиод зажигается и гаснет с постоянной частотой.

Поздравляем, Вы только что собрали Ваше первое устройство с использованием микроконтроллера!

Если что то не получилось, то Вы всегда можете написать об этом в комментариях к данной статье!Наша команда всегда готова ответить на все Ваши вопросы!

Спасибо за внимание!

Администрация сайта MKPROG.RU.

Другие уроки цикла.

Копирование, воспроизведение, цитирование данного материала или его частей разрешено только с письменного разрешения администрации сайта MKPROG.RU.

Программирование Arduino на C. Часть 1

Поднимем вопрос программирования Arduino на языке Си. Зачем это может понадобиться, ведь на языке Arduino писать значительно проще? Во-первых, код на Си весит намного меньше, чем на Arduino (насколько меньше увидите дальше). Во-вторых, он может выполняться быстрее (для задач, где критична высокая скорость). Кроме того, это может стать первым шагом при освоении собственно микроконтроллеров. Как всегда здесь не будет теории, только практика.

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

Если на Arduino было необходимо наличие функций loop и setup, то на Си должна быть функция main, возвращающая тип int. Внутри этой функции и будет находится наш код.

Поставим себе простейшую задачу — зажечь светодиод на порту №13. И тут мы столкнемся с тем, что собственно на микроконтроллере нет 13 порта. Посмотрим распиновку (pinout) микроконтроллера, установленного в Ардуино (atmega328p).

Тут обращаем внимание на PB0 — PB7, PC0 — PC6, PD0 — PD7. Это и есть порты для подключения устройств, с ними и предстоит работать. Посмотрим, как эти порты соотносятся с портами Arduino.

Мы задались целью зажечь светодиод на 13 порту. По распиновке Arduino мы видим, что там находится порт PB5. Собственно, правильнее сказать, что порт B, 5 бит. В программе будем работать сразу со битами порта B (0-7), но постараемся не затрагивать биты кроме 5.

Сначала нужно обозначить B5 как выход, то, что на Ардуино делалось командой pinMode (13, OUTPUT).

На Си для этого существует команда DDRB, где B — порт (соответственно, могло быть DDRC и DDRD).

У порта B 8 битов, каждый из которых может быть настроен на выход (1) и вход (0). Поэтому, мы можем задать двоичное число, где каждому биту соответствует 0 или 1.

говорит о том, что 0 бит порта B, т.е. PB0 (8 порт Ардуино) будет выходом (OUTPUT), остальные — входом (INPUT). 0b перед числом позволяет указывать двоичную запись числа.

Так как мы работает с PB5, то 1 мы должны поставить в 5 бит

Теперь нужно подать напряжение на данный порт. Делается это командой PORTB, где B — снова порт. Напряжение подается единицей, отсутствие напряжения — 0. По аналогии запишем команду

чтобы подать напряжение на 5 бит.

1 2 3 4 5 6 #include avr/io.h int main (void)

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

Для этого потребуется знание логических операций и операций над битами.

Результат ИЛИ равен 1 если хотя бы один из операндов равен 1.

a b ИЛИ
0 0 0
0 1 1
1 0 1
1 1 1

Результат И равен 1 если оба операнда равны 1.

a b И
0 0 0
0 1 0
1 0 0
1 1 1

Побитовые сдвиги влево и вправо ( и )

Данные операции сдвигают все биты числа вправо или влево на заданное количество позиций.

Например, запись 12 означает, что биты изначального числа 00000001 сдвинутся влево на 2 позиции и получится 00000100.

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

Мы должны PB5 настроить на выход. Сделаем это так:

15 это 1 в 5 бите, т.е. 0b00100000. Применяем логическое ИЛИ для текущего состояния порта B и данного числа. Так как 1 находится только в 5 бите, то и в результате изменится лишь 5 бит порта B (станет 1), остальные биты останутся без изменений. Результат операций перезаписывается в DDRB.

Тоже самое проделаем и для отправки сигнала:

Отладка В AVR STUDIO

1. Запускаем АVR Studio 4, проект создавать не нужно.

3. Выбираем файл для загрузки в AVR Studio 4.

Выбрав файл с расширением .obj, отладку можно осуществлять в кодах Ассемблера. Следует обратить внимание на то, что проект содержит три файла (.asm, .inc и .vec) и отладка начинается с файла .vec, содержащего векторы прерываний. Курсор отладки (желтая стрелка) установлен на команде rjmp reset. После нажатия кнопки Step Into (Fll) курсор переходит на обработчик сброса, расположенный в файле .asm, и дальнейшая отладка продолжается в обычном режиме. Чтобы пропустить команды, добавленные компилятором, и перейти к отладке кода, написанного программистом, нужно установить курсор на первую команду процедуры main О и нажать кнопку Run to cursor. Все команды до курсора будут выполнены. Проект можно просмотреть в окне Disassembler, которое открывают, выбрав в меню View;Disassembler, Отладку можно продолжить в этом окне.

Для отладки программы на языке Си выбираем файл с расширением .cof.

4. Устанавливаем параметры отладки в меню Debug; AVRSimulator Options: АТх8515, частота 1 МГц, протоколирование порта РВ с выводом на экран.

5. Содержимое используемых регистров ввода;вывода МК можно проконтролировать несколькими способами:

а) непосредственно просматривая их содержимое на вкладке НО панели Workspace;

б) анализируя область памяти регистров ввода;вывода

в) присвоив их значения переменным, которые в дальнейшем просматривают в окне Watch.

В нашем случае имеем одну переменную timer, которая принимает значение таймера;счетчика TCNTO. Открываем окно Watch, выбрав команду меню View;Watch, и перетаскиваем мышью эту переменную в столбец Name. Пока переменная находится вне зоны видимости отладчика, в столбце Value будет записано Not in Scope. Подготовка к отладке завершена.

6. В начале процесса отладки и при нажатии кнопки сброса Reset курсор отладки устанавливается на первой строке процедуры main (). Выполнение программы можно контролировать, открыв окно Disassembler, однако имея программу на языке Си, значительно удобнее отлаживать программу в окне Си-программы.

7. Нажимая кнопку Step Into (Fll), наблюдаем за изменением содержимого регистров ввода;вывода микроконтроллера. Одно из преимуществ отладки на Си – использование только программных инструкций, способствующее ускорению процесса отладки. В цикле for (;;) командой Ассемблера sleep микроконтроллер переводится в режим пониженного энергопотребления.

8. Занесем в счетчик TCNTO значение 2. При разомкнутой кнопке SWO (состояние 1) эмулируем замыкание кнопки SW2 (состояние 0), что приведет к вызову обработчика прерывания. При вызове процедуры delay_ms<) отладчик не входит в нее, но вызов задерживает его работу и изменяет значение счетчика циклов.

9. Установив курсор на команде sleep, выполним команду Run to Cursor (выполнить до курсора). После останова симуляции, что обнаруживается по желтому индикатору в строке состояния, в окне Output получим список сообщений (отчет), в котором значение 0x81(10000001) соответствует готовности схемы (светодиод LED7 выключен, LED6 включен), значение OxCl(11000001) – погашены оба светодиода, 0x41(01000001) – LED6 погашен, LED7 включен. Список сообщений:

Длительность включения светодиода LED7 составляет 0,503 с.

11. Компилируем в CodeVision AVR, установив в окне Configure тип выходного файла Intel HEX. Загрузив полученный файл с расширением .hex в микроконтроллер STK500 и изменив на вкладке Board окна STK500 частоту, проверяем работу программы. Соединяем РВ6: РВ7 – LED6:LED7, SWO – РВО, SW2 – PD2. В исходном состоянии светодиод LED6 включен, LED7 выключен. Нажав несколько раз на кнопку SWO, затем на кнопку SW2, наблюдаем мигание светодиода LED7 с частотой 1 Гц. В это время светодиод LED6 выключен. После завершения мигания LED6 вновь включается, а устройство переходит в режим ожидания.

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

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

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

Размер кода. При использовании всех возможностей языка Си программа может быть очень компактной, однако, если сравнивать откомпилированные коды, оценки могут измениться. Код, написанный на Ассемблере, минимален по размеру и оптимизирован под конкретную задачу, что позволяет получить высокую скорость работы программы. Компилятор же оперирует фрагментами кода по общим правилам. Так, в примере со светодиодами в начале работы программы 8.1 обнуляются все регистры микроконтроллера и оперативная память SRAM, при входе в процедуру прерывания регистры сохраняются в стеке, а затем восстанавливаются при выходе. Однако в приложении работа с памятью не предусмотрена – используется всего лишь несколько регистров.

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

Переносимость. Изменение частоты синхронизации микроконтроллеров, очевидно, влияет на длительность выполнения процедур. Если время выполнения должно остаться неизменным (в нашем случае это время включения светодиода), потребуется вносить изменения в программу на Ассемблере, заново пересчитывая коэффициенты в циклах задержки. В программе на Си необходимо только заменить частоту в конфигурации проекта и компилятор пересчитает все автоматически, что, безусловно, проще.

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

В заключение приведем ряд рекомендаций по написанию программ на языке Си для микроконтроллеров. Для уменьшения размера программного кода рекомендуется:

– компилировать с оптимизацией по размеру;

– использовать локальные переменные, а не глобальные, так как первые хранятся в регистрах, а вторые – в ОЗУ;

– использовать по возможности беззнаковые типы данных меньшего размера;

– если глобальная переменная используется только в одной функции, она должна быть объявлена как Static,

– использовать конструкцию for (;;) для бесконечных циклов;

– использовать циклы с декрементом и конструкцию <> while <выражение)’,

– выполнять доступ в память непосредственно, не используя указатели;

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

Для уменьшения требований к памяти SRAM следует:

– константы и литералы располагать в памяти программ, объявляя их с помощью директивы Flash\

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

– правильно оценивать размер программного стека (Data Stack Size), который необходимо указывать в настройках проекта

Источник: t-31.ru

Понравилась статья? Поделить с друзьями:
  • Чжуангу гуаньцзе вань инструкция по применению на русском языке
  • Как сделать полок в бане своими руками пошаговое руководство угловой
  • Холодильник атлант руководство по эксплуатации двухкамерный холодильник
  • Уаз 31519 скачать руководство
  • Мануалы на русском бмв