Está en la página 1de 3

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 0
goto Inicio
ORG 4
goto 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 0
goto Inicio
ORG 4
goto 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