Внешнее прерывание не работает на Proteus (PIC16F883)

Я разрабатываю базовую схему для стрелялки. Когда некоторая область цели достигнута, микроконтроллер должен добавить текущее значение к достигнутому значению.

Моя проблема в том, что я не могу заставить работать никакие прерывания на Proteus. (внешнее прерывание RB0)

Я использую компилятор Hi-tech C (бесплатная версия).

Что я делаю не так?

/* Main.c file generated by New Project wizard
*
* Created:   qua jul 12 2017
* Processor: PIC16F883
* Compiler:  HI-TECH C for PIC10/12/16
*/

#include <htc.h>



//digits (0-9)
const unsigned char disp[] = {0b00111111,0b00000110,0b01011011,0b01001111,0b01100110,0b01101101,0b01111101,0b00000111,0b01111111,0b01101111 };

//enable specific display using array index
const unsigned char ob[] = {0b00010000,0b00000010,0b00000100,0b00001000};

void set_display(int val, int display);

int value = 0; 
int total = 0;

void interrupt rb0(void){

   if(INTF){
      value = RA0 + (RA1 * 2) + (RA2 * 3) + (RA3 * 4) + (RA4 * 5) + (RA6 * 6);

      total += value;

      INTF = 0;
   }   
}

void main(void)
{

   // Set RB0 as input
   // Set RB1 - RB7 as output
   TRISB = 0b00000001;
   PORTB = 0xff;

   // Set RC as output (default 0)
   TRISC=0X00;
   PORTC=0X00;

   TRISB0 = 1;
   GIE = 1;
   PEIE = 1;
   INTEDG = 1;
   INTE = 1;   

   //Set internal oscilator to 8MHz
   IRCF2 = 1;
   IRCF1 = 1;
   IRCF0 = 1;

   while (1){
      int a = total/100;
      int b = (total/10)%10;
      int c = total%10;

      set_display(value,0);
      __delay_ms(25);

      set_display(a,1);
      __delay_ms(25);

      set_display(b,2);
      __delay_ms(25);

      set_display(c,3);
      __delay_ms(25);

   }

 }



 void set_display(int val, int display){
    PORTC = disp[val];
    PORTB = ob[display];    
 }

Целевой проект

Скачать проект (Proteus 8.5) и компилятор: https://1drv.ms/f/s!AipcmZDTZPIPlOknaPJ06hKTQbzLiA

" Внешнее прерывание не работает в Proteus (PIC16F883) " Скорее всего, вы не можете заставить внешнее прерывание работать в Proteus, а не в том, что внешнее прерывание не работает в Proteus. Более точная характеристика вашей проблемы может помочь вам быстрее найти ее первопричину.
Я думал, что добавлю несколько фрагментов кода, чтобы помочь вам, но почему-то мой пост был удален, поэтому мне некуда публиковать код. удачи в отслеживании ваших проблем.
@dannyf Я добавил ссылку для загрузки проекта и компилятора. Папка является общедоступной, и вы можете загрузить в нее любой образец файла.
Возможно, я что-то упускаю (я использую ассемблер, мне не нравятся языки с фигурными скобками), но я не вижу, чтобы вы устанавливали регистры прерывания при изменении для порта (IOCBP или IOCBN) где-либо в вашем коде.
@IanBland Глядя на таблицу данных, PIC16F883 не имеет регистров IOCBP и IOCBN. Чтобы включить прерывание, я использую: GIE (бит глобального прерывания), INTEDG (бит прерывания по переднему фронту), PEIE (бит разрешения периферийного прерывания), INTE (бит разрешения внешнего прерывания INT)
Ах да, кажется, это регистр IOCB (3-8 в таблице данных), который разрешает прерывание при изменении контактов. Я имел в виду 16F1776, над которым я сейчас работаю :) Так что для IOC на PortB бит 0, я думаю, вы хотите установить бит 0 IOCB.

Ответы (1)

При включении питания RB0 устанавливается в аналоговый режим, и все цифровые входы на выводе отключены. Чтобы включить цифровой ввод/вывод на RB0-5, вы должны очистить соответствующие биты в ANSELH.

ANSELH = 0;сделает входы PORTB цифровыми.

Поскольку вы используете RA0-6 в качестве цифровых входов, вам также следует очистить ANSEL.

введите описание изображения здесь