Интернет-магазин

Просмотр корзины
В корзине:

товаров - 0 шт.



§ 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



© KERNELCHIP 2006 - 2017