PIC мк. Эксперимент №5. Использование прерываний.

Бывает так, что нужно прервать выполнение программы на некоторое время (например по переполнению таймера, по нажатию кнопки и т.д.). Ниже приведена картинка, позволяющая очень хорошо ориентироваться в прерываниях:

Продолжение дальше.

• 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 мс.

PIC мк. Эксперимент №5. Использование прерываний.: 14 комментариев

  1. • RBIE — прерывание по изменению состояния пинов потра *В0
    -прерывание по изменению состояния пинов порта RB

    Ответить

  2. Здравствуйте. Прерывание можно сделать по кнопке которая не является INT?

    Ответить

    sarge Ответил:

    Да, можно сделать по кнопкам RBIE в данном случае.

    Ответить

  3. А мне надо конкретную кнопку. У меня там есть изменяющиеся сигналы на порте В….
    Как же тогда? PEIE — через это может? Как то…

    Ответить

    sarge Ответил:

    При чем тут периферийные прерывания, для кнопок INTE и RBIE, я вам еще вчера предложил скиньте мне свой готовый проект я покажу как бы я делал.

    Ответить

  4. Получили?
    Так что бы Вы изменили?
    Мне завтра ехать прошивать.

    Ответить

    sarge Ответил:

    Получил, не было времени смотреть еще.

    Ответить

  5. “Ниже приведена картинка, позволяющая очень хорошо ориентироваться в прерываниях” –
    какое-то сомнительное утверждение.. вообще ничего не понял, но все равно за труды спасибо :)

    Ответить

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">