Ремонт принтеров, сканнеров, факсов и остальной офисной техники


назад Оглавление вперед




[1]

#include <pic.h>

Компилятор сам загрузит файл заголовка, предназначенный для указанного в проекте контроллера. Поддержка процессора заключается в назначении семантических имен служебным регистрам, отдельным битам и описании сервисных макросов. Для контроллеров, оснащенных ЭСПЗУ, предоставляются макросы для чтения и записи ЭСПЗУ:

EEPROM WRITE( <адрес> , <значение> ); Запись байта <переменная> = EEPROM READ( <адрес> ); Чтение байта

Для удобства программиста константа EEPROMSIZE содержит полный размер ЭСПЗУ. Если контроллер позволяет писать и читать память программ, то облегчат эту задачу следующие макросы:

FLASH WRITE( <адрес> , <значение> ); Запись байта <переменная> = FLASH READ( <адрес> ); Чтение байта

Настроить параметры контроллера при его программировании поможет макрос:

I CONFIG( x );

Где "х" - слово конфигурации контроллера. Допустим нам необходимо запретить сторожевой таймер, отключить защиту кода и данных и настроить контроллер на работу с генератором типа XT. Для этого нам придется записать одну очень наглядную строчку:

I CONFIG( WDTDIS & XT & UNPROTECT);

Однако следует помнить, что этот макрос должен выполняться в начале программы, но после директивы #include <pic.h>, так как именно эта директива подгружает файл заголовка, содержащий описание конфигурационных констант для данного контроллера.

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

I IDLOC( x );

Иногда возникает необходимость непосредственно при прошивке контроллера заполнить имеющееся ЭСПЗУ или его часть, если оно вообще есть, некоторыми данными, например таблицей, описывающей какую-то сложную зависимость. Сделать это не просто, а очень просто! Достаточно записать следующий код:

I EEPROM DATA (0,1,2,3,4,5,6,7);

Этот макрос ожидает 8 параметров, которые он последовательно размещает в ЭСПЗУ. Каждое значения должно быть типа байт. Рекомендуется размещать этот макрос за пределами описания функций. Но программист должен отдавать себе отчет в том, что эти данные будут занесены в ЭСПЗУ не во время выполнения (запуска) программы, а при прошивке. То есть, если в случае несчастного случая или взрывов на солнце (магнитных бурь) будет поврежден или изменен участок ЭСПЗУ, то предсказать поведение программы, да и всего устройства будет сложно... А вот для оперативного доступа к этой памяти непосредственно из программы следует использовать описанные выше макросы EEPROM WRITE() и EEPROM READ().

Отдельно хочется остановиться на операциях с битами, так как использовать их приходится очень часто при программировании на языке ассемблера. При решении этой проблемы компилятор PICC проявляет завидную догадливость. Собственно при анализе С -кода он автоматически определяет где можно задействовать битовые операции ассемблера. Вот небольшой пример:

a =0x40;

после компиляции будет получен следующий код:

bsf a,6

Для особого удобства рекомендуется самостоятельно определить два чертовски полезных макроса:

#define bitset (var,bitno) ((var) = 1<< (bitno))


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

Тогда можно будет записывать выражения типа: bitset(a,6);

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

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


2 Простые типы данных и переменные

2.1 Поддерживаемые типы данных

Компилятор PICC поддерживает базовые типы данных размером в 1, 2, 4 байта. При размещении многобайтовых значений используется формат известный как little endian, то есть наименее значащий байт размещается первым. Таким образом значение размером в слово будет размещено таки образом, что наименее значащий байт окажется в ячейке памяти с меньшим адресом. Аналогично размещаются и значения размером в двойное слово. В таблице 2 приведено описание основных типов данных, которые поддерживает компилятор.

Таблица 2 Типы данных

Размер Арифметический тип

bit char

unsigned char short

1 Булевый тип 8 Целое со знаком или без 8 Целое без знака 16 Целое со знаком

unsigned short int

16 Целое без знака 16 Целое со знаком

unsigned int long

16 Целое без знака 32 Целое со знаком

unsigned long float

32 Целое без знака

24 Действительное число

24 или 32 Действительное число

2.2 Форма записи литералов

PICC поддерживает формат записи литералов в соответствии со стандартом ANSI. Практика показывает, что при программировании микроконтроллеров, часто возникает необходимость записывать литералы в двоичном формате. И, хотя в стандарте такая возможность отсутствует, ее добавили в PICC. При записи двоичных и шестнадцатиричных литералов можно использовать как заглавные, так и строчные буквы (см. Табл. 3).

Таблица 3 Форма записи литералов

Литерал

Двоичный Восьмеричный Десятичный Шестнадцатиричный

ФорматПример

0Ь<число> или 0В<число> 0b10011001 0<число>0345

<число>129

0х<число> или 0Х<число> 0x2F

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



[стр.Начало] [стр.1] [стр.2] [стр.3] [стр.4] [стр.5] [стр.6] [стр.7]