Views: 889
Любое обучение преследует определенную цель и сейчас изучение разных возможностей, это цель создания определенного устройства, название которого будет раскрыто позже.
А пока надо научиться настраивать PIC-контроллер, для аппаратного формирования на выходе заданной частоты импульсов.
Для этого будем использовать модуль Output Compare. Он имеет возможность сравнивать значение выбранное времени (подразумевается значение таймер) со значение одного или двух регистров сравнения (в зависимости от выбранного режима). Кроме того, он имеет возможность формировать на выходе единичный импульс, или формировать непрерывную последовательность выходных импульсов, по заданным событиям. Как и большинство PICmicro ® периферийных устройств, он также имеет способность генерировать прерывания в момент события сравнения.
В нашем используемом для обучении контроллере (PIC24FJ64GA002) доступны 5 таких устройств. Все выходные каналы сравнения функционально идентичны. Обозначение они носят OC1 – OC5. Разработчики PIC24 подошли более глубоко к конфигурированию периферии, это связано необходимостью создания возможности для подключения периферийного устройства к необходимым выводам микроконтроллера, таким подключением занимаются регистры настройки подключения периферийных устройств RPINR0 – RPINR23. В описании можно увидеть обозначение RP0, RP1… и так далее в зависимости от количества выводов микроконтроллера. Это выводы к которым могут быть подключены входы или выходы цифровых периферийных модулей. Естественно более конкретно, что может быть подключено, а что нет надо светиться с описанием на конкретный микроконтроллер. Функция подключения настолько гибки, что могут подключать один выход периферийного устройства к нескольким ножкам микроконтроллера или один вход, для разных периферийных устройств.
Схема, задача – на 26 ножке микроконтроллера получить меандр с заданной частотой.
В нашем случае мы конфигурируем выход OC1 на (RB15) 26 ножку микроконтроллера. Это вывод RP6. Наш выход Output Compare 1 (OC1) соответствует функциональному номеру 18 (все эти данные надо смотреть в описании). Прямая запись в регистры конфигурации настройки периферийных устройств невозможна, если установлен бит IOLOCK в регистре OSCCON (его функция еще связана с регистром конфигурации), это сделано для блокировки случайной их перенастройки в процессе работы. Если в регистре конфигурации предусмотрено возможность снятия этого бита после установки, то необходимо будет выполнить последовательность разблокирования. Если попробовать выполнить запись в регистр конфигурации периферийных устройств с установленным битом IOLOCK, то такая запись будет выполнена, но значение регистров не измениться.
Сначала по порядку, за подключение к ножке 26 отвечает регистр RPOR7 в нем в старшем байте размещены биты управления функций RP15 (см. таблица 1-2)
Таблица 1-2.
Функция | Номер ножки | Регистр который отвечает за настройку выходных сигналов для указанной ножки контроллера | Регистр выхода |
RP0 | 4 | RPOR0 | RPOR0bits.RP0R |
RP1 | 5 | RPOR0 | RPOR0bits.RP1R |
RP2 | 6 | RPOR1 | RPOR1bits.RP2R |
RP3 | 7 | RPOR1 | RPOR1bits.RP3R |
RP4 | 11 | RPOR2 | RPOR2bits.RP4R |
RP5 | 14 | RPOR2 | RPOR2bits.RP5R |
RP6 | 15 | RPOR3 | RPOR3bits.RP6R |
RP7 | 16 | RPOR3 | RPOR3bits.RP7R |
RP8 | 17 | RPOR4 | RPOR4bits.RP8R |
RP9 | 18 | RPOR4 | RPOR4bits.RP9R |
RP10 | 21 | RPOR5 | RPOR5bits.RP10R |
RP11 | 22 | RPOR5 | RPOR5bits.RP11R |
RP12 | 23 | RPOR6 | RPOR6bits.RP12R |
RP13 | 24 | RPOR6 | RPOR6bits.RP13R |
RP14 | 25 | RPOR7 | RPOR7bits.RP14R |
RP15 | 26 | RPOR7 | RPOR7bits.RP15R |
Для настройки выхода Output Compare 1, необходимо записать в соответствующий регистр выхода, который связан с нужной нам ножкой контроллера значение 18 (см. таблицу 10-3).
Таблица 10-3.
Функция | Номер функции | Название выхода |
NULL | 0 | NULL |
C1OUT | 1 | Comparator 1 Output |
C2OUT | 2 | Comparator 2 Output |
U1TX | 3 | UART1 Transmit |
U1RTS | 4 | UART1 Request To Send |
U2TX | 5 | UART2 Transmit |
U2RTS | 6 | UART2 Request To Send |
SDO1 | 7 | SPI1 Data Output |
SCK1OUT | 8 | SPI1 Clock Output |
SS1OUT | 9 | SPI1 Slave Select Output |
SDO2 | 10 | SPI2 Data Output |
SCK2OUT | 11 | SPI2 Clock Output |
SS2OUT | 12 | SPI2 Slave Select Output |
OC1 | 18 | Output Compare 1 |
OC2 | 19 | Output Compare 2 |
OC3 | 20 | Output Compare 3 |
OC4 | 21 | Output Compare 4 |
OC5 | 22 | Output Compare 5 |
Тетерь если мы не устанавливали бит IOLOCK в регистре OSCCON, то настроить выход нам необходимо будет выполнить команду:
RPOR7bits.RP15R=18; //подключение выхода модуля Output Compare 1 к ножке 26 контроллера.
Если мы хотим это сделать когда бит IOLOCK уже установлен, и если такая возможность разрешена, сброс бита IOLOCK после установки в регистре конфигурации. При инициализации регистра конфигурации, должна быть сделана такая запись:
#pragma config IOL1WAY = OFF // Блокировка регистра OSCCON: - после установки IOLOCK он может быть изменен с помощью последовательности разблокирования
То с начала надо сбросить бит IOLOCK, для чего надо выполнить последовательность разблокирования:
// снятие бита блокировки asm volatile ( "MOV #OSCCON, w1 \n" // копируем адрес регистра OSCCON в аккумулятор w1 "MOV #0x46, w2 \n" // загружаем значение 0x46 в аккумулятор w2 "MOV #0x57, w3 \n" // загружаем значение 0x57 в аккумулятор w3 "MOV.b w2, [w1] \n" // загружаем значение 0x46 из w2 в регистр OSCCON "MOV.b w3, [w1] \n" // загружаем значение 0x57 из w3 в регистр OSCCON "BCLR OSCCON,#6"); // сбрасываем бит IOLOCK в регистре OSCCON
а затем выполнить команду
RPOR7bits.RP15R=18; //подключение выхода модуля Output Compare 1 к ножке 26 контроллера.
И если в дальнейшем надо заблокировать изменение настроек, то надо установить бит IOLOCK. Для этого выполните:
// установка бита блокировки asm volatile( "MOV #OSCCON, w1 \n" "MOV #0x46, w2 \n" "MOV #0x57, w3 \n" "MOV.b w2, [w1] \n" "MOV.b w3, [w1] \n" "BSET OSCCON, #6" );
После того когда подключили наш модуль к ножке контроллера настроим его работу.
Модуль работает только в паре с таймером, который задает все временные параметры. Таймер, с которым может работать наш модуль, может быть Timer2 или Timer3. Один из них может быть выбран битом OCTSEL в регистре (OCxCON <3>).
Для настройки модуля Output Compare 1 предназначены три регистра:
- OC1CON – регистр управления.
- OC1R – регистр сравнения 1.
- OC1RS – регистр сравнения 2.
Регистр управление OC1CON – описание битов:
bit 13 – OCSIDL: отвечает за работу модуля в Idle режиме, если он установлен (1) модуль будет выключен в режиме ожидания, если сброшен (0), то будут продолжать работать в режиме ожидания.
bit 4 – OCFLT: бит состояния режима ШИМ (bit 2-0=111), актуален если модуль работает в режиме ШИМ. Если установлен (1) – произошла неисправность, если (0) – нет неисправности.
bit 3 – OCTSEL: бит выбора таймера для совместной работы, 1 = Timer3, 0 = Timer2.
bit 2-0 – выбор режима работы модуля.
111 = режим PWM, контроль неисправности включен
110 = режим PWM, контроль неисправности выключен
101 = Инициализация выходного контакта модуля низким уровнем, генерация непрерывных импульсов.
100 = Инициализация выходного контакта модуля низким уровнем, генерация одиночного импульса.
011 = Режим сравнения и переключение выхода в противоположное состояние
010 = Инициализация выходного контакта модуля высоким уровнем, после сравнения перевести в низкий уровень.
001 = Инициализация выходного контакта модуля низким уровнем, после сравнения перевести в высокий уровень.
000 = модуль отключен.
Для нашего варианта работы выберем работу с таймером 2 и настроем режим (101) – Инициализация выходного контакта модуля низким уровнем, генерация непрерывных импульсов. Настройка будет выглядеть следующим образом:
// настройка модуля Output Compare 1 OC1CON=0b0010000000010101; // |||||||||||||+++-- OCM<2:0>: Инициализация выходного контакта модуля низким уровнем, генерация непрерывных импульсов // ||||||||||||+----- OCTSEL: 0 = Timer2 // |||||||||||+------ OCFLT: - флаг статуса (не используется в нашем режиме) // |||++++++++------- неиспользуемые // ||+--------------- OCSIDL: 1- режиме Idle отключен // ++---------------- неиспользуемые // тут задаем форму сигнала OC1R=0x007F; // нарастание _/ OC1RS=0x00FF; // спад \
Настройка таймера:
// настройка таймера TMR2 T2CON=0b1010000000000000; // |||||||||||||||+-- неиспользуемый // ||||||||||||||+--- TCS: 0 - внутрений генаратор FOSC/2 // |||||||||||||+---- неиспользуемый // ||||||||||||+----- T32: 0- 16 битный режим // ||||||||||++------ TCKPS1:TCKPS0: пределитель 11-1:256 // |||||||||+-------- TGATE: - отключен // |||++++++--------- неиспользуемые // ||+--------------- TSIDL: 1- врежиме Idle отключен // |+---------------- неиспользуемый // +----------------- TON: 1 - таймер включен PR2=0x00FF; // период счета
При таких настройках мы будем иметь выходную частоту 62,5 кГц, теперь приведем формулу для расчета требуемой частоты. Тактовая частота задается используемым таймером. Частота на выходе таймера определяется настройкой предделителя и значением регистра периода PR.
Fout = Ftakt/2/предделитель/значение PR. Наша тактовая 32 мГц. Предделитель 1:1, значение PR = 255.
Fout = 32 000 000 / 2 / 1 / 255 = 62745 Гц.
Проект для загрузки.
[box title=”Файлы для загрузки” color=”#521BDE”][wpdm_file id=157][/box]