Пишем программный код для настройки прерывание по входному сигналу на микроконтроллере PIC16F873A в среде программирования MPLAB X IDE.

Страница на этапе разработки

В данном уроке мы с Вами подключим кнопку к входу PB0, который можно отдельно настроить на прерывание по изменению сигнала на ножке. К сожалению в микроконтроллере PIC16F873 только ножка РВ0 может быть настроена на внешнее прерывание.

Для настройки прерывания нам нужен будет регистр INTCON:

INTE (RB0/INT External Interrupt Enable bit) — разрешение внешнего прерывания

RBIE (RB Port Change Interrupt Enable bit) — разрешение внешнего прерывания по изменению сигнала на входах RB7:RB4

INTF (RB0/INT External Interrupt Flag bit) -флаг внешнего прерывания RB0/INT (должен быть очищен программно).

RBIF (RB0/INT External Interrupt Flag bit) — флаг прерывания по изменению сигнала на входах RB7:RB4

Режим работы устанавливается в отдельном регистре OPTION_REG, в бите INTEDG: если бит установлен — обрабатываем передний фронт, если не установлен — то задний фронт.

Функция прерывания:

void __interrupt() Int(void){
    if (RBIF) {
            RBIF=0;
        // программный код
              }
   if (INTF) {
          INTF=0;
        // программный код
              }
}

При этом не забываем включать глобальное разрешение по прерыванию (GIE=1).

#define _XTAL_FREQ 8000000

#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON // Low-Voltage (Single-Supply) In-Circuit Serial Programming Enable bit (RB3/PGM pin has PGM function; low-voltage programming enabled)
#pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off)
#pragma config WRT = OFF // Flash Program Memory Write Enable bits (Write protection off; all program memory may be written to by EECON control)
#pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
#include <xc.h>

void __interrupt() Int(void){
if (RBIF) {
RBIF=0;
PORTCbits.RC5 = 0;
PORTCbits.RC4 = 1;
}
if (INTF) {
INTF=0;
PORTCbits.RC5 = 1;
PORTCbits.RC4 = 0;
}
}

void main(void) {
TRISC = 0x00;
PORTC = 0x00;
TRISB = 0xFF;
PORTB = 0xFF;
INTCON = 0b10011000;
while(1){
PORTCbits.RC3 = 0;
__delay_ms(500);
PORTCbits.RC3 = 1;
__delay_ms(500);
}
return;
}