• Sábado 20 de Abril de 2024, 04:04

Autor Tema:  I2c Y Pic. Controla Memoria Y Perifericos.  (Leído 3373 veces)

Gokuden

  • Nuevo Miembro
  • *
  • Mensajes: 9
    • Ver Perfil
I2c Y Pic. Controla Memoria Y Perifericos.
« en: Domingo 10 de Abril de 2005, 21:20 »
0
hola. aqui les dejo unas rutinas que hice esta semana y funcionana a la perfeccion. junto con un ejemplo. estas rutinas estan en asm y son para los micros de microhip que posean el modulo MSSP i2c. para cualquier, probe la misma rutina en un 877a, y en un 88 y todo bien.

COSAS PARA QUE TE FUNCIONE, debes colocar el  pto PORTC como entrada, aunque no he probado solo poniendo los pines que involucran al i2c.

saben que el i2c, lleva un start, stop, envio de byte y recepcion de byte, entonces habra una rutina para cada uno y las iras llamando dependiendo de como sea la comunicacion con el periferico.

S_STAR  es la rutina de start
S_STOP es la rutina de stop
S_BYTE  es la rutina de enviar byte
R_BYTE es la rutina de recivir byte.


;-----------------INICIO, CONFIGURACION DE PTOS Y I2C-------------------
                CALL        BANK_1              ; TE CAMBIAS AL BANCO 1
                MOVLW   0FFH
   MOVWF   TRISC
   MOVLW   B'10000000'
   MOVWF   SSPSTAT
   MOVLW   .9
   MOVWF   SSPADD
   CALL   BANK_0             ; TE CAMBIAS AL BANCO 0
   MOVLW   B'00101000'
   MOVWF   SSPCON
   MOVLW   .0



;-------------RUTINAS I2C-------------------
S_START   BCF   PIR1,SSPIF   ; CON ACK
   CALL   BANK_1
   BSF   SSPCON2,SEN
   CALL   BANK_0
START_W   BTFSS   PIR1,SSPIF
   GOTO   START_W
   RETURN



S_STOP   BCF   PIR1,SSPIF
   CALL   BANK_1
   BSF   SSPCON2,PEN
   CALL   BANK_0
STOP_W   BTFSS   PIR1,SSPIF
   GOTO   STOP_W
   RETURN



S_BYTE   BCF   PIR1,SSPIF
   MOVWF   SSPBUF
SEND_B   BTFSS   PIR1,SSPIF
   GOTO   SEND_B
   RETURN


R_BYTE   BCF   PIR1,SSPIF  ;PARA GRABAR
   CALL   BANK_1
   BSF   SSPCON2,RCEN
   CALL   BANK_0
READ_W   BTFSS   PIR1,SSPIF
   GOTO   READ_W
   BCF   PIR1,SSPIF
   CALL   BANK_1
   BCF   SSPCON2,ACKDT
   BSF   SSPCON2,ACKEN
   CALL   BANK_0
ACK_W   BTFSS   PIR1,SSPIF
   GOTO   ACK_W
   MOVF   SSPBUF,W
   RETURN


;---------------------------BANCOS------------------
BANK_0   BCF   STATUS,RP0
   BCF   STATUS,RP1
   RETURN

BANK_1   BSF   STATUS,RP0
   BCF   STATUS,RP1
   RETURN

BANK_2   BCF   STATUS,RP0
   BSF   STATUS,RP1
   RETURN
   
BANK_3   BSF   STATUS,RP0
   BSF   STATUS,RP1
   RETURN






EJEMPLO

vamos a usar una memoria i2c 24c32, o 64, 128, 16, como deseen.
la conectamos a la patitas SCK y SDA con sus respectivas resistencias de pull up a Vcc de 1k.


para grabar en la memoria, primero ponemos un start, luego le enviamos un dato que es siempre el mismo que es el de indetificacion, es 10100000, donde el ultimo bit significa leer o grabar. revisar pdf. luego le mandamos la direccion alta y luego a direccion baja de donde deseamos grabar ya que tiene 11bits de direccionamiento esta memoria. y luego le mandamos un byte que es el dato para grabar, si le sigues mandando dato, el automaticamente se incrementa de direccion y va grababdo el dato, al final le mandas un stop. entonces. el programa seria asi..


                CALL   S_START      ;start   
   MOVLW   B'10100000'             ; byte identificador a W
   CALL   S_BYTE                     ; envio de byte en W, que es identificador
   MOVLW   .0                              ; direccion alta
   CALL   S_BYTE                    ; envio de direccion alta
   MOVLW   .0                            ; direccion baja
   CALL   S_BYTE                   ; envio de direccion baja
                MOVLW   .233                        ; dato a grabar en posicion 000h
   CALL   S_BYTE                   ; envio de dato a grabar
   CALL   S_STOP                  ; stop, si deseas, mandas mas datos antes de parar