PIC32MX (Основы работы с прерыванием по переполнению таймера)

Выкладываю код с подробными комментариями таймер+прерывание на PIC32MX. Может кому пригодиться, а мне, чтобы не забыть.
Компилятор C32, среда MPLAB X. Шил в МК пиккитом 3 (красным). Светодиод повесил на B5 ножку. Возникли вопросы? Пишите, постараемся ответить!!!


#include <plib.h> // Библиотека всех библиотек периферии PIC32MX

#pragma config FPLLMUL = MUL_15, FPLLIDIV = DIV_12, FPLLODIV = DIV_1 // Фьюзы блока тактировки МК (Частота внешнего кварцевого резонатора/FPLLIDIV*FPLLMUL/FPLLODIV)
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FWDTEN = OFF

 int main(void) // Пример использования прерывания по переполнению таймера
 {
     OpenTimer2(T2_ON | T2_SOURCE_INT | T2_PS_1_64, 0x7FFF); // Настройка таймера
     ConfigIntTimer2(T2_INT_ON | T2_INT_PRIOR_2); // Разрешение и установка приоритета
     INTEnableSystemMultiVectoredInt();
     TRISB = 0; // Настройка порта B на выход

 while(1)
 {
    PORTB = 0x0; // Записываем в порт В значение 0 (светодиоды погашены)
    // Здесь цикл крутиться до тех пор пока не наступит переполнение таймера
    // и буквально через несколько машинных циклов мы оказываемся
    // в функции обработки прерывания таймера
 }
 }

 void __ISR(_TIMER_2_VECTOR, ipl2) _Timer2Handler(void) // Функция обработки прерывания по переполнению таймера
 {
    long i; // Переменная для цикла задержки
    PORTB = 0xFF; // Записали в порт B значение 1 (светодиоды загорелись)
    for (i=0; i<40000; i++); // Эта задержка нужна, чтобы человеческий глаз увидел, что функция обработки прерывания работает
    mT2ClearIntFlag(); // Очистили флаг прерывания, иначе не выйдем из функции обработки, обратно в наш цикл
 }
 // Если будет непонятно про приоритеты, вектора, где искать фьюзы, спрашивайте!


Комментарии (20)

RSS свернуть / развернуть
Вы гугл транслейтом комментарии из примера перевели?
for (i=0; i<40000; i++); // Этот цикл

Боже, но зачем? Можно же взять просто прескалер еще больше.
0
Взять то можно, но тогда в прерывании без этого цикла светодиод гореть будет всего несколько тактов, нормальный человек не увидет зажигания светодиода.
0
Опять голодным спать пойду...
Гхм. Можно же было поставить peripherial clock низкий, 1-10 МГц и таймер поставить тикать на мизерной скорости, с 256 делителем. 16 бит регистра хватило бы на пару секунд задержки.
Да и были же регистры для инвертирования, пинались командой mPORTxToggleBits() вроде.
Годик назад я дико плевался на документацию по 32 пикам и по хелпам в студии. Сделано по-моему чтобы новички думали «ахтыжёбатваю» и клали камень на полочку. И часть примеров там не работала ((:
0
Насчет новичков, правильно сказанно))). Я так понял, документация для шарящих инженеров- пограммистов
0
Какой гугл транслейт, какой пример — троллей не кормлю))). Сам ковырялся до рабочего кода. Пример от микрочипа немного другой.
0
в статье код, в коде коммент, в комменте статья…
+1
  • avatar
  • xar
  • 27 мая 2012, 00:09
ф=и это //присваивание
пока (1) //это бесконечный цикл
с=а-б //вычитаем б из а
0
И ОНО работает???
В железе проверяли???
0
Да, конечно, прямо сейчас вижу мигающий В темноте мигающий светодиод.
0
Странно… ну и ладно…
Какой PIC32 юзается???
0
Тут pic32mx110f016b, также будет работать на 200 и 300-х, да и вроде на всех 32-х битных пиках. Главное перед компиляцией в мплабе выставить нужный камень.
0
Таймер может и будет… остальное — нет… )))))
Читайте даташит!!! ))))))
0
Кстати, этот камень с 40 штатных мегагерц, разогнался до 66,6 мегагерц. Слышал, что некоторые экземпляры при комнатной температуре работают на 80 мегагерцах. Есть еще у меня 500 серии камень там номинал 80 мегагерц, но там корпус стремный.
0
За задержки в прерываниях стоит расстреливать!
0
Для наглядности можно, а так конечно через отладчик.
0
Даже «для наглядности» не стоит! Прерывание на то и прерывание, чтобы занимало минимальное время у процессора. Пустые, длительные задержки даже в основном цикле делать не стоит.
0
А вот погромисты NVIDIA и Marvell так не считают. Причем если у первых оно оправдано и в целом повышает производительность, то вторые вполне могут обеспечивать периодические подвисания винды на несколько секунд.
Ну и в принципе прерывание должно только быстро отзываться, остальное — правила хорошего тона. Хотя здесь их нарушать незачем было, достаточно инвертировать состояние ножки в каждом срабатывании прерывания.
0
И получим, что светодиод в прерывании горит грубо говоря 1 мкс. По факту имеем потушенный светодиод всегда для наглядности.
0
Нет, он будет мигать с частотой вдвое меньше, чем частота вызова прерывания и скважностью 2.
0
«Для наглядности» привыкнут. Каешна, там где мультивекторные прерывания с приоритетами — это еще можно списать, но если нужно что-то большое провернуть по прерыванию — правильней сделать флаговый автомат и обработать в основном цикле
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.