que tal carpoolo,
Después de algunas simulaciones en el proteus. El código que has colocado no funciona ni con el PIC16F877A, incluso arme el circuito en vivo y ni así trabajó.
Lo primero que me di cuenta es que estás generando un código reentrante con la interrupción. Por lo que estás forzando una interrupción externa que no es necesaria, ya que el ibutton funciona por polling. Así que lo que hice fue lo siguiente:
#include <18F4550.h>
#device ADC=10
#FUSES NOFCMEN //Fail-safe clock monitor disabled
#FUSES NOIESO //Internal External Switch Over mode disabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOVREGEN //USB voltage regulator disabled
#FUSES NOPBADEN //PORTB pins are configured as digital I/O on RESET
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#use delay(crystal=20000000)
#define LCD_ENABLE_PIN PIN_D3 ////
#define LCD_RS_PIN PIN_D1
#define LCD_RW_PIN PIN_D2 ////
#define LCD_DATA4 PIN_D4 ////
#define LCD_DATA5 PIN_D5 ////
#define LCD_DATA6 PIN_D6 ////
#define LCD_DATA7 PIN_D7 ////
#include <LCD.C>
#include <TOUCH.C>
int8 Llave[8];
int8 valor,i;
void main()
{
//enable_interrupts(INT_EXT);
//enable_interrupts(GLOBAL);
lcd_init();
printf(lcd_putc,"Inserte Llave");
while(TRUE)
{
if(touch_present()==1)
{
touch_write_byte(0x33);
for(i=0;i<8;i++)
{
Llave[i]=touch_read_byte();
}
printf(lcd_putc,"\fFlia: %2x CRC: %2X\nid: ",Llave[0],Llave[7]);
for(i=1;i<7;i++)
{
printf(lcd_putc,"%2X",Llave[7-i]);
}
delay_ms(1000); //Delay para alcanzar a visualizar el ID del ibutton
printf(lcd_putc,"\fInserte Llave");
}
}
}
Como te puedes dar cuenta eliminé completamente la interrupción, y solo dejé el main. Espero que esto te sirva. Realicé la simulación proteus para el PIC18F4550 y funcionó perfectamene. No puedo hacerlo en vivo, ya que como te comenté no cuento con ningún PIC18F4550.
Saludos.
Elreypic.