Доброго дня или ночи. Проблема такая: есть мк pic16f676 кусаю локти уже второй день, никак не ловятся внешние прерывания от RA1 и RA3 упростил код - проще некуда.
| Код | #include <xc.h>
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on RA4/OSC2/CLKOUT and RA5/OSC1/CLKIN) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) #pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config MCLRE = OFF // RA3/MCLR pin function select (RA3/MCLR pin function is digital I/O, MCLR internally tied to VDD) #pragma config BOREN = OFF // Brown-out Detect Enable bit (BOD disabled) #pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled) #pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#define _XTAL_FREQ 4000000 // 4MHz
void __interrupt(high_priority)isr(void) { if (RAIF) { PORTC = 0x1; RAIF=0; } return; }
void main(void) { CMCON = 0x07; // компараторы отключены ADCON0 = 0x00; // АЦП отключен OPTION_REG = 0x00 // подтягивающие резисторы PORTA включены ANSEL = 0x00; // все порты цифровые i/o INTCON=0x88; // GIE = 1, RAIE = 1 // разрешены глобальные прерываня и прерывания от PORTA IOCA = 0xA; // IOCA3 = 1, IOCA1 = 1 // разрешены прерываня при изменении состояния RA3, RA1 TRISA = 0x1D; // RA5, RA4, RA3, RA1 - входы, остальные выходы TRISC = 0x00; // весь PORTC выходы PORTA = 0x00; PORTC = 0x00;
while(1) { __delay_ms(10); } return; }
|
RA3, RA1 подтянуты к + питания через резаки 10к. Игрался с регистром WPUA результата ноль. Если в INITCON бит INTE поставить в 1 и проверять флаг INTF, то прерывания от RA2 ловятся. Железо уже готово, переделывать не хочется. Сейчас состояние RA1, RA3 проверяю по прерыванию от таймера TMR0 но это как-то совсем калично выглядит. с 628A и 819 пиками никакких проблем, что с 676 не так я делаю? PS компилятор xc8 v2.0 |