Си для avr – AVR. Учебный Курс. Программирование на Си. Часть 1

AVR Пишем код на СИ. Зажигаем светодиод

&nbsp

&nbsp

&nbsp

Урок 3

 

 

Сегодня мы научимся писать код на C в среде Atmel Studio, для примера мы возьмём тот же проект, который мы создали на прошлом занятии.

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

В самом начале кода мы видим строку в виде следующей директивы

#include <avr/io.h>

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

Директива #include просит препроцессор (компилятор) включить файл, объявленный после нее в исходный код. Имя файла может заключаться либо в треугольные скобки <> либо в кавычки ””. Треугольные скобки используются в случае включения в код файла из самой среды разработки, а кавычки – пользовательского файла.

#include <имя файла>

В нашем случае в текст кода включается файл io.h. Если мы откроем данный файл, то мы увидим, что в зависимости от каких-то условий в наш код включаются ещё определённые заголовочные файлы. В нашем частном случае условием является использование нами определённого микроконтроллера. Так как мы используем Atmega8a, то соответственно включится следующий файл:

#elif defined (__AVR_ATmega8A__)
# include <avr/iom8a.h>

В данном файле находятся макросы для векторов прерываний, для определённых шин. Что такое макросы и как их использовать, мы разберём немного позднее. Движемся дальше по файлу io.h и видим, что в него также включены ещё 3 файла, но нам будет интересен следующий файл:

#include <avr/portpins.h>

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

/* Port Data Register (generic) */
#define PORT7  7
#define PORT6  6
#define PORT5  5
#define PORT4  4
#define PORT3  3
#define PORT2  2
#define PORT1  1
#define PORT0  0

Данные строки нам говорят о том, что, например, если при компиляции проекта препроцессор (интерпретатор команд) встретит в коде слово PORT4, то он его сразу заменит на цифру 4.

Тем самым мы постепенно с вами подошли к изучению ещё одной директивы

Директива #define

Просит препроцессор (компилятор) в случае появления в тексте кода буквосочетания 1 заменить его на буквосочетание 2.

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

#define <буквосочетание 1> <

буквосочетание 2>

Вернёмся в наш код. Далее мы видим следующее

int main(void)
{

}

То, что мы с вами наблюдаем в языке C и C++ называется функция. Функциями мы будем пользоваться постоянно. Функция — это такая подпрограмма, которая вызывается из какого-нибудь участка кода. Самое важное у функции — это её имя (в нашем случае main). По имени мы будем вызывать функцию из другого участка кода. Также у функции существуют входные аргументы, возвращаемые аргументы, а также тело. Входные аргументы находятся сразу после имени в скобках и перечисляются один за другим, а разделяются запятыми. В нашем случае стоит один тип «void», обозначающий, что у нашей функции вообще нет входных аргументов. Поэтому если мы подобную функцию будем вызывать в другом участке кода, то мы в скобках вообще ничего не ставим. Возвращаемый аргумент у функции один. Если нам потребуется больше чем один тип переменных, то мы будем пользоваться глобальными переменными, о которых мы узнаем позже. Изучение переменных вообще не входит в рамки наших уроков, как правило это объясняется непосредственно в уроках и литературе по языкам программирования. Тип возвращаемого аргумента указывается перед именем функции. В нашем случае — это int (целочисленная знаковая переменная). Также у функции существует тело — это участок кода, находящийся между открывающей и закрывающей фигурными скобками. Вот этот участок кода и будет выполняться в случае вызова функции.

Функцию main мы явно нигде не вызываем. Это главная функция нашего приложения, недаром она и называется main, что по английски значит главный. Встретив данное имя, компилятор и начинает выполнение программы с данного места. То есть это своего рода входная точка нашей программы. Отсюда всё и начинается. Сюда мы и начинаем писать свой код.

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

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

Давайте сначала подключим светодиод к какой-нибудь ножке контроллера, например к ножке 0 порта D

 

У порта D, как мы видим из данной распиновки, существует как раз 8 ножек, что соответствует байту (8 бит). Также как биты в байты, ножки портов отсчитываются от 0.

Напишем мы сначала следующую строку

int main(void)
{

DDRD = 0xFF;

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

DDRD — это команда, которая устанавливает состояние лапок порта D. Состояние лапки порта — это то, в каком направлении данная лапка будет работать — на выход или на вход, что соответствует установке определённого бита в 0 или в 1. Но так как мы будем зажигать светодиод, мы должны на определённой ножке порта выставить высокий логический уровень (в нашем случае 5 вольт). А чтобы управлять уровнями ножки, она должна быть определена, как работающая на выход или на вывод. То есть состоянием лапки мы будем управлять из контроллера, а не из внешнего источника уровня. Так как у нас лапка нулевая, то и бит мы и должны выставить в ноль нулевой бит нашего байта, соответствующего нашему порту D. Так как мы не пользуемся сегодня остальными лапками порта, то нам их состояние будет не важно и мы выставляем все лапки портов на вывод. Поэтому мы присваиваем переменной

DDRD значение 0xFF. Данное значение мы написали в шестнадцатиричном виде. Этот вид очень удобен для программистов, так как визуально о многом говорит. FF — это в десятичной системе 255, а в двоичной — 11111111, что говорит о том, что все биты в данном числе выставлены в единицу. Также мы видим, что наша строка заканчивается точкой с запятой (;). Данный оператор — это разделитель команд, так как в одной строке мы можем писать не обязательно одну только команду, а можем и несколько, если они небольшие. Также в данной строке мы видим оператор «=» (знак равенства). Данный оператор заставляет наш препроцессор присвоить значение, находящееся справа возле него переменной, находящейся слева.

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

PD0 высокий логический уровень. Сделать это мы можем следующей командой:

DDRD = 0xFF;

PORTD = 0b00000001;

 

 

Данная команда или переменная PORTD управляет записью или считыванием значений в порт или из порта в зависимости от состояния. То есть данной командой мы включили нулевую лапку в высокое логическое состояние (в единицу). Здесь мы с вами уже попробуем использовать написание значения в двоичном виде. Чтобы писать значения в данном виде, мы используем префикс 0b. Данный вид удобен тем, что мы здесь видим полностью, как выглядит наш байт побитно. Лапки портов в байте, также как и биты считаются справа налево. То есть данной командой мы выставили в высокое состояние нулевую лапку порта D, а остальные мы выставили в низкое. Вообщем, арифметическо-логическое устройство микроконтроллера сначала включит все ножки порта на выход, а затем установит на нулевой ножке высокое логическое состояние, и после этого у нас должен будет зажечься светодиод, так как через токоограничивающий резистор мы его анодом подключим к данной ножке, а катодом к общему проводу. Тем самым на контактах светодиода появится разность потенциалов, которая заставит его светиться. Кроме написанных нами двух строк далее в коде присутствует команда

while. Данная команда является командой условного цикла.

PORTD = 0b00000001;
while(1)
{

}

В скобочках указывается условие, которое должно либо выполняться либо не выполняться. Также как у функции есть тело, то у условия также есть тело, также заключенное в фигурные скобки. И код, находящийся в теле цикла, будет выполняться бесконечно, пока условие, находящееся в скобках будет выполняться, то есть будет истинным. Как только условие перестанет выполняться, а проверяется это тогда, когда код выполнится до конца (до закрывающей фигурной скобки), то мы выходим из цикла и код продолжает выполняться уже дальше тот, который находится уже не в теле цикла, а после закрывающей фигурной скобки. А истина в информатике — это TRUE или 1. Поэтому в данном случае цикл будет бесконечным, так как там стоит единице, а единица всегда равна единице. Бесконечный цикл организован для того, чтобы код, написанный для контроллера, выполнялся постоянно, то есть чтобы наш контроллер постоянно работал и не останавливался. В нашем случае тело пустое, и наш контроллер, вернее его АЛУ, будет всё время висеть в данном цикле и ничего не делать до тех пор, пока мы не отключим питание, либо нам его не отключат в розетке, либо, не дай Бог, сгорит контроллер. То есть светодиод наш будет светиться постоянно.

Сегодня мы не будем пробовать нашу программу прошивать в микроконтроллер, и даже не будем пробовать ещё в виртуальном контроллере, то есть в программе симуляции, а попробуем симуляцию запустить в самой студии, так как на прошлом занятии мы в качестве отладчика и выбрали симулятор. Двойным щелчком мыши либо клавишей F9 мы установим точку останова на команде PORTD = 0b00000001; и, когда мы запустим отладку, то отладчик, как только увидит данную точку, должен будет в этом месте остановить выполнение программы, и мы сможем посмотреть, какие уровни и где у нас установились.

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

Здесь мы наблюдаем, что ещё у нас открылась карта нашей памяти, в которой нам пока ещё ничего не понятно. Если бы мы писали на ассемблере либо на машинном коде, то нам бы это было понятнее. Поэтому нас интересует другая. Карта. Для этого мы нажмём вот эту кнопочку

Данная кнопочка (I/O View) откроет нам окно с данными наших портов ввода-вывода и прочей периферии

 

Нажмем в данном окне на строку PORTD и увидим в нижней половине окна, что весь наш регистр DDRD, отвечающий за направление отдельных ножек порта выставился весь в единички, то есть на выход

А дальше уже проблема. Чтобы нам посмотреть, как сработает следующая команда, которая включит нам нулевую ножку, отладчику необходимо остановиться на следующей строке кода, а у нас её нет, у нас только бесконечный цикл, который для отладчика — не строка. Поэтому мы пока остановим отладчик следующей кнопкой

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

PORTD = 0b00000001;

PORTD = 0b00000010;

Конечно всё это на практике у нас не сработает, так как мы не успеем заметить свечение предыдущего светодиода. Чтобы задумка заработала практически, мы должны ещё с вами включить между данными командами задержку, а это тема уже других более поздних занятий. Но тем не менее мы данную команду включим, чтобы отладчику было где остановиться. Затем мы запустим заново отладку. Точка останова у нас также находится пока на той строке, на какой и была до этого. Запустим опять отладчик. Собирать проект перед отладкой необязательно, так как отладчик сам его пересоберет. Дожидаемся остановке отладчика на точке. В окошке с вводом-выводом опять нажмём на строке с нашим портом. Дальше начинаем шагать по программе. Для этого нажимаем следующую кнопку или функциональную клавишу F10, о чем нам подсказывает студия, как только мы подносим указатель мыши к данной кнопке

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

И теперь в окне ввода-вывода мы видим уже следующую картину

Мы видим, что самый левый бит, соответствующий нулевой ножке порта переключился в высокое логическое состояние, причём мы это видим не только в регистре PORTD, но и в регистре PIND, который отвечает за считывание состояния ножек порта D при его работе на ввод. Вот таким вот образом мы и отлаживаем наши программы.

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

После этого текст кода у нас должен будет остаться вот таким

 

Предыдущий урок Программирование МК AVR Следующий урок

 

Исходный код

 

 

Купить программатор можно здесь (продавец надёжный) USBASP USBISP 3.3

 

Смотреть ВИДЕОУРОК

 

 

Post Views: 19 562

narodstream.ru

Книга по СИ для AVR. / AVR / Сообщество EasyElectronics.ru

Нарыл недавно клевую книженцию автора Романа Абраша. Называется Книга по работе с WinAVR и AVR Studio. Книга автором не дописана. Но хоть что то есть, и то что есть, мне понравилось.

Вот цитата из его книги:

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

Вот существующие главы его книги.

А вот ссылка на спец книгу по СИ.
Загружать эти файлы.

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

P.S
Вот еще нарыл очень четкий справочник по СИ. Чтоб справочник запустить, нужно в открыть файл main.htm

А вот он же, только в онлайн режиме.

А вот книга «Программирование микроконтроллеров ATMEL на языке С — Прокопенко Вадим».

we.easyelectronics.ru

Введение в язык программирования С (Си) для микроконтроллеров

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

История создания языка C (Си)

Язык программирования C (Си) появился «стихийно» – ни одна компания не заказывала создания подобного языка. Его первая версия появилась на свет в 1972 г. в фирме Bell Laboratories, написал ее теперь уже всемирно известный программист Деннис Ритчи (Dennis MacAlistair Ritchie).

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

Название C (Си) появилось так же стихийно, как и сам язык. Фактически, он стал преемником ранее созданного языка В (Би), разработанного автором операционной системы UNIX Кеном Томпсоном. В свою очередь, язык Би во многом был похож на языке BCPL, разработанный в Кембриджском университете. А язык BCPL основывался на идеях «старого как мир» Алгола-60.

Первым неформальным стандартом языка Си стало издание в 1978 г. книги Брайана Кернигана и Денниса Ритчи с названием «The ‘C’ Programming Language». Первоначально книга была издана в США, но потом была переведена и многократно переиздавалась во многих других странах мира. В 1989 г. язык Си был стандартизован ANSI (American National Standards Institute – американский национальный институт стандартов) и ISO (International Standard Organization — международная организация по стандартизации).

Но время шло и у пользователей языка Си появилась потребность в реализации новых функций, не поддерживавшихся языком. Учитывая все это, Бьерн Страуструп в начале 80-х (работавший все в той же самой Bell Laboratories) принял решение о расширении возможностей языка Си, который первоначально назвали как «Си с классами». Но в дальнейшем за его модификацией языка закрепилось другое название — Си++. Это название сохранилось за ним вплоть до настоящего времени.

Общие сведения о языке C (Си)

В настоящие дни C (Си) является многофункциональным языком программирования высокого уровня, подобным таким языкам как Pascal или Python, но в отличие от них он имеет возможность работы с командами низкого уровня, подобно языку ассемблера. Программу на языке С можно скомпилировать в машинный код практически для любого известного микропроцессора. Не исключением стали и микроконтроллеры – сейчас по популярности использования (особенно для начинающих) язык Си обогнал в них доминировавший до этого язык ассемблера. Программирование на языке С поддерживает и самая популярная в настоящее время программная платформа Atmel Studio (!!!!!!) для микроконтроллеров семейства AVR.

Сейчас уже можно с уверенностью сказать, что язык С стал своеобразным фундаментом, на котором строится все современное программирование – чего стоят хотя бы «Visual C» и «C Sharp». Основанные на нем языки программирования сейчас занимают доминирующее положение в мире программирования. А все началось с удачной структуры языка, разработанной в 1972 г. Деннисом Ритчи.

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

#include <avr/io.h> /* заголовок */

int main(void) /* главная функция: начало программы */

{ /* открывающая скобка в начале программы */

оператор программы;
оператор программы;

оператор программы;

} /* закрывающая скобка в конце программы */

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

Назначение основных элементов программы на языке C (Си)

Заголовки

В представленной на рисунке структуры программы на языке С строка #include <avr/io.h> является заголовком. Заголовки содержат специализированную информацию для компилятора об общих условиях выполнения программы и требуемых ей ресурсах. В рассмотренном случае мы указываем компилятору на то, чтобы при выполнении программы он учел информацию, содержащуюся в файле io.h – забегая вперед скажем что этот файл содержит инструкции для портов ввода/вывода микроконтроллера.

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

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

Функции

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

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

Идущая следом за названием функции фигурная скобка { отмечает начало последовательности операторов, образующих тело функции. Закрывающая фигурная скобка } отмечает конец этой последовательности операторов. На этой скобке выполнение функции завершается.

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

Операторы

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

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

Комментарии

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

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

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

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

/* комментарии к программе /* управления электродвигателем */ */

или

/* комментарии к программе управления */ электродвигателем */

Язык Си для микроконтроллеров AVR поддерживает и другой метод записи комментариев — строка, начинающаяся с символов //. К примеру

// Это комментарий в одну строку

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

  • размещайте один оператор на строке;
  • применяйте пустые строки для «отделения» одной логической части программы от другой;
  • используйте комментарии.

microkontroller.ru

Циклы в языке C и структуры, синтаксис, примеры.

Сразу хочу предложить скачать два полезных документа:
— Хороший букварь по синтаксису языка Си

— Краткая шпаргалка по синтаксису языка Си для микроконтроллеров.

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

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

Цикл For.
В языке C как и в других Си подобных языках, таких как PHP циклы делятся на некоторые типы.

Самый простой цикл for:

  1. for(i=A; i<B; i++)

  2. {

  3. ...

  4. действие при участии переменной "i"

  5. ...

  6. }

Таким образом
A — начальное значение которое будет инкрементировано(присвоено) переменной «i»,
B — конечное значение которое будет инкрементировано переменной «i».
Данный пример показывает цикл от меньшего значения к большему, так же можно сделать уменьшение переменной «i» с каждым шагом, пример:

  1. for(i=A; i<B; i--)

  2. {

  3. ...

  4. действие при участии переменной "i"

  5. ...

  6. }


И так итог:
1. Цикл for имеет четыре аргумента, три из которых указаны в скобках и четвертый указан в теле цикла.
2. Все три аргумента указанные в скобках являются необязательными, то есть каждый из них может в зависимости от задачи присутствовать или отсутствовать.
3. В первую очередь выполняется проверка условия, если условие выполняется, то цикл продвигается на один шаг вперед, если условие не выполняется цикл останавливается.
4. Изменение аргумента, который указан в скобках инициализации цикла выполняется только после выполнения тела цикла.
5. Отсутствие значения принимается как истинное.

Цикл While.
Цикл while выполняется пока один из аргументов существует или пока не достигается определенное значение арифметического сравнения между двумя переменными.
Пример:

  1. #include <io.h>//Библиотека ввода/вывода

  2.  

  3. int A=1, B=5;//Перечисляем переменные и присваиваем им значения

  4.  

  5. int main(void)//основная программа

  6. {

  7. while (A!=B)//логическое отрицание (подр. см. Логические операторы)

  8. {

  9. ...

  10. действие

  11. ...

  12. }

  13. }

Цикл Do While.
В самом названии цикла понятно, что он будет выполнять определенные действия до определенного события.
Пример цикла do while:

  1. do

  2. {

  3. PORTD = 0xFF;//Выдаем на порт D лог. 1-цу.

  4.  

  5. i=i+1;//Прибавляем к переменной "1" единицу

  6. }

  7. while (i<5)//Цикл прекратиться при достижении переменной "1" значения "5"

Памятка:
1. Тело цикла выполняет как минимум 1 раз.
2. Проверка выполнения условия выполняется один раз, после выполнения тела цикла.
3. Если условие не выполняется то есть оно ложное, то тело цикла больше не выполняется.
4. В данном примере последним значением при котором будет выполнятся тело цикла является число «5».

Условный оператор If Else
Структура выглядит:

  1. if(условие)

  2.  

  3. Выполняем действие 1

  4.  

  5. else

  6.  

  7. Выполняем действие 2

Так же возможна следующая структура, которая содержит в себе до «n» процедур сравнения:

  1. if (условие 1)

  2.  

  3. {действие 1};

  4.  

  5. else if (условие 2)

  6.  

  7. {действие 2};

  8.  

  9. else if (условие 3)

  10.  

  11. {действие 3};

  12.  

  13. .....

  14.  

  15. else if (условие n)

  16.  

  17. {действие n};

Памятка:
1. Условный оператор If Else следует использовать, когда необходимо проверить выполнение нескольких условий, но выполнить всего одно действие.
2. Необходимо ставить скобки с обеих сторон условия.

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

  1. switch (выражение)

  2.  

  3. {

  4.  

  5. случай выполнения условия 1

  6.  

  7. случай выполнения условия 2

  8.  

  9. }

Пример кода:

  1. switch (i/10)

  2. {

  3.  

  4. case 0: PORTD = 0x10; // A

  5.  

  6. break;

  7.  

  8. case 1: PORTD = 0x20; // B

  9.  

  10. break;

  11.  

  12. case 2: PORTD = 0x30; // C

  13.  

  14. break;

  15.  

  16. default: PORTD = 0x40; // D

  17.  

  18. break;

  19. }

Памятка:
1. При использовании конструкции выбора switch необходимо использовать только целочисленные значения.
2. Выражение после оператора case должно быть уникальным и не должно дублироваться после другого оператора case с другим номером.
3. Проверка выполнения условия выполняется сверху-вниз. От оператора case 1 до оператора case n.
4. Существует условие по умолчанию default, которое выполняется если ни одно из вышеперечисленных условий не было выполнено.

avrlab.com

AVR для начинающих.Уроки программирования AVR.

Урок 0.

Итак, сегодня мы открываем цикл уроков программирования микроконтроллеров семейства AVR.

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

  1. Что такое микроконтроллер?
  2. Где применяются микроконтроллеры?

Вступление.

Микроконтроллеры везде. В телефонах, стиральных машинах, «умных домах»,станках на заводе а так же ещё в бесчисленном множестве технических устройств. Их повсеместное применение позволяет заменить сложные аналоговые схемы, более сжатыми цифровыми.

Так что же такое, микроконтроллер?

Микроконтроллер (Micro Controller Unit, MCU) — микросхема, предназначенная для управления электронными устройствами.Можно представить его в виде простейшего компьютера, способного взаимодействовать с внешними устройствами.Например, открывать и закрывать транзисторы, получать данные с датчиков температуры, выводить данные на lcd экраны и т. д. . К тому же, микроконтроллер может производить различную обработку входных данных, как и Ваш персональный компьютер.

То есть, микроконтроллеры открывают нам практически безграничные возможности управления какими либо устройствами, благодаря наличию портов I/0(портов ввода(input)/вывода(output)), а так же возможности их программирования.

Где используются микроконтроллеры?

  1. Бытовая техника(Стиральные машины, микроволновые печи и.т.д.).
  2. Мобильная техника(Роботы, робототехнические системы, средства связи и др.).
  3. Промышленное оборудование(Системы управления станками).
  4. Вычислительная техника(Материнские платы,системы управления периферийными устройствами).
  5. Развлекательная техника(Детские игрушки, украшения).
  6. Транспорт(Системы управления двигателем автомобиля, системы безопасности)

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

Начало знакомства с AVR

AVR — семейство микроконтроллеров фирмы Atmel.Обладают достаточной производительностью для большинства любительских устройств. Так же находят широкое применение в промышленности.

Для их программирования используются языки AVR C и AVR Assembler.

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

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

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

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

mkprog.ru