Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МПТ 2013 ШПОРЫ.docx
Скачиваний:
300
Добавлен:
15.04.2015
Размер:
669.17 Кб
Скачать

14. Функции формирования временных задержек в языке с18.

Рассмотрим, как на Си получить временную задержку, которая позволит формировать управляющие сигналы с различными временными параметрами.

Допустим, что в схеме МКУ надо получить мигающий режим работы VD1. Чтобы мигание светодиода было хорошо видно, примем частоту смены данных на RC0 около 1 Гц. Задержку организуем с помощью программного цикла for, который будет выполняться определенное число раз. Время выполнения этого цикла и будет определять задержку.

Программа может иметь следующий вид.

#include<p18f242.h>

#pragma config WDT = OFF, OSC = HS

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 Гц может иметь вид:

#include<p18f242.h>

#include<delays.h>

#pragma config WDT = OFF, OSC = HS

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 порта С.

#include<p18f242.h> // подключить файл описания регистров МК

#pragma config WDT = OFF, OSC = HS //отключить сторожевой таймер, генератор МК

// кварцевый высокочастотный

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

Рассмотрим пример программы, в которой производится попеременное включение светодиода VD1.

#include<p18f242.h>

#pragma config WDT = OFF, OSC = HS

void main(void)

{

PORTC = 0;

TRISC = 0;

while( 1 )

{

PORTCbits.RC0 = 1; // включить VD1

PORTCbits.RC0 = 0; // выключить VD1

}

}

Рассмотрим теперь, как производится на Си опрос контактов переключателя. Пусть в рассматриваемом МКУ управление светодиодом VD1 выполняется от переключателя SA1. Когда контакт SA1 замкнут, светодиод VD1 горит. Когда разомкнут – не горит.

#include<p18f242.h>

#pragma config WDT = OFF, OSC = HS

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;

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]