La interrupción externa no funciona en Proteus (PIC16F883)

Estoy desarrollando un circuito básico para un juego de disparos. Cuando se alcanza algún área del objetivo, el microcontrolador debe agregar el valor actual al valor alcanzado.

Mi problema es que no puedo hacer que ninguna interrupción funcione en Proteus. (Interrupción externa RB0)

Estoy usando el compilador Hi-tech C (versión gratuita)

¿Qué estoy haciendo mal?

/* 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];    
 }

Proyecto objetivo

Descargar proyecto (Proteus 8.5) y compilador: https://1drv.ms/f/s!AipcmZDTZPIPlOknaPJ06hKTQbzLiA

" La interrupción externa no funciona en Proteus (PIC16F883) " Es más probable que no pueda hacer que la interrupción externa funcione en Proteus, no que la interrupción externa no funcione en Proteus. La caracterización más precisa de su problema puede ayudarlo a encontrar su causa raíz antes.
Pensé en agregar algunos fragmentos de código para ayudarlo, pero de alguna manera mi publicación fue eliminada, por lo que no tengo ningún lugar para publicar el código. la mejor de las suertes en el seguimiento de sus problemas.
@dannyf Agregué un enlace para descargar el proyecto y el compilador. La carpeta es pública y puede cargar cualquier archivo de muestra en ella.
Tal vez me estoy perdiendo algo (hago ensamblador, no me gustan los lenguajes de llaves) pero no puedo verte configurando los registros Interrupt On Change para el puerto (IOCBP o IOCBN) en ninguna parte de tu código.
@IanBland Mirando la hoja de datos, el PIC16F883 no tiene los registros IOCBP e IOCBN. Para habilitar la interrupción que estoy usando: GIE (bit de interrupción global), INTEDG (bit de interrupción en el flanco ascendente), PEIE (bit de habilitación de interrupción periférica), INTE (bit de habilitación de interrupción externa INT)
Ah, sí, parece ser el registro IOCB (3-8 en la hoja de datos) que permite interrumpir el cambio en los pines. Estaba pensando en términos del 16F1776 en el que estoy trabajando en este momento :) Entonces, para un IOC en PortB bit 0, creo que desea configurar el bit 0 de IOCB.

Respuestas (1)

En el encendido, RB0 se establece en modo analógico y todas las entradas digitales en el pin están deshabilitadas. Para habilitar la E/S digital en RB0-5, debe borrar los bits apropiados en ANSELH.

ANSELH = 0;hará que las entradas de PORTB sean digitales.

Dado que está utilizando RA0-6 como entradas digitales, también debe borrar ANSEL.

ingrese la descripción de la imagen aquí