Autor Tema: COMUNICACION I2C ENTRE DOS PIC16F887  (Leído 2444 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rhochoa

  • PIC10
  • *
  • Mensajes: 11
COMUNICACION I2C ENTRE DOS PIC16F887
« en: 13 de Julio de 2016, 13:18:54 »
Saludos gente del grupo, escribo para solicitar ayuda con la comunicacion I2C entre dos pic 16f877, he leído bastante del tema pero aun no logro hacer que se comuniquen estos dos pic, básicamente busco  que el esclavo le envié un byte al maestro y que este lo mueva al puerto B,    no se que estoy haciendo mal o que no estoy haciendo por eso pido su ayuda, agradezco de antemano su ayuda, dejo el código que estoy planteando a ver que me dicen.

para el pic master

inicializacion del pic
INIT_MASTER
   BANK_0
   movlw b'00101000'            ; declaro al pic como master y habilito la comunicacion sincrona
   movwf SSPCON
   BANK_1   
   movlw b'10000000'            ; declaro que se va a utilizar en velocidad standar
   movwf SSPSTAT
   movlw .4
   movwf SSPADD            ; indico que el crystal  20 Mhz y la velocidad 1 Mhz
   bsf SSPCON2,RCEN            ; habilito la recepcion por parte del maestro
   bsf SSPCON2,ACKEN         ; habilito el envio del ACK por parte del maestro
   return

con esta subrutina pretendo leer los datos desde el maestro

leer_master
   BANK_1
   bsf SSPCON2, SEN               ; se genera la condición de inicio
   btfss SSPCON2,SEN            ; chequeo si se cumplió la condición de inicio
   goto  $-1
   BANK_0
   movlw b'10100111'            ; envió dirección al esclavo y le indico que quiero recibir datos
   movwf SSPBUF
   BANK_1               
   btfsc SSPSTAT,BF            ; chequeo que el buf este vació         
   goto  $-1                                 
   btfsc SSPCON2,ACKSTAT          ; chequeo comunicación por parte del esclavo
   goto  $-1
   btfss SSPSTAT,BF            ; chequeo que la recepción del dato esta completa
   goto  $-1
   call envia_noack                         
   BANK_0
   movfw SSPBUF               ;
   movwf PORTB                  ; muevo lo leido al pueto B para chequear la salida de algun
   BANK_1               
   btfsc SSPSTAT,BF            ; chequeo que el buf este vacio
   goto  $-1
   bsf SSPCON2,PEN               ; termino la comunicacion
   return


para el pic esclavo

Inicializo el pic como esclavo

INIT_SLAVE
   BANK_0
   movlw b'00100110'         ;
   movwf SSPCON            ; configuro el pic como slave
   BANK_1
   movlw b'10100110'
   movwf SSPADD            ; configuro la direccion segun  bits del TRISD
    return

envio de datos
slave
   BANK_1
   btfss SSPSTAT,S                  ; chequeo condicion de inicio
   goto $-1
   BANK_0
   btfsc SSPCON,SSPOV               ; chequeo que no haya overun
   goto $-1
   BANK_1
   btfss SSPSTAT,BF               ; chequeo que llego un dato o una direccion
   goto $-1
   BANK_1
   btfsc SSPSTAT,D_A               ;  chequeo si es dato o direccion
   goto  slave_leer
rw   btfss SSPSTAT,R_W         ; chequeo si el esclavo va a leer o escribir, si llego una direccion y el pic va a escribir
   goto slave_escribir
   goto slave_leer

slave_escribir                     ; subrutina para enviar datos desde el slave
   BANK_1   
   btfss   SSPSTAT,BF               ; chequeo que llego un dato
   goto $-1            
   btfsc SSPSTAT,R_W               ; chequeo si el esclavo va a leer o escribir
   goto rw
   BANK_0
   movlw b'00000011'
   movwf SSPBUF                  ; cargo en sspbuf lo que quiero enviar

   BANK_1
   btfsc SSPSTAT,BF               ; chequeo que se ha completado la transmision sspbuf vacio.
   goto $-1
   btfsc SSPCON2,ACKDT               ; chequeo si el master ha recibido el dato.
   goto $-1
   goto slave