Программирование на Си для микроконтроллеров немного отличается от обычного программирования тем, что приходится работать с битами и оперировать ими, я тут я приведу примеры часто используемых приемов программирования на языке C++ в Atmel Studio.
Представление чисел:
Например десятичное число 15 можно представить так:
0b00001111 — двоичное
017 — восьмеричное
0x0f — шестнадцатеричное
Математические оператры:
Сложение: +
Вычитание: —
Деление: /
Умножение: *
Остаток: %
Логические операции:
Логическое «И» (AND) | Пример: — возвращает истина(единица) в том случае, когда истинны оба условия 1 и 2, в противном случае возвращает ложь(ноль) | |
Логическое «ИЛИ» (OR) | || | Пример: || — возвращает ложь(ноль) в том случае, когда ложны оба условия 1 и 2, в противном случае возвращает истина(единица) |
Логическое «НЕТ» (NOT) | ! | Пример: int k=5; if (!k) <. >Оператор NOT инвертирует условие наоборот, вместо истины(единица) возвратит ложь(ноль) и наоборот. В примере есть переменная которой присвоено число 5, условие if будет выполнятся если переменная k будет равна чему угодно, но только не 5 |
Пишем первый код для ATMEGA32 в Атмел студио и мигаем светодиодом
Побитовые операции:
Отрицание | — | |
Побитовое «И» (AND) | ИЛИ» (OR) | | |
Побитовое «XOR» | ^ | |
Сдвиг битов вправо(эквивалентно делению на 2) | >> | |
Сдвиг битов влево(эквивалентно умножению на 2) |
Управление портами ввода / вывода на микроконтроллерах AVR:
x-номер порта
DDRx (DDRA,DDRB. ) — Регистр направления передачи данных, конфигурирует контакты как вход(1) или выход(0)
PORTx (PORTA,PORTB. ) — Регистр вывода данных
PINx (PINA,PINB. ) — Регистр ввода данных, служит для чтения значения логического уровня на контактах(если они объявлены как вход)
Примеры манипуляций с двоичными числами с помощью логических операторов
Пример: мы хотим включить все контакты PORTB:
PORTB = 255;//в десятичной системе
PORTB = 0xff;//в шестнадцатеричной системе
PORTB = 0b11111111;//в двоичной системе(визуально более понятно какой контакт включен а какой выключен)
Пример: мы хотим установить высокий уровень на 0-3 контактах PORTB, нам нужно 4 младших бита установить в единицу, остальные биты будет с низким уровнем:
PORTB = 15;//в десятичной системе(трудно понятно, но коротко)
PORTB = 0xf;//в шестнадцатеричной системе(трудно понятно, но еще короче если большое число)
PORTB = 0b00001111;//в двоичной системе(визуально более понятно какой контакт включен а какой выключен)
Установление отдельных битов в единицу ,не затрагивая другие биты
Пример: PORTB = 0b00000010, необходимо на 4 контакт(всего битов 8, отсчет начинается с 0..7) PORTB установить высокий уровень, не изменяя при этом другие контакты, т.е. нужно чтобы в итоге остался высокий уровень на 2 и 4 контактах:
Программирование микроконтроллеров: с чего начать и что изучать
PORTB = 0b00000010; //Присвоим начальное значение 2-й бит = 1
PORTB = PORTB|0b00001000; //Присвоим 4-му биту единицу или подадим высокий уровень на контакт №4
или тоже самое но кратко:
PORTB |= 0b00001000; //Присвоим 4-му биту единицу или подадим высокий уровень на контакт №4
Установление отдельных битов в ноль, не затрагивая другие биты
Пример: PORTB = 0b11111101, необходимо на 4-й контакт PORTB установить низкий уровень, не изменяя при этом другие биты, т.е. нужно чтобы в итоге остался низкий уровень на 2 и 4 контактах:
PORTB = 0b11111101; //Присвоим начальное значение 2-й бит = 0, остальные биты с высоким уровнем
PORTB = PORTB //Присвоим 4-му биту единицу или подадим высокий уровень на контакт №4
или тоже самое но по другому:
PORTB = PORTB //Присвоим 4-му биту единицу или подадим высокий уровень на контакт №4
или тоже самое но кратко:
PORTB //Присвоим 4-му биту единицу или подадим высокий уровень на контакт №4
PORTB //Присвоим 4-му биту единицу или подадим высокий уровень на контакт №4
Изменение отдельных битов на противоположное значение 1->0 или 0->1, не затрагивая другие биты
Пример: PORTB = 0b00000010, необходимо на 2 контакт PORTB установить низкий уровень, а потом высокий и т.д.:
PORTB ^= 0b00000010; //Результат: PORTB = 0b00000000, т.к. PORTB был равен 0b00000010
PORTB ^= 0b00000010; //Результат: PORTB = 0b00000010, т.к. PORTB был равен 0b00000000
PORTB ^= 0b00000010; //Результат: PORTB = 0b00000000, т.к. PORTB был равен 0b00000010
PORTB ^= 0b00000010; //Результат: PORTB = 0b00000010, т.к. PORTB был равен 0b00000000
и т.д., т.е. при каждом выполнении этой команды «PORTB ^= 0b00000010», изменяется только второй бит на противоположное значение, так можно сделать например мигание светодиодом.
Другие манипуляции с битами, каждое выражение не зависит от предыдущего, просто как примеры и результат этого выражения
PORTB = 0; //Результат: PORTB = 0b00000000, обнуляем
PORTB = 255; //Результат: PORTB = 0b11111111, установим все биты в единицу
PORTB = 0xff; //Результат: PORTB = 0b11111111, установим все биты в единицу
Нам нужен бесконечный цикл. Помещаем наши строчки PORTC = 0; __delay_cycles(4000000); PORTC = 255; __delay_cycles(4000000); внутрь бесконечного цикла, и вот что в итоге должно получиться: //первая прога на Си для AVR #include #include int main(void) < DDRC = 255; while(1)< PORTC = 0; __delay_cycles(4000000); PORTC = 255; __delay_cycles(4000000); > return 0; > Если у вас другой результат – пройдитесь снова по тексту.
Может, я что-то полохо объяснил, может, вы что-то плохо поняли. Кликаем Make на панели с кнопками (можно нажать F7). Если все сделано правильно, IAR откомпилирует и соберет проект, а внизу откроется окно Messages, в котором будет написано: ….. Total number of errors: 0 Total number of warnings: 1 Все прошло без ошибок, но компилер выдал warning — statement is unreachable.
Ничего страшного – он просто сообщает нам, что функция main() никогда не возвратит значение. Просто у нас в программе бесконечный цикл и микроконтроллер при работе никогда не дойдет до строчки return 0. Ищем папку проекта на жестком диске. Там, в директории Release лежит файл прошивки led.hex. Грузим в микроконтроллер. Светодиод заморгал?
Отлично. А теперь легко проверить правильно ли работает наша программа. Берем механические часы и смотрим, моргает ли светодиод в такт с секундной стрелкой. У меня моргает, а у вас?
Источник: studfile.net
Применение языка Си для разработки программ микроконтроллерных систем. Интегрированная среда mikroC PRO для PIC-микроконтроллеров
На заре возникновения микропроцессоров, а затем и микроконтроллеров разработка программного обеспечения происходила исключительно на том или ином языке Ассемблера, ориентированного на конкретный тип МП или МК. По сути такие языки представляют собой символьные мнемоники соответствующих машинных кодов, а перевод мнемоники в машинный код выполняется программой-транслятором. Главный недостаток языков Ассемблера является то, что каждый из них привязан к конкретному типу МК и логике его работы. Кроме того, Ассемблер сложен в освоении, что требует достаточно больших усилий в его изучении. Однако они оказываются потраченными впустую, если впоследствии потребуется перейти на использование микроконтроллеров других производителей.
Язык Си, являясь языком высокого уровня, лишен подобных недостатков и может использоваться для программирования любого МК, для которого есть компилятор с языка Си.
Язык Си — это универсальный язык программирования, который обеспечивает эффективность программного кода, имеет элементы структурного программирования и богатый набор операторов. Использование языка Си имеет следующие преимущества над программированием на Ассемблере.
1. Глубокого знания системы команд не требуется. Элементарное знание архитектуры конкретного МК желательно.
2. Лучшая читаемость программы. Используются слова и выражения, которые более свойственны человеческой мысли.
3. Библиотечные файлы содержат много стандартных подпрограмм, которые могут быть включены в основную программу.
4. Изучив язык Си, можно легко переходить от одного семейства МК к другому, тратя гораздо меньше времени на разработку программ.
В настоящее время документация языка Си закреплена в международном стандарте ANSI C.
Рассмотрим основные особенности программы на языке Си для микроконтроллеров. В качестве микроконтроллера выберем PIC16F84A с двумя портами ввода/вывода: PORTA и PORTB. Программа будет просто увеличивать число на 1 и выводить его в порт В.
primer1.c – пример программы на Си для PIC16F84A
char counter; // переменная counter –однобайтное целое число
void main(void) // здесь начинается главная программа
PORTB = 0; // очистить регистр данных порта В
TRISB = 0; // настроить все линии порта В на вывод
counter = 1; // инициализировать counter значением 1
while(1) // бесконечный цикл повторения
PORTB = counter; // поместить значение counter в порт В
counter = counter + 1; // увеличить counter
Рассмотрим основные составляющие программы на языке Си.
Комментарии. Это некоторый поясняющий текст, который при компиляции не учитывается. Комментарии бывают двух видов:
• многострочные (начинаются с комбинации символов /* и заканчиваются символами */ );
• однострочные (начинаются с комбинации символов // до конца строки).
Объявления переменных. Строка программы char counter; объявляет переменную counter как однобайтное целое число. Компилятор по этой информации выделит для переменной counter одну ячейку в памяти данных (один регистр из области РОН).
Функция main. Программы на Си оформляются как функции. Каждая программа должна содержать, по крайней мере, одну функцию, называемую главной (по-английски main). Выполнение программы всегда начинается с главной функции, и программа находится внутри нее. В общем случае в функцию могут передаваться аргументы (параметры), функция может возвращать результат.
Главной особенностью программ на Си для микроконтроллеров является то, что в главную функцию main не передается никаких параметров и она не возвращает результата. Это обстоятельство указывается специальным словом void (пустой). Таким образом, формат главной функции всегда такой
Для создания программного обеспечения микроконтроллерных систем широко используются средства вычислительной техники, в том числе персональные компьютеры, позволяющие разработчику выполнить весь цикл проектирования, включая отладку целевой программы.
В настоящее время самым мощным средством разработки программного обеспечения для микроконтроллеров являются интегрированные среды разработки (IDE – Integrated Development Environment), имеющие в своем составе текстовый редактор, компилятор языков высокого уровня типа Паскаль или Си, отладчик-симулятор, а также библиотеки готовых функций.
Одним из таких программных инструментов является среда разработки mikroC PRO компании MikroElektronika. Данная среда разработки позволяет быстро создавать эффективные программы на распространенном языке высокого уровня Си. Среда имеет удобный интерфейс пользователя со встроенным редактором текста и мощным отладчиком программ.
Встроенный мастер проектов позволяет в считанные минуты создать заготовку рабочей программы для любого микроконтроллера из целого семейства. Библиотека готовых функций обеспечивает программиста поддержкой для быстрого и безошибочного создания программы. Компания MikroElektronika создала среду разработки mikroC PRO для таких популярных и известных микроконтроллеров, как семейство PIC компании Microchip, AVR компании Atmel и семейство MCS-51.
Для PIC-микроконтроллеров компания MikroElektronika разработала интегрированную среду под названием mikroC PRO for PIC. С сайта www.mikroe.com компании можно бесплатно скачать демонстрационную версию среды mikroC PRO for PIC версии v.6.0.0, которая позволяет создавать программы с объемом исполняемого кода до 2 Кбайт.
Разработка программного обеспечения при использовании mikroC PRO состоит из следующих основных этапов.
1. Создание проекта.
2. Создание исходных файлов на языке mikroC.
3. Построение проекта.
4. Тестирование программы и ее отладка.
Среда mikroC PRO организует программное обеспечение в виде проектов, состоящих из одного файла проекта (файл с расширением .mcppi) и одного или нескольких исходных файлов на языке mikroC (файлов с расширением .c). Исходные файлы могут компилироваться только в том случае, если они включены в проект.
Файл проекта содержит:
· тактовую частоту его работы;
· слово конфигурации микроконтроллера;
· список исходных файлов для проекта;
· другие (вспомогательные) файлы.
Источник: megaobuchalka.ru