Interrupcion externa con CCS y proteus

Buenaas!

He estado mirando esto de las interrupciones (la de RB0 en este caso) y no hay manera de que me funcione la interrupcion en proteus. El codigo es el siguiente
Código:
#include <16F873.h>
#device adc=8
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES LVP                      //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES NODEBUG                  //No Debug mode for ICD

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io(b)
#byte PORTB=0x06
#byte PORTA=0x05

#int_ext 
PortB_Interrupt()
{
  output_low(PIN_B3);
  delay_ms(30);
}

void main(void)
{
   set_tris_b(0b00000001);
   PORTB=0;
   enable_interrupts(GLOBAL);  
   enable_interrupts(INT_EXT);
   output_high(PIN_B3);
   while(1)
      sleep();
}

En realidad en la interrupcion deberia de mandar un mensage por puerto serie pero este codigo es para probar. El proteus no hace ni caso a la interrupcion. He probado codigos de internet para ver si hacia algo mal yo pero tampoco han funciona.

Otra preguntilla que tengo es que al acabar la funcion de la interrupcion vuelve al sleep no?

Gracias
 
Hola, el codigo que escribiste esta bien, de todas modas lo cheque en proteus y pues si funciona, cuando mando un flanco desendente al pin RB0 se apaga el led que estaba prendido, no tienes ningun problema.

Te recuerdo que normalmente el pin RB0/INT0 funciona con un flanco ascendente, osea cuando pasa la entrada de 0 a 1, y para asegurar ese funcionamiento debes de colocar una resistencia conectada a este pin y a tierra.

Si quieres que tu interrupcion se presente cuando cambie de 1 a 0 entonces debes de poner esta linea de codigo.

bit_clear( INTCON2, 6 );

Yo utilizo la RB0/INT0 para detectar el start_bit de una comunicacion serial.
Cuando llega el start_bit (cambio de 1 a 0 en la linea) salto a la interrupcion y alli leo los 8 bits transmitidos.

He probado esta comunicacion para procesar protocolo modbus en RS-485 industrial y no me ah dado ningun problema. Es una solucion muy eficaz cuando quieres mas de un puerto serie.
 
Quiero aportar algo en cuanto a la interrupcion, tu puedes configurar el tipo de flanco con el que la quieres activar de la siguiente manera:

int_ext(H_TO_L)
{
Funciones...
}

si la quieres de alto a bajo.

Si la quieres por flanco de bajada coloca (L_TO_H)
 
Yo te recomiendo que pruebes la interrupción en una placa experiemental, yo ya tuve varias experiencias con simulaciones fallidas en proteus y me ha funcionado correctamente en la realidad.
 
Yo te recomiendo que pruebes la interrupción en una placa experiemental, yo ya tuve varias experiencias con simulaciones fallidas en proteus y me ha funcionado correctamente en la realidad.

es verdad, lo acabo de corroborar, en el proteus no anda, en la realidad si. Estoy jugando con un display 16x2 y la interrupcion por la pata rb0:
El programa es muy simple, escribo en el lcd "dormido" y mando el micro a dormir, cuando recibo un pulso por la pata rb0/int, el micro despierta, prende un led y escribe en el lcd "despierto". (estoy usando CCS)
Monte en el proteus y nada.
Monte en experimentor y anda perfecto.
Si bien es la primer interrupcion que pruebo, habria q ver si el proteus anda mal con todas las interrupciones en general (flags, enables, etc), o es un problema puntual con la interrupcion rb0/int., seria una lastima q sea un problema "global de interrupciones" porq todos los proyectos que probe hasta ahora sin interrupciones me anduvieron en proteus. Alguien puede corroborar esto? Igualmente tengo q probar muchas asi q si nadie lo hace, volvere a contarles como me fue

saludos
 
A mi me funciona bien en Proteus la INT_EXT, pero la INT_EXT1 y INT_EXT2 no se simulan, es cómo si me anulara la Interrupción. Estoy utilizando un PIC18F2550
 
Algo debes estar haciendo mal.
Sin embargo, es mejor que funcionen físicamente.

Adjunto un ejemplo básico de uso de las interrupciones externas.
 

Adjuntos

  • 18F2550 Interrupciones externas.rar
    27.1 KB · Visitas: 4
Atrás
Arriba