Les comento un poco lo que quiero hacer: Un pic 16f876 en modo maestro quiero que le de información a un pic 16f876

modo esclavo. Hasta ahora lo que intenta hacer mi programa es prender un par de leds en la puerta B del esclavo cada vez que recibe un dato válido. El programa cuando lo pruebo en protoboard no está funcionando, y no se como simular en mplab v7.4 la comunicación I2C. Anexo les pongo el código de ambos programas PIC Maestro *********************************************************************** ;Programa de Prueba Micro maestro ;se conecta mediante I2C con micro esclavo LIST P=16F876 INCLUDE <P16F876.INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC CBLOCK 0x21 ENDC ORG goto ORG goto 0 Inicio 4 Interrupcion

Inicio clrf PORTC ;limpio puerto c clrf PORTB ;limpio puerto b bsf STATUS,RP0 ;cambio al banco 1 movlw b'11111100' ;inicializa PORTC como entradas movwf PORTC ;PORTC 0,1 leds de visualizacion clrf PORTB ;inicializo como salidas para leds movlw b'10000000' movwf SSPSTAT ;Velocidad Standard con niveles I2C movlw .9 movwf SSPADD ;Velocidad del bus 100KHz bsf PIE1,SSPIE ;activo interrupcion del MSSP bcf STATUS,RP0 ;cambio al banco 0 movlw b'00101000' ;Modo maestro con 7 bits de direccion movwf SSPCON ;Módulo MSSP encendido bcf PIR1,SSPIF ;clear de la bandera del I2C movlw b'10000000' movwf INTCON ;activacion general de interrupciones lazo bsf PORTB,0 bcf PORTB,1 call Retardo_1s bcf PORTB,0 bsf PORTB,1 call Retardo_1s call S_START movlw 0xA2 ;Direccion esclavo b'1010001' ;modo escritura, ultimo bit 0

call SEND_B ;Indico al micro que voy a escribir movlw 0x30 ;en la posición 0x30 call SEND_B movlw 0x00 call SEND_B call S_STOP goto lazo ;del maestro via I2C Interrupcion retfie INCLUDE <RETARDOS.INC> INCLUDE <I2C_Lib.INC> end ************************************************************************** Los retardos de 1 segundo y la librería de I2C funcionan bien Ahora el código del PIC esclavo ************************************************************************* ;Programa de Prueba Micro esclavo ;se conecta mediante I2C con micro maestro

LIST P=16F876 INCLUDE <P16F876.INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC CBLOCK 0x21 ENDC ORG goto ORG goto 0 Inicio 4 Interrupcion

Inicio clrf PORTC ;limpio puerto c clrf PORTB ;limpio puerto b bsf STATUS,RP0 ;cambio al banco 1 movlw b'11111100' ;inicializa PORTC como entradas movwf PORTC ;PORTC 0,1 leds de visualizacion clrf PORTB ;inicializa PORTB como salida de leds movlw b'10000000' movwf SSPSTAT ;Velocidad Standard con niveles I2C movlw 0xA2 movwf SSPADD ;Direccion del esclavo bsf PIE1,SSPIE ;activo interrupcion del MSSP bcf STATUS,RP0 ;cambio al banco 0 movlw b'00111110' ;Modo esclavo con 7 bits de direccion movwf SSPCON ;Módulo MSSP encendido bcf PIR1,SSPIF ;clear de la bandera del I2C movlw b'10000000' movwf INTCON ;activacion general de interrupciones

lazo nop ;lazo infinito esperando datos goto lazo ;del maestro via I2C Interrupcion btfss PIR1,SSPIF ;Pregunto si fue interrupcion del I2C goto fin ;no fue bcf PIR1,SSPIF ;limpio bandera bsf PORTB,0 ;prendo leds bcf PORTB,1 call Retardo_500ms ;espero tiempo para verlo bcf PORTB,0 ;apago leds bsf PORTB,1 call Retardo_200ms ;espero a ver leds fin retfie INCLUDE <RETARDOS.INC> end *********************************************************************** Como verán, el programa es bastante simple. Se me ocurre que puede ser un error de configuración de algún registro pero no consigo dar con el error. Muchas gracias de antemano por cualquier ayuda que me puedan ofrecer