Функции формирования временных задержек в языке С18
рассмотрим, как на Си получить временную задержку, которая позволит формировать управляющие сигналы с различными временными параметрами.
Допустим, что в схеме МКУ надо получить мигающий режим работы VD1. Чтобы мигание светодиода было хорошо видно, примем частоту смены данных на RC0 около 1 Гц. Задержку организуем с помощью программного цикла for, который будет выполняться определенное число раз. Время выполнения этого цикла и будет определять задержку. Программа может иметь следующий вид.
void delay(void) // функция временной задержки
{
unsigned int i; // переменная цикла – двухбайтное целое беззнаковое число
for(i = 0; i < 50000; i++)
;
}
void main(void)
{
PORTC = 0;
TRISC = 0;
while( 1 )
{
PORTCbits.RC0 = 1;
delay( );
PORTCbits.RC0 = 0;
delay( );
}
}
Определить величину временной задержки, реализуемой функцией delay можно лишь приблизительно следующим образом. Время выполнения команды в PIC18 занимает 1 машинный (командный) цикл TCY , который определяется частотой тактового генератора МК следующим образом:
TCY = 4/FOSC .
При частоте FOSC, равной 4 Мгц длительность машинного цикла будет TCY = 1 мкс.
При реализации цикла for выполняется 50000 раз инкремент переменной i и столько же раз ее проверка на равенство числу 50000. Так что примерное время задержки составит 100000 мкс или 0,1 с.
В компиляторе C18 имеются библиотечные функции задержки, которые позволяют реализовать временные задержки с большой точностью. Для нашего случая можно выбрать функцию Delay10KTCYx(n), которая позволяет получить задержку, кратную 10000 машинных циклов TCY.
Если надо получить задержку на 0,5 с, т.е. 500000 мкс, то при частоте 4 Мгц и TCY = 1 мкс надо в функцию записать число n, равное 500000 / 10000 = 50. Таким образом, окончательно функция задержки будет иметь вид:
Delay10KTCYx(50).
Так как функции задержки находятся в библиотеках С18, то необходимо их подключить с помощью заголовочного файла delays.h. Текст программы управления светодиодом с частотой мигания 1 Гц может иметь вид:
void main(void)
{
PORTC = 0;
TRISC = 0;
while ( 1 )
{
PORTCbits.RC0 = 1; // включить VD1
Delay10KTCYx(50); // задержка на 0,5 с
PORTCbits.RC0 = 0; // выключить VD1
Delay10KTCYx(50); // задержка на 0,с
}
}
15. Программирование на языке С18 типовых функций управления и контроля: вывод информации в порт, управление отдельными разрядами портов, опрос переключателя.
Для рассмотрения примеров программирования типовых функций управления будем использовать микроконтроллер PIC18F242, который имеет три порта ввода/вывода (PORTA, PORTB, PORTC). Принципиальная схема МКУ приведена на рисунке.
Рассмотрим пример программы, которая после включения питания выводит высокие уровни (логические 1) на линии RC0-RC3 и низкие уровни (логические 0) на линии RC4-RC7 порта С.
Вывод информации в порт
void main(void)
{
PORTC = 0; // очистить регистр данных порта С
TRISC = 0; // настроить все линии порта С на вывод
PORTC = 0b11110000; // вывести число 11110000 в порт С
while(1 ) // зацикливание программы
;
}
Компилятор С18 позволяет управлять отдельными битами регистров специальных функций. Имена регистров и отдельных их разрядов определены в заголовочном файле p18f242.h.
Можно задать значение любого разряда порта МК, используя формат PORTxbits.Rxy,
где x обозначает порт (A, B, C); y – номер разряда этого порта.
Например:
PORTAbits.RA0 = 1; // установить разряд порта RA0 = 1
PORTBbits.RB1 = 0; // сбросить разряд порта RB1 = 0
Управление отдельными разрядами
void main(void)
{
PORTC = 0;
TRISC = 0;
while( 1 )
{
PORTCbits.RC0 = 1; // включить VD1
PORTCbits.RC0 = 0; // выключить VD1
}
}
Опрос переключателя
void main(void)
{
PORTB = 0; // очистить регистр данных порта В
PORTC = 0; // очистить регистр данных порта С
TRISB = 0b10000001; // настроить разряды RB0 и RB7 на ввод, остальные на вывод
TRISC = 0; // настроить все линии порта С на вывод
while( 1 )
{
if(PORTBbits.RB0 == 0)
PORTCbits.RC0 = 1;
else
PORTCbits.RC0 = 0;
}
}
16. Подключение ЖК-дисплея к PIC-микроконтроллеру: структура ЖК-дисплея, функции управления дисплеем.
Существует несколько различных стандартных форматов ЖК-дисплеев (количество символов × число строк): 8×2, 16×1, 16×2, 16×4, 20×1, 20×2, 20×4, 40×2, 40×4. Конструктивно дисплей представляет собой печатную плату с установленными на ней контроллером HD44780 и ЖК-индикатором. Плата содержит 14-контактное поле, расположенное в нижней части, а также 2 контакта (выводы питания подсветки) в правой части. Назначение выводов поясняет табл. 1.
Назначение выводов ЖК-дисплея
№ вывода | Обозначение | Функция |
VDD | Напряжение питания ( + 5 В ) | |
VSS | Общий (земля) | |
VEE | Управление контрастом | |
RS | Сигнал выбора регистра | |
R/W | Сигнал чтение/запись | |
E | Сигнал разрешение | |
7-14 | D0-D7 | Биты данных |
Основными чертами интерфейса контроллера HD44780 являются такие характеристики.
Данные передаются по 4- или 8-разрядной шине данных, что определяется пользователем. Эти данные могут быть либо командами, либо символьной информацией. Использование 4-разрядного режима позволяет ограничить весь интерфейс 7-ю линиями, однако процесс передачи данных будет немного более медленным, чем при 8-разрядном режиме.
Управление выполняется с использованием трех линий:
-линия RS (выбор регистра), которая определяет, будет передаваться команда или символьные данные;
-линия R/W (чтение / запись), которая определяет направление перемещения данных (R/W = 1 – чтение, R/W = 0 – запись);
-линия Е (разрешение), которая выполняет функцию тактирования с целью синхронизации процесса передачи данных.
Контроллер имеет простой набор команд, который позволяет управлять работой дисплея. В его состав входят команды инициализации и сброса дисплея, управления положением и характеристиками курсора и т.д.
В контроллере HD44780 можно выделить основные элементы, с которыми приходится взаимодействовать при программном управлении: регистр данных (DR), регистр команд (IR), видеопамять (DDRAM), ОЗУ знакогенератора (CGRAM), счетчик адреса памяти (AC), флаг занятости контроллера (BF). Основными объектами взаимодействия являются регистры DR и IR. Выбор адресуемого регистра производится линией RS: если RS = 0 – адресуется регистр команд (IR), если RS = 1 – регистр данных (DR).
Данные через регистр DR в зависимости от текущего режима могут помещаться (или считываться) в видеопамять (DDRAM) или ОЗУ знакогенератора (CGRAM) по текущему адресу, указываемому счетчиком адреса (AC). Информация, попадающая в регистр IR, интерпретируется устройством выполнения команд как управляющая, т.е. команда. Прочтение регистра IR возвращает в 7-ми младших разрядах текущее значение счетчика AC, а в старшем разряде флаг занятости (BF).
Видеопамять, имеющая общий объем 80 байтов, предназначена для хранения кодов символов, отображаемых на ЖКИ. Видеопамять организована в виде двух строк по 40 символов в каждой. Эта привязка является жесткой и не подлежит изменению. Другими словами, независимо от того, сколько реальных строк будет иметь конкретный ЖКД, скажем, 80×1 или 20×4, адресация видеопамяти всегда производится как к двум строкам по 40 символов.
Программная модель ЖК-дисплея, используемого в лабораторной работе, показана в табл.2. Первой (верхней строке) дисплея соответствуют адреса видеопамяти 00H…0FH, а второй - адреса памяти 40H…4FH.
Флаг занятости BF имеет значение 1, когда контроллер занят, и 0 – когда свободен. Необходимо учитывать, что большинство операций, выполняемых контроллером ЖКД, занимают значительное время, которое может доходить до нескольких единиц миллисекунд, поэтому цикл ожидания установки флага BF должен обязательно присутствовать в программах управления ЖК-дисплеем и предшествовать совершению любой операции.
2.2. Библиотека функций управления ЖК-дисплеем
Для облегчения разработки программ управления ЖК-дисплеем с контроллером Hitachi HD44780 в библиотеке пакета MCC18 имеются несколько функций, которые используют выводы портов микроконтроллеров семейства PIC18. Описания этих функций даны в заголовочном файле с именем xlcd.h. По умолчанию для управления контроллером используются выводы только порта В. Имеется возможность использования и других портов, но для этого надо произвести изменения некоторых констант, указанных в файле xlcd.h.
В данной лабораторной работе используется 4-разрядный формат передачи данных, и для управления дисплеем достаточно только 7 линий. В табл.3 указаны выводы ЖКД и соответствующие им выводы МК.
Таблица 3
Соответствие выводов ЖКД и МК
Наименования выводов ЖКД | Наименование выводов порта В МК |
RS | RB5 |
R/W | RB6 |
E | RB4 |
D4 | RB0 |
D5 | RB1 |
D6 | RB2 |
D7 | RB3 |
В данной лабораторной работе будут использованы следующие функции:
Функция | Описание |
BusyXLCD | Контроллер ЖКД занят? |
OpenXLCD | Конфигурирует линии портов, используемых для ЖКД и инициализирует его |
putsXLCD | Записывает строку в видеопамять контроллера ЖКД |
SetDDRamAddr | Устанавливает адрес в видеопамяти контроллера ЖКД |
WriteCmdXLCD | Записывает команду в контроллер ЖКД |
Для выполнения библиотечных функций управления ЖКД требуется также три функции временной задержки, которые должен организовать пользователь. Эти функции следующие:
Функция | Описание |
DelayFor18TCY | Задержка на 18 командных циклов |
DelayPORXLCD | Задержка на 15 мс |
DelayXLCD | Задержка на 5 мс |
Рассмотрим вкратце библиотечные функции.
BusyXLCD( ) - контроллер ЖКД занят? Эта функция возвращает значение флага занятости BF контроллера Hitachi HD44780. Если BF = 1, то контроллер занят, если BF = 0, то свободен. Обычно эта функция используется для ожидания готовности контроллера ЖКД с помощью оператора:
while(BusyXLCD( ));
OpenXLCD(unsigned char lcdtype) – функция конфигурации и инициализации ЖКД. Здесь ledtype – это маска из битов конфигурации ЖКД, значения которых определены в файле xlcd.h. Пример записи этой функции, который будет использоваться в лабораторной работе:
OpenXLCD(FOUR_BIT & LINES_5X7);
Здесь FOUR_BIT – режим 4-разрядных данных, LINES_5X7 - многострочный дисплей с символами 5×7 точек.
WriteCmdXLCD(unsigned char cmd) – запись команды в контроллер, cmd – маска из битов, определенных в файле xlcd.h. В лабораторной работе эта функция используется в виде:
WriteCmdXLCD(CURSOR_OFF & BLINK_OFF);
Здесь CURSOR_OFF – отключить отображение курсора, BLINK_OFF – отключить мерцание курсора.
SetDDRamAddr(unsigned char addr) – установка адреса в ОЗУ данных (видеопамяти) дисплея. Эта функция устанавливает адрес в ОЗУ данных контроллера Hitachi HD44780. Контроллер не должен быть занят во время выполнения этой операции – это можно проверить с помощью функции BusyXLCD( ). Пример использования этой функции в лабораторной работе:
while(BusyXLCD( )); // ожидание готовности контроллера ЖКД
SetDDRamAddr(0x40); // установка адреса видеопамяти равным 0x40 –
// установка курсора на начало второй строки дисплея
17. Аналого-цифровое преобразование в PIC-микроконтроллерах: структура внутреннего АЦП, функции управления АЦП на языке С18.
Все микроконтроллеры семейства PIC18 имеют встроенные многоканальные аналого-цифровые преобразователи (АЦП), используемые для преобразования аналогового входного напряжения в диапазоне от 0 до UDD (напряжение питания МК) в цифровой код. АЦП выдают 10-разрядный код, а число аналоговых каналов зависит от конкретного типа МК. Так, например, PIC18F242 имеет 6 аналоговых каналов. Для ввода аналоговых сигналов обычно используются линии порта А, которые требуется настроить на ввод. Реальная величина погрешности преобразования, характер использования выводов портов и скорость выполнения операций зависит от конкретного типа МК, а также тактовой частоты его работы.
После запуска АЦП требуется определенное время, называемое временем преобразования, необходимое для преобразования аналогового входного напряжения в цифровой код. Изменение входного напряжения во время процесса преобразования вносит нежелательную погрешность в генерируемый выходной код. Для уменьшения этой погрешности на входе АЦП включают устройство выборки-хранения (УВХ), состоящее из аналогового ключа и запоминающего конденсатора. Ключ замыкается при выборе канала АЦП, а конденсатор, после заряда, сохраняет значение входного напряжения канала на постоянном уровне, пока АЦП выполняет преобразование. Длительность временного интервала, который требуется для заряда запоминающего конденсатора, определяется параметрами входной цепи, а также температурой окружающей среды. В большинстве случаев можно принять, что максимальное время заряда запоминающего конденсатора не превышает 20 мкс.
Модуль АЦП имеет внутренний делитель частоты, обеспечивающий деление тактовой частоты МК в 2, 4, 8, 16, 32 и 64 раза. Встроенный RC-генератор с частотой 250 кГц обычно используется для АЦ-преобразования в тех случаях, когда сам МК переводится в энергосберегающий режим SLEEP.
Минимальное время преобразования АЦП определяется суммарным временем, которое требуется для установки времени на запоминающем конденсаторе и для полного завершения самого АЦ-преобразования.
Результат АЦ-преобразования запоминается в двух регистрах МК: старший байт в ADRESH и младший байт в ADRESL. Этот результат может размещаться в двух различных форматах, которые называются:
- с правым выравниванием; - с левым выравниванием.
В формате «с правым выравниванием» в шесть старших разрядах регистра ADRESH записываются нули, а в два младших разряда - соответственно два старших бита полученного результата.
В формате «с левым выравниванием» восемь старших бит результата записываются в регистр ADRESH, а младшие биты результата запоминаются в регистре ADRESL.