Содержание
- Введение в модуль таймера в устройствах dsPic30f и dsPic33f
- Режимы работы таймера в устройствах dsPic30f и dsPic33f
- Пример кода для инициализации таймера для dsPic30f и dsPic33f
- Общая процедура инициализации таймера в микроконтроллере dsPic30f и dsPic33f
- 1) Какой таймер использовать
- 2) 16-битный таймер или 32-битный таймер?
- 3) Режим работы таймера
- 4) Часы-предделитель
- 5) Инициализировать прерывание по таймеру
- Пример кода для инициализации прерывания в контроллерах dsPic30f и dsPic33f
- Полный пример кода для инициализации и тестирования таймера и прерывания от таймера для dsPic30f и dsPic33f
Автор завершил свой последний год инженерного проекта с микроконтроллерами dsPic, получив обширное представление об этих устройствах.
Модуль таймера является важным периферийным устройством внутри микроконтроллера dsPic и может использоваться в различных приложениях.
В этом руководстве будут использоваться готовые примеры кода на языке C, закодированные в MplabX IDE и протестированные на микроконтроллере Microchip dsPic30f4011, чтобы провести вас через процесс инициализации и настройки таймеров для ваших приложений dsPic.
Введение в модуль таймера в устройствах dsPic30f и dsPic33f
Модуль таймера в устройствах серии dsPic30f содержит всего пять 16-битных таймеров, а именно:
- Таймеры с 1 по 5.
Точно так же устройство серии dspic33f содержит до девяти 16-битных таймеров, а именно:
- Таймеры с 1 по 9.
Каждый из этих таймеров сгруппирован по трем типам: тип A, тип B и тип C, в зависимости от их особых характеристик.
Наберите "А | Тип - Б | Тип - C |
---|---|---|
Может работать от маломощного генератора 32 кГц. | Может быть объединен с таймером Type-C для формирования 32-битного таймера. * * | Может быть объединен с таймером типа B для формирования 32-битного таймера. * * |
Может работать в асинхронном режиме с внешним источником. | - | Имеет возможность запускать аналого-цифровое преобразование. |
Внешний источник часов может быть синхронизирован с внутренними часами | Внешний источник часов всегда синхронизируется с внутренними часами. * | Внешний источник часов всегда синхронизируется с внутренними часами. * |
Режимы работы таймера в устройствах dsPic30f и dsPic33f
Помимо того, что каждый таймер сгруппирован по типу A, B или C, он может работать в четырех различных режимах:
- Режим таймера
- Режим закрытого таймера
- Режим синхронного счетчика
- Режим асинхронного счетчика
Режим таймера | Режим закрытого таймера | Режим синхронного счетчика | Режим асинхронного счетчика |
---|---|---|---|
Увеличивается на единицу при каждом нарастающем фронте входного тактового сигнала. | Увеличивается на единицу при каждом нарастающем фронте входного синхросигнала, пока внешний сигнал затвора на выводе TxCK высокий. | Увеличивается на единицу при каждом нарастающем фронте входного тактового сигнала. | Увеличивается на единицу при каждом нарастающем фронте входного тактового сигнала. |
Внутренние часы используются | Внутренние часы используются | Внешние часы используются на выводе TxCK | Внешние часы используются на выводе TxCK |
_ | _ | Часы внешнего и внутреннего устройства синхронизированы | Внешние и внутренние часы устройства не синхронизированы |
Прерывание генерируется при совпадении периода | Прерывание генерируется по заднему фронту вывода TxCK. | Прерывание генерируется при совпадении периода | Прерывание генерируется при совпадении периода |
Пример кода для инициализации таймера для dsPic30f и dsPic33f
недействительным init_Timer (недействительным) {T1CONbits.TON = 1; // Активируем модуль таймера T1CONbits.TCKPS = 0; // Выбираем предделитель входных часов как 1: 1 T1CONbits.TGATE = 0; // Отключить режим накопления времени затвора T1CONbits.TCS = 0; // Выбираем внутренние часы как источник тактовых импульсов таймера T1CONbits.TSYNC = 0; // Внешний источник синхронизации остается несинхронизированным PR1 = 0xFFFF; }
Общая процедура инициализации таймера в микроконтроллере dsPic30f и dsPic33f
При инициализации таймера для любого приложения можно следовать следующей общей процедуре:
- Решите, какой таймер использовать.
- Решите, требуется ли 16-битный таймер или 32-битный таймер.
- Определите режим работы таймера.
- Установите предварительный масштабатор часов.
- Решите, требуется ли прерывание по таймеру или какой-либо другой триггер специального события.
1) Какой таймер использовать
Каждый из таймеров может быть включен битом TON в регистре TxCON, где «x» - это номер таймера, который должен быть включен.
В нашем примере кода мы включили Таймер 1, установив бит TON в регистре T1CON на 1.
2) 16-битный таймер или 32-битный таймер?
Таймеры Type-B и Type-C могут быть объединены для работы как один 32-битный таймер. В сочетании, конфигурация таймера типа B будет преобладать над таймером типа C.
- В устройстве dsPic30f таймеры 2 и 3 могут быть объединены в один 32-битный таймер.
- Устройства dsPic33f имеют более одной пары 32-битных таймеров, где таймеры 2/3, 4/5, 6/7 и 8/9 также могут образовывать пары 32-битных таймеров.
Для этого бит T32 в регистре TxCON таймера типа B должен быть установлен в 1.
TxCON.T32 * | Конфигурация таймера |
---|---|
1 | Связан с другой парой таймеров. |
0 | Будет работать как независимый 16-битный таймер. |
3) Режим работы таймера
Режим работы таймера можно выбрать в соответствии со следующей таблицей.
Имя бита | Битовое значение | Выбран режим |
---|---|---|
TxCON.TCS | 0 | Режим таймера |
TxCON.TGATE, TxCON.TCS | 1, 0 | Режим закрытого таймера |
TxCON.TCS, TxCON.TSYNC * | 1, 1 | Режим синхронного счетчика |
TxCON.TSYNC | 0 | Режим асинхронного счетчика |
4) Часы-предделитель
Предварительный масштабатор тактовых импульсов может использоваться для увеличения или уменьшения частоты, с которой источник тактовых импульсов увеличивает значение временной развертки.
Его можно выбрать с помощью следующей таблицы.
TxCON.TCKPS * | Значение предделителя |
---|---|
3 | 1 : 256 |
2 | 1 : 64 |
1 | 1 : 8 |
0 | 1 : 1 |
5) Инициализировать прерывание по таймеру
Каждый таймер можно запрограммировать на запуск прерывания.
- Сравните соответствие между значением регистра счетчика таймера (TMRx) и регистра периода (PRx).
- Обнаружение спадающего фронта в режиме накопления стробированного времени.
Это прерывание может быть инициализировано в микроконтроллерах dsPic с помощью следующих регистров и битов.
Имя бита | Регистр и идентификация битов | Значение |
---|---|---|
Бит управления разрешением прерывания | IEC0 / 1.TxIE | 1 = включить 0 = отключить |
Бит состояния флага прерывания | IFS0 / 1.TxIF | Этот бит необходимо сбрасывать программно после каждого срабатывания прерывания. |
Бит управления приоритетом прерывания | IPC0 / 1 / 5.TxIP | 6 - 0 в зависимости от приоритета |
Этот пример кода можно использовать для инициализации процедуры обслуживания прерывания для таймера 1. (Выберите функцию инициализации таймера сверху и вызовите соответствующие функции в main ().)
Для получения подробной информации о прерываниях см.
Пример кода для инициализации прерывания в контроллерах dsPic30f и dsPic33f
void Interrupt_Init (void) {IEC0bits.T1IE = 1; IPC0bits.T1IP = 6; } void __attribute __ ((interrupt, auto_psv)) _T1Interrupt (void) {// Ваш код здесь IFS0bits.T1IF = 0; }
Полный пример кода для инициализации и тестирования таймера и прерывания от таймера для dsPic30f и dsPic33f
[Проверено автором: 22.09.2018]
Следующий код можно использовать для инициализации и тестирования Таймера 1 в «Режиме таймера» работы. Это сделано путем включения двух приведенных выше фрагментов кода.
Этот код будет генерировать прерывание, когда когда-либо произойдет сравнение между значением регистра PR1 и регистров TMR1.
- Прерывание запрограммировано на мигание светодиода в течение 10 миллисекунд.
- Значение регистра PR1: 0x8FF4 был установлен таким образом, что сравнение выполняется каждые 20 миллисекунд.
Таким образом, светодиод должен гореть 10 миллисекунд (пока программный счетчик остается в режиме прерывания) и выключаться еще 10 миллисекунд, когда программный счетчик выходит из прерывания. Время выключения контролируется Таймером 1.
#define FCY 1842500 #include xc.h> #include delay.h> #include libpic30.h> #include p30F4011.h> _FOSC (CSW_FSCM_OFF & FRC); // Fosc = 7,37 МГц, внутренний быстрый RC-генератор void init_Timer (void) {T1CONbits.TON = 1; // Активируем модуль таймера T1CONbits.TCKPS = 0; // Выбираем предделитель входных часов как 1: 1 T1CONbits.TGATE = 0; // Отключить режим накопления времени затвора T1CONbits.TCS = 0; // Выбираем внутренние часы как источник тактовых импульсов таймера T1CONbits.TSYNC = 0; // Внешний источник синхронизации остается несинхронизированным PR1 = 0x8FF4; } void Interrupt_Init (void) {IEC0bits.T1IE = 1; IPC0bits.T1IP = 6; } void __attribute __ ((прерывание, auto_psv)) _T1Interrupt (void) {_LATD0 = 1; __delay_ms (10); _LATD0 = 0; IFS0bits.T1IF = 0; } void main (недействительно) {init_Timer (); Interrupt_Init (); в то время как (1) {}} Эта статья точна и правдива, насколько известно автору. Контент предназначен только для информационных или развлекательных целей и не заменяет личного или профессионального совета по деловым, финансовым, юридическим или техническим вопросам.