Главная Готовые проекты Теория О сайте
1. Введение

Hi-Tech PICC (http://htsoft.com) - полнофункциональный компилятор языка программирования C для микроконтроллеров фирмы Microchip, а именно для PIC10xxxx, PIC12xxxx, PIC16xxxx, PIC17xxxx.

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

movf    A, w
  addwf    B
  movwf    PORTB

А на C вот так: PORTB = A+B;

Как видно, на C код получается более наглядным, не говоря уже о сложных условных переходах, циклах, арифметических вычислениях. Это, конечно, не значит, что можно полностью отказаться от ассемблера, однако во многих случаях, размер и быстродействие создаваемого компилятором кода вполне удовлетворительные. К тому же, имеется возможность вставлять в программу asm текст, например для процедур ввода-вывода. Кроме того, программа, написанная на C, может быть легко перенесена на другой тип контроллера, например на PIC18, Atmel AVR и т.д.

2. Установка

Для работы с компилятором лучше сначала установить интегрированную среду разработки MPLAB (скачать можно с http://www.microchip.com), в которой содержится редактор исходного кода, симулятор, отладчик. Можно, конечно, и не устанавливать MPLAB, но имеющийся в составе PICC "DOS'овский" текстовый редактор очень не удобен.

После того, как установили MPLAB, запустите файл инсталляции (скачать, ~7 Мб, версия 8.05PL1) и следуйте инструкциям на экране. На вопрос "Would you like to install the MPLAB 6 PICC Toolsuite Plugin?" нажмите "Да". Теперь можно приступить к созданию первой программы.

3. Первая программа на C

Запускаем MPLAB. Вызываем мастер создания проектов (щёлкаем Project->Project Wizard...).

Нажимаем Далее и выбираем тип микроконтроллера. В нашем случае это PIC16F628A. Снова жмём далее. Здесь выбираем Active Toolsuite : HI-TECH PICC Toolsuite и переходим к следующему шагу.

В поле Project Name вводим имя будущего проекта, например led_pic, и указываем папку, которой будут храниться его файлы. Если указанной папки не существует, то будет предложено её создать.

Нажимаем Далее, пропускаем очередной шаг и жмём Готово.

Создадим текстовый файл с исходным кодом (File->New). Напишем простенькую программку для мигания светодиодом:


#include	"pic.h"

#define bitset(var,bitno) ((var) |= 1 << (bitno)) 
#define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))

main() {
	unsigned int k;
	CMCON = 0x07;		//компараторы выключены
	TRISA = 0b11111110;	//RA0 выход
repeat:
	for (k=0; k<45000; k++);//"пустой" цикл для временной задержки
	bitset(PORTA, 0);	//выставить на RA0 высокий уровень
	for (k=0; k<45000; k++);
	bitclr(PORTA, 0);	//выставить на RA0 низкий уровень
	goto repeat;	//повторить ещё раз
	}

Сохраним файл (File->Save As) в папке, которую указали при создании проекта. Добавим программу к проекту (Project->Add Files to Project...) и нажмём кнопку Build All. Исходный код скомпилируется и в папке проекта появится HEX файл, который можно записать в контроллер и посмотреть, как это работает. Скачать проект.

4. Разбираем первую программу по строкам.

Первая строка #include "pic.h". Определяет включаемые в программу файлы. В данном случае pic.h содержит информацию о микроконтроллере(адреса регистров и т. д.). Имя этого файла одинаково для всех кристаллов, компилятор автоматически выбирает нужные данные в зависимости от типа контроллера(который мы указали при создании проекта. Чтобы его изменить щёлкните Configure->Select Device... из главного меню). Во вложенных файлах могут содержаться подпрограммы, функции, константы. К примеру, для использования функции printf, которая будет рассмотрена позже, необходимо подключить stdio.h.

#define служит для объявления так называемых макросов. Например, bitset(PORTB, 1) будет заменено на PORTB |= 1 << 1.

Далее следует предопределённое имя функции main(), выполнение которой начинается после подачи питания. Сам текст её заключён в фигурные скобки и начинается с объявления переменных. Сначала указывается тип переменной, определяющий возможные значения, которые она может принимать и, соответственно, занимаемое ей место в памяти, затем имя переменной. В PICC доступны следующие типы данных:

Тип Размер в битах Арифметический тип Принимаемые значения
bit 1 булев 0..1
char 8 целое со знаком или без знака -128..+127 или 0..255*
unsigned char 8 целое без знака 0..255
short 16 целое со знаком -32768..+32767
unsigned short 16 целое без знака 0..65535
int 16 целое со знаком -32767..+32767
unsigned int 16 целое без знака 0..65535
long 32 целое со знаком -2147483648..+2147483647
unsigned long 32 целое без знака 0..4294967295
float 24 действительное 8.9 x 10^-44 .. 3.4 x 10^38
double 24 или 32** действительное 1.5 x 10^-45 .. 3.4 x 10^38**

Примечания:

* По умолчанию тип char без знака и со знаком, если используется опция компилятора PICC -SIGNED_CHAR.

** Тип double по умолчанию имеет точность 24 бита, чтобы использовать 32-х битную точность, нужно включить опцию компилятора PICC -D32.

Запись значений в регистры микроконтроллера осуществляется так же, как для переменных: имя_регистра = значение. Название и назначение регистров смотрите в datasheet на соответствующий МК (www.microchip.com, www.microchip.ru - на русском, но не на все контроллеры).

Для удобства, значения, присваеваемые переменным, можно записывать, помимо десятичного, в двоичном, восьмеричном, шестнадцатеричном виде:

Число Формат Пример
Двоичное 0bчисло или 0Bчисло a = 0b10010100;
Восьмеричное 0число b = 0224;
Десятичное число c = 148;
Шестнадцатеричное 0xчисло или 0Xчисло d = 0x94;

repeat: имя метки для оператора безусловного перехода goto.

for - оператор цикла. В скобках указывается начальное значение переменной (если их несколько, то они перечисляются через запятую); условие, при котором будет продолжаться цикл (если более одного условия, они также перечисляются через запятую); операторы, выполняющиеся перед проверкой условия, т. е. после того, как выражение, находящееся в фигурных скобках будет выполнено. В данной программе это оператор увеличения значения переменной на 1: ++.

При помощи макросов bitset и bitclr осуществляется установка - очистка бита регистра-защёлки порта микроконтроллера (установка на выходе лог. 1 или 0). Логические операции, обозначенные в макросе, интерпретируются компилятором, как ассемблерные команды bsf и bcf.

5. Вставка ассемлерного кода в программу.

Делается это при помощи служебных слов asm("command"); если команда одна. Если их несколько, то они записываются между словами #asm и #endasm:

if (PORTA == 0b00001111) asm("sleep"); else asm("nop");

...

a = 180;

while (--a) {

PORTB = a;

#asm

movlw 45

movwf _z

btfss _PORTA, 4

movlw 90

movwf _x

#endasm

PORTC = x;

PORTD = z;

}

Переменные, указываемые в ассемлерном коде должны быть глобальными (описанными вне процедур) и начинаться с символа "_".

Собственно программированию на C для ПК посвящено много книг, с помощью которых вы можете ознакомиться с программированием на этом языке, поскольку компилятор PICC соответствует стандарту ANSI C (исключение - не поддерживается рекурсия). Например, книга "Язык С" Б.В. Керниган, Д.М. Ричи. Скачать электронную версию.

12 февраля 2005 г.

Copyright 2004 by ICdevelop Group®.

Hosted by uCoz