Implementar el protocolo I2C con 2 PICs 16F84

tengo un problema los pic 16f84 no traen el modulo I2C pero el decano quiere que nosotros lo implementemos como sea en la i2c en el pic16f84 :confused: (lenguaje emsanblador) les agradesco la colaboracion :)
 
Toma los datos del protocolo (busca en la pagina de PHILIPS o NXP), mira como funciona y solo crea las señales (data y clock) de acuerdo a los tiempos y formas y ya, no es muy complicado, solo es dedicar tiempo a ello. chauuuuuuuuu
 
gracias por tu atención estoy viendo que para dar inicio a la comunicación I2C se necesita tener la señal clock en flanco de bajada en ese instante de tiempo tengo que enviar el dato pero no se como revisar la señal de reloj he indicarme que se empezado la transmision ( hice la señal de reloj usando bcf-retardo-bsf-retardo-todo esto en un ciclo ) espero haber sido claro gracias por tu colaboracion
 
Sencillo , pones la señal de clock en el estado correcto (digamos 1) esperas un tiempo pones el dato en la señal de data, esperas un tiempo y luego pones a cero la señal de clock , asi se hace, chauuuuuuuuu
 
Nooooooo, solo pones el estado en el pin de salida coorecto (data o clock) mediante BCF o BSF y ya, no necesitas mas que retardos y cambiar de estado las salidas, chauuuuuuuuuu
 
mplab trae la aplicacion maestro que te crea librerias de rutinas para diferentes aplicaciones ,entre ellas la comunicacion i2c SPI bus CAN lcd etc y me parece que las puedes usar en cualquier dispositivo aunque no cuente con el hardawre , checalo , por que yo la verdad solo lo inetente un avez pero no lo pude usar :( pero igual y tu le hayas la maña y si lo haces pues ya me ayudas jaja , un saludo a todo el foro
 
; "**********************"
; "* Microprocesadores II *"
; "* Originally by *"
; "* Sr.Alex Erazo Ruiz *"
; "* PIC16F84A Version *"
; "* UNIVALLE *"
; "* Apr 2011 *"
; "**********************"



;PROGRAMA BASE PARA LA COMUNICACION I2C SE DEBE TENER EN
;CUENTA QUE ANTES DE ENVIAR EL I2C_ENVIABYTE( ENVIAR DATO )
;TENEMOS QUE HABER CARGADO EL DATO EN W

LIST P=16F84A
INCLUDE <P16F84A.INC>



ESTADO EQU 03H
PUERTAA EQU 05H
PUERTAB EQU 06H
F EQU 1
W EQU 0
C EQU 0

CBLOCK 0CH
I2C_CONTBITS
I2C_DATO
I2C_FLAGS
ENDC

#DEFINE I2C_LASTBYTE I2C_FLAGS,0
#DEFINE SCL PUERTAA,3
#DEFINE SDA PUERTAA,4
#DEFINE SLAVE B'10101010'


ORG 00
GOTO INICIO
ORG 05H



RETARDO4US NOP
NOP
NOP
NOP
RETURN

SDA_BAJO BSF ESTADO,5
BCF SDA
BCF ESTADO,5
BCF SDA
RETURN

SDA_ALTO BSF ESTADO,5
BCF SDA
BCF ESTADO,5
RETURN


SCL_BAJO BSF ESTADO,5
BCF SCL
BCF ESTADO,5
BCF SCL
RETURN

SCL_ALTO BSF ESTADO,5
BCF SCL
BCF ESTADO,5
RETURN
SCL_WAITALTO BTFSS SCL
GOTO SCL_WAITALTO
RETURN



;ENVIO CONDICION DE START

I2C_ENVIASTART CALL SDA_ALTO
CALL SCL_ALTO
CALL RETARDO4US
CALL SDA_BAJO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
RETURN

;ENVIO CONDICION DE STOP

I2C_ENVIOSTOP CALL SDA_BAJO
CALL SCL_ALTO
CALL RETARDO4US
CALL SDA_ALTO
CALL RETARDO4US
RETURN


;ENVIAR DATO

I2C_ENVIABYTE MOVWF I2C_DATO
MOVLW 08H
MOVWF I2C_CONTBITS

I2C_ENVIABIT RLF I2C_DATO,F
BTFSC ESTADO,C
GOTO I2C_ENVIA1

I2C_ENVIA0 CALL SDA_BAJO
GOTO I2C_FLANCOSCL

I2C_ENVIA1 CALL SDA_ALTO

I2C_FLANCOSCL CALL SCL_ALTO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
DECFSZ I2C_CONTBITS,F
GOTO I2C_ENVIABIT
CALL SDA_ALTO
CALL SCL_ALTO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
RETURN

;READ

I2C_READBYTE MOVLW 08H
MOVWF I2C_CONTBITS
CALL SDA_ALTO

I2C_READBIT CALL SCL_ALTO
BCF ESTADO,C
BTFSC SDA
BSF ESTADO,C
RLF I2C_DATO,F
CALL SCL_BAJO
CALL RETARDO4US
DECFSZ I2C_CONTBITS,F
GOTO I2C_READBIT


BTFSS I2C_LASTBYTE
CALL SDA_BAJO
CALL SCL_ALTO
CALL RETARDO4US
CALL SCL_BAJO
CALL RETARDO4US
MOVF I2C_DATO,W
RETURN

END:aplauso:

espero haberles colaborado ;)

el restoo es solo llamar a estas subrutinas ( I2C_ENVIASTART--I2C_ENVIABYTE--I2C_ENVIOSTOP ) :)
 
Última edición:
Atrás
Arriba