§ 44. Пишем первую программу на Си для МК PIC16F877
|
Иванов Дмитрий, Апрель 2007
|
Статья обновлена 26 Мая 2014
|
|
Теперь, наконец-то займемся делом после устанровок программ. Пора написать первую простенькую программу для микроконтроллера. Пережде чем мы начнем ее писать, надо поговорить о том, а какой МК мы будем использовать....
|
Я могу предложить хорошо зарекомендовавший себя МК PIC16F877. Он включает в себя практически все мыслимые и немыслимые интерфейсы и технологии (за исключением, пожалуй, только USB) и очень неплох по рабочим характеристикам:
- тактовая частота - 20 МГц
- 4 полноценных 8-ми битных порта ввода/вывода
- последовательный и паралельный порт
- шина I2C
- несколько таймеров
- модули сравнения, компараторы
- модуль широтно-импульсной модуляции (ШИМ)
- 10-ти разрядный АЦП
МК этот широко распространенный и в розничной продаже встречается часто. Если Вы в г.Москве, то Вам дорога в "Чип и Дип" - там его можно приобрести примерно за 350 руб. Настоятельно рекомендую покупать его в DIP корпусе (широком), благо такой есть. Для начальных опытов и проверок это самый лучший вариант. Если Вы вдруг приобретете его в корпусе PLCC, то будет целая куча проблем с его использованием - шаг плоских выводов в 1.27 мм не самый удобный вариант.

Итак, с МК определились. В файлах к этой статье можно найти полный справочник по этому МК. Что покупать теперь понятно, но пока дайвайте все же напишем программу, что бы было понятно что с ней дальше делать и как ее "зашить" в этот МК.
Запускаем программу MPLAB (которую установили в прошлых статьях). Выбираем пункт меню Project -> Project Wizard. В открывшемся окне нажимаем Далее.

В выпавшем списке доступных МК выбираем PIC16F877. Нажимаем Далее.

Здесь надо выбрать компилятор, который будет обрабатывать код нашей программы. Обязательно надо выбрать пункт HI-TECH PICC Toolsuite в выпадающем списке Active Toolsuite. Это тот самый компилятор языка Си, который мы установили в прошлой стаье. Нажимаем Далее.

Задайте имя проекта, например, TestPIC и укажите директорию проекта. Тут есть две хитрости. Первое, MPLAB не создают сам отдельную папку для проекта и разместит все файлы прямо в той директории которую Вы указали. Второе и пожалуй, самое главное - MPLAB не понимает русских букв в названии пути. Проект то он создаст, но во время работы программы, особенно при сохранении и открытии файлов, возникнут такие "глюки" что долго будете голову ломать в чем дело. Поэтому, в пути к папке проекта не должны попадаться русские названия. Нажимаем Далее.

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

Тут я думаю все понятно. Нажимаем Готово.

Заготовку проекта сделали, но он пока пустой. Нажимаем File -> New. Появится новое окно с заголовком Untitled. Далее выбираем File -> Save As.... Укажите имя файла, например, TestPIC.c и перейдите в папку проекта. Обязательно поставьте галочку Add File to Project.

Теперь помещаем ниже следующий код в открытое окно файла проекта TestPIC.c (весь проект целиком можно найти в файлах к этой статье).
#include <pic.h>
__CONFIG(0x03F72);
int i=0;
void main(void)
{
T0IE=0;
GIE=0;
TRISB=0;
PORTB=0;
while(1==1)
{
PORTB++;
for(i=0; i<10000; i++)
{
i++;
i--;
}
}
}

Наверное Вам интересно, что будет результатом работы этого кода. Будет происходить следующее: к МК подключаются 8 светодиодов. При включении питания, светодиоды начнут мигать в виде "волны" (это лучше видеть, благо осталось нет так уж и много). Рассмотрим поподробнее сам код.
Вначале идет думаю всем знакомый оператор include, который подключает заголовочный файл со всеми неоходимыми макроопределениями. Далее идет еще одна директива препроцессора __CONFIG, в которую предается 16-ти ричное число, характерезующие набор специальных опций и свойств, характерезующих работу МК. Мы еще в ходе этой статьи вернемся к этому моменту. Переходим сразу к началу функции main() - точки входа в собственно сам исполняемый код программы. Далее следует операция с каким-то T0IE. Конктерно эта строчка означает, что необходимо запретить прерывания от таймера при работе МК. TOIE - это определенный с помощью #define в файле pic.h адрес специального регистра, отвечающего за эту операцию (и вообще, если видете в коде странные до этого в коде не определенные переменные записанные в верхнем регистре, то это наверняка символические имена регистров МК). Строчка GIE=0; - запрещает обработку любых прерываний глобально во всем МК. Прерывания для нашего простого примера мы использовать не будем, т.к. они нам просто не нужны.
TRISB=0; - означает, что порт ввода/вывода B МК PIC16F877 будет работать на выход, т.е. к нему можно теперь подключать нагрузку, на которой можно подвать из МК 0 или +5В (этой нагрузкой будут светодиоды). В следующей строке мы помещаем в порт B число 0 - т.е. на всех выводах этого порта, настроенного на выход, будет нулевое напряжение. Далее идет конструкция из оператора while, причем с таким параметром, что некоторые программисты, привыкшие писать на Си для ПК будут слегка удивлены - так ведь это, мол, бесконечный цикл, программа зависнет. Но нам именно этого и надо. МК не может ни чего не делать, он должен постоянно что-то выпонять. Поэтому, для МК работа программы в бесконечном цикле это жизненная необходимость. Затем идет оператор увелечения на 1 числа находящегося в порту B. Немного поясним. Если написать PORTB=0xFF; - то на всех выводах порта будет 1. Если PORTB=0x0; - на всех 0. (я думаю, это должно быть понятно). Конструкция из оператора цикла for, как видно, не делает какой-либо "умной" работы не делает и нужна только для организации временной задержки. Если этот участок кода убрать, то мы просто не будем замечать как меняется напряжение на светодиодах (будет очень быстро).
В кратце код разобрали, двигаемся дальше. Вернемся к директиве __CONFIG. Откройте Configure -> Configuration Bits.... Вот тут как раз надо установить для проекта значения этих самых опций. Установите их так как на фото ниже.

Что они означают? Давайте по порядку.
- Oscillator - HS (означает, что в качестве тактового генератора будет использовавытся высокочастотный кварцевый резонатор)
- WatchDog Timer - Off (спец опция, если она включена, то микроконтроллер будет переодически сбрасываться [переходить на начало main()] во избежание каких-либо зависаний в МК. Нам такая возможность не нужна.)
- Power Up Timer - On (если On, то МК будет находится в состоянии сброса, пока напряжение питания не достигнет необходимого порогового уровня)
- Brown Out Detect - On (сбрасывает МК, если произошло падение питающего напряжения ниже определенного уровня)
- Low Voltage Program - Disabled (в этом случае запрещаем использовать низковольтное внутрисхемное прогрпаммирование МК, т.к. будем пользоваться обычным программаторм [см. следующие статьи])
- Flash Program Write - Enabled (допускаем возможность записи во Flash память программ)
- Data EE Read Protect - Off (разрешаем чтение данных и EEPROM памяти МК)
- Code Protect - Off (отключаем защиту кода в МК. Если On то невозможно будет считать программу из МК. Нужно если Вы хотите защитить свою программу от попыток взлома. Нам пока такая возможность не нужна.)
Пора откомпилировать код. Запустите Project -> Build All. При этом начнется компиляция проекта и появится вот такое окно с чудной записью в конце BUILD SUCCEEDED.

Теперь, если Вы посмотрите в папку нашего проекта, то должны увидеть там файл TestPIC.hex - итог всех наших трудов. В нем содержится специальный код, сформированный из наших писаний на Си, для загрузки в память МК. Чтобы двигаться дальше нам нужен программатор, с помощью которого мы запишем в МК нашу программу. Пора перейти к следующей статье, где как раз и рассматривается вопрос изготовления собственного программатора.
© Иванов Дмитрий
Апрель 2007
http://www.kernelchip.ru