Бывает так, что нужно прервать выполнение программы на некоторое время (например по переполнению таймера, по нажатию кнопки и т.д.). Ниже приведена картинка, позволяющая очень хорошо ориентироваться в прерываниях:
Продолжение дальше.
• GIE – бит включения прерываний
• PEIE – бит включения прерываний от периферии
• T0IE – прерывание по переполнению TMR0
• INTE – прерывание по изменению состояния пина В0
• RBIE – прерывание по изменению состояния пинов порта B
• T0IF – флаг переполнения таймера TMR0
• INTF – флаг изменения состояния В0
• RBIF – флаг изменения хотя бы одного из пинов порта В
Периферию описывать не буду, все понятно из картинки.
Есть такое правило: Каждая переменная, которая используется в main() и в процедуре прерываний должна быть объявлена как “volatile”
Дело в том, что компилятор создает временную копию в регистре, во время прерывания переменная меняет свое значение в ОЗУ, но в регистре остается старое значение. Объявив переменную volatile, все будет происходить как задумано.
В этом примере я это использовать не буду, а просто выдам на порт В5 импульсы с частотой 500 Гц, используя прерывания переполнения таймера TMR0.
#include <htc.h> #define _XTAL_FREQ 4000000 #define tmr0presc 0x02 #define period 125 __CONFIG(WDTDIS & UNPROTECT & MCLREN & LVPDIS & HS); void main() { __delay_us(500); TRISB = 0b00001111; PORTB = 0; OPTION &= 0b11000000; OPTION |= tmr0presc; T0IE = 1; GIE = 1; TMR0 = 255 - period + 1; for (;;) { } } interrupt isr() { if (T0IF) { TMR0 = 255 - period + 1; RB5 = !RB5; T0IF = 0; } }
Осциллограма с мк, одно деление – 0.5 мс.
• RBIE — прерывание по изменению состояния пинов потра *В0
-прерывание по изменению состояния пинов порта RB
Да, спасибо, поправил.
Первою строчку нужно дописать, компилятор выдает ошибку -109.
Поправил, спасибо.
Картинка красивая , но ничего не понятно. Для начинающего ни о чем.
Здравствуйте. Прерывание можно сделать по кнопке которая не является INT?
Да, можно сделать по кнопкам RBIE в данном случае.
А мне надо конкретную кнопку. У меня там есть изменяющиеся сигналы на порте В….
Как же тогда? PEIE — через это может? Как то…
При чем тут периферийные прерывания, для кнопок INTE и RBIE, я вам еще вчера предложил скиньте мне свой готовый проект я покажу как бы я делал.
Вот https://yadi.sk/d/1EQ8TusjgNHbB
Извиняюсь, вот https://yadi.sk/d/R4m_e7aZgNJHQ
Забыл добавить файлы библиотек ЛСД
Получили?
Так что бы Вы изменили?
Мне завтра ехать прошивать.
Получил, не было времени смотреть еще.
“Ниже приведена картинка, позволяющая очень хорошо ориентироваться в прерываниях” –
какое-то сомнительное утверждение.. вообще ничего не понял, но все равно за труды спасибо 🙂
Уведомление: Pic Lab, PIC16, Experiment #5: interruptions | diymicro.org