Académique Documents
Professionnel Documents
Culture Documents
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.
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
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.