Очевидно, что последний вариант более предпочтителен. Может показаться, что сделанные нами изменения носят исключительно косметический характер. Однако более ясный текст снижает вероятность возникновения ошибок, а также облегчает отладку и внесение последующих изменений в программу. В реальных программах, в отличие от приведенного фрагмента кода, используется множество разнообразных переменных и битов регистров, поэтому они должны быть ясными и понятными.
Четыре первые строки приведенного фрагмента показывают один из способов, посредством которого программист может сообщить транслятору с языка ассемблера о необходимости подстановки вместо символьного имени числового значения. В частности, строка
STATUS equ 03
говорит о том, что при использовании в качестве операнда имени STATUS оно должно заменяться числом 3 (т. е. регистр h’03’). Директива equ является сокращением от «EQUivalent to»[77]. Директивой называется псевдокоманда, которая, как правило, не генерирует реальный машинный код, а используется для передачи информации транслятору. Начиная с этого момента, мы будем для ясности присваивать нашим регистрам и битам имена.
В качестве примера напишем код, который формирует на выводе RB7 положительный импульс (предполагается, что ЦПУ работает с 0-м банком):
bsf PORTB,7; Выставляем на RB7 ВЫСОКИЙ уровень (устанавливаем 7-й бит)
bcf PORTB,7; Выставляем на RB7 НИЗКИЙ уровень (сбрасываем 7-й бит)
С параллельными портами ввода/вывода связаны следующие регистры:
∙ PORTA (h’05’)
В этом регистре задействовано только 5 младших битов, подключенных к выводам RA4…RA0 микроконтроллера. Вывод RA4 используется также модулем Таймера 0. Фантомные три старших бита читаются как 0. В некоторых моделях семейства, например в PIC16F628, могут быть реализованы все 8 линий порта А.
∙ TRISA (h’85’)
Этот регистр предназначен для конфигурирования линий порта А в качестве входов или выходов. Установка бита TRISA[n] в 1 делает вывод RA[n] входом, а сброс в 0 — выходом[78]. При любом сбросе все биты регистра TRISA устанавливаются в 1, и все выводы порта соответственно становятся входами.
∙ PORTB (h’06’)
Двунаправленный 8-битный порт ввода/вывода, подключенный к выводам RB0…RB7 микроконтроллера. Вывод RB0 может использоваться также в качестве входа аппаратного прерывания.
∙ TRISB (h’86’)
Этот регистр используется для конфигурирования линий порта В в качестве входов или выходов. Более подробно — см. описание регистра TRISA.
EEPROM-память данных
В большинстве моделей среднего и старшего семейства имеется блок памяти объемом до 256 (в PIC16F84 — 64) байт, для хранения содержимого которого не требуется питания. Эта энергонезависимая память не является частью (энергозависимой) памяти данных, а обращения к ней производятся посредством определенных РСН, как к обычному периферийному устройству. Любой байт этой памяти можно считать или записать посредством регистра EEDATA. Адрес байта задается регистром EEADR, а управление процессом чтения/записи осуществляется с помощью регистров EECON1 и EECON2. Срок службы большинства модулей EEPROM составляет не менее 10 млн циклов перезаписи, а период сохранности данных — не менее 40 лет. Типичными примерами использования энергонезависимой памяти является хранение количества страниц, отпечатанных лазерным принтером, или суммарный путь, пройденный автомобилем.
Подробно процессы чтения и записи EEPROM будут рассмотрены в главе 15, здесь же мы просто приведем последовательность действий для выполнения операций чтения/записи.
Чтение
1. Поместить адрес (h’00….h,FF’) в EEADR.
2. Установить бит RD (0-й бит регистра EECON1) в 1 для переключения в режим чтения.
3. Считать адресованные данные из EEDATA.
Запись
1. Поместить адрес в EEADR.
2. Поместить данные в EEDATA.
3. Установить бит WREN (2-й бит регистра EECON1) в 1 для переключения в режим записи.
4. Записать число h’55’ в EECON2.
5. Записать число h’AA’ в EECON2.
6. Начать цикл записи установкой бита WR (1-й бит регистра EECON1) в 1. Операция записи, которая, как правило, является достаточно редким событием, специально сделана такой запутанной, чтобы исключить случайное изменение EEPROM. На самом деле регистра EECON2 не существует, однако последовательная запись по его адресу значений Ь’55’и h’AA’ необходима для разблокирования EEPROM. Прерывания могут нарушить эту последовательность, поэтому, если они используются, их следует запретить. Длительность операции записи составляет около 50 мс, после ее завершения устанавливается 4-й бит регистра EECON1 (флаг EEIF), который может использоваться для прерывания работы процессора. Флаг WRERR (3-й бит регистра EECON1) устанавливается, если цикл записи был прерван, скажем, в результате внешнего сброса.
78
Простой мнемотехнический прием для знающих английский: 0 — Output (выход), а 1 — Input (вход)