- •7. Ввод в mcs-51 аналоговых сигналов: виды ацп, схемы подключения и программы опроса ацп.
- •14. Функции формирования временных задержек в языке с18.
- •15. Программирование на языке с18 типовых функций управления и контроля: вывод информации в порт, управление отдельными разрядами портов, опрос переключателя.
- •16. Подключение жк-дисплея к pic-микроконтроллеру: структура жк-дисплея, функции управления дисплеем.
- •17. Аналого-цифровое преобразование в pic-мк: структура внутреннего ацп, функции управления ацп на языке с18.
- •18. Реализация широтно-импульсной модуляции в pic-мк: параметры шим, функции управления шим на языке с18.
- •19. Прерывания в pic18: источники прерываний, управляю-е биты, программирование прерываний на языке с18.
- •29. Разработка и автономная отладка аппаратных и программных средств микроконтроллерных систем.
- •30. Методы и средства совместной отладки аппаратных и программных средств микроконтроллерных систем.
18. Реализация широтно-импульсной модуляции в pic-мк: параметры шим, функции управления шим на языке с18.
Скважностью импульсной последовательности называется отнош-е периода следования импульсов Т к их длительности tИ и обозначается буквой Q: Q = T / tИ
Скважность – величина безразмерная и не имеет единиц измерения.
Часто вместо скважности используется термин коэф-ент заполн-я γ, который является велич-ой, обратной скважности: γ = 1 / Q = tИ / T
Коэф-ент заполнения обычно выражатся в проц-ах: γ = (tИ / T) 100%
Все микроконтроллеры семейства PIC18 имеют внутренние модули, которые могут вырабатывать импульсные последовательности с широтно-импульсной модуляцией (ШИМ). Количество этих модулей или по-другому каналов ШИМ может быть от 1 до 5. Для облегчения разработки программ управления каналами ШИМ в библиотеке пакета МСС18 имеются несколько функций. В табл.1 приведены некоторые наиболее часто используемые функции. Полное описание их дано в заголовочном файле pwm.h.
Таблица 1
Функции ШИМ
Функция |
Описание |
ClosePWMx |
Дезактивирует ШИМ канала х |
OpenPWMx |
Конфигурирует ШИМ канала х |
SetDCPWMx |
Записывает значение нового рабочего цикла в ШИМ канала х |
Рассмотрим вкратце библиотечные функции ШИМ на примере канала 1. ClosePWM1( ) – дезактивирует ШИМ канала 1. Прототип функции: void ClosePWM1(void); OpenPWM1( ) – конфигурирует ШИМ канала 1, задавая период и длительность импульсов. Для работы ШИМ используется только таймер 2. Прототип функции: void OpenPWM1(char period); Аргумент функции period – может быть любым числом в пределах от 0х00 до 0xFF. SetDCPWM1( ) – записывает новое значение рабочего цикла в регистр ШИМ канала 1. Прототип функции: void SetDCPWM1(unsigned int dutycycle);
Аргумент функции dutycycle – может быть любым 10-битным числом. Только младшие 10 бит числа dutycycle записываются в регистры канала ШИМ.
19. Прерывания в pic18: источники прерываний, управляю-е биты, программирование прерываний на языке с18.
Микроконтроллеры PIC18 имеют несколько источников прерываний и функцию приоритетной системы прерываний, которая позволяет для каждого источника прерываний назначить высокий или низкий приоритет. При возникновении прерывания с высоким приоритетом происходит переход по вектору 000008h, а при возникновении прерывания с низким приоритетом – по вектору 000018h. Каждому источнику прерываний соответствует три управляющих бита: флаг прерываний, указывает на то, что выполнено условие возникновения прерывания; бит разрешения прерывания, разрешает переход по вектору прерывания при установке соответствующего флага; бит приоритета, выбор низкого или высокого приоритета прерывания.
Обработка прерывания заключается в следующем: Приостанавливается выполнение текущей программы, сохраняется текущий контекст и передается управление подпрограмме обрабо-и прерывания ISR. После выполнения ISR восстанавливается информация о предыдущем контексте и возобновляется нормальная работа программы. Рассмотрим основные особенности программирования прерываний при использовании компилятора С18. Как и любая функция языка Си, подпрограмма обработки прерывания ISR может иметь локальные и глобальные переменные. Однако ISR не может иметь входных параметров и не может возвращать какого-либо значения, то есть объявляется как:
void isr(void)
{
……..
}
ISR может быть вызвана только реакцией на работу аппаратуры, но не из другой Си-функции. В языке С18 не производится автоматическое размещение начала ISR по адресу вектора прерывания. Это объясняется тем, что источников прерывания, а следовательно, и ISR может быть несколько. Векторов прерыва-я, то есть адресов только два: 000008h для высокого приоритета и 000018h для низкого приоритета. Обычно по адресу вектора прерывания размещается ассемблерная команда GOTO для перехода на нужную ISR. Используется in-line ассемблер, при этом блок команд ассемблерного кода должен начинаться с директивы _asm и кончаться директивой _endasm:
_asm
…………
………… // команды Ассемблера
…………
_endasm
Для размещения вектора прерывания в программном коде испол-ся директива #pragma code section_name = address. Здесь section_name – идентификатор языка Си, address – целая константа (integer). Для возврата в исходную секцию кода используется директива #pragma code. В языке С18 для задания приоритета функции обработки прерывания имеются две директивы:
#pragma interrupt fname
#pragma interruptlow fname
Директива #pragma interrupt объявляет функцию обработки прерывания как имеющую высокий приоритет, а директива #pragma interruptlow – как имеющую низкий приоритет.
Пример программирования прерываний в языке С18.
#include <p18fxxx.h>
void high_isr(void); // прототип ISR с высоким приориор-м
void low_isr(void); // прототип ISR с низким приоритетом
#pragma interrupt high_isr // функция high_isr объявляется с
// высоким приоритетом
#pragma interruptlow low_isr // функция low_isr объявляется с
// низким приоритетом
#pragma code high_vector = 0x08 //дальнейший программный код
//будет начинаться с адреса 000008h
void high_interrupt(void)
{
_asm
goto high_isr // переход на функцию с именем high_isr
_endasm
}
#pragma code low_vector = 0x18 // дальнейший программный код
// начинаться с адреса 000018h
void low_iterrupt(void)
{
_asm
goto low_isr // переход на функцию с именем low_isr
_endasm
}
#pragma code // возврат в исходную программную секцию кода
………………………………..
void main(void) // главная функция программы
{
……………………..
}
void high_isr(void) // функция обработки прерывания с
{ // высоким приоритетом
………
}
void low_isr(void) // функция обработки прерывания с
{ // низким приоритетом
…….
}
Управление приоритетной системой прерываний в МК семейства PIC18 выполняется с помощью бита с именем IPEN, который находится в регистре специальных функций RCON. Если IPEN = 0, то приоритетная система прерываний выключена, и все прерыв-я имеют одинаковые приоритеты. По умолчанию предполагается, все прерывания будут иметь высокий приоритет, т.е. при возникнове-и любого прерывания происходит переход по вектору 000008h. Для общего (глобального) разрешения прерываний надо установить бит GIE = 1, который находится в регистре INTCON.Если IPEN = 1, то приоритетная система прерываний включена. Для общего (глоб-го) разрешения прерываний с высоким приоритетом надо установить бит GIEH = 1. Для общего разрешения прерываний с низким приоритетом надо установить бит GIEL = 1. Эти биты находятся в регистре INTCON.