# PIC 16F84 y memorias 24LCxx + I2C



## Ivan N. (Ago 9, 2006)

Estoy desarrollando un proyecto para la escuela que involucra bastante el tema y me surgió una problemática. Lo que tengo q hacer es que cuando se marcan números en un teléfono ir almacenándolos para después comparar el numero al que se quiere llamar con una lista de números previamente guardados. El problema se da cuando me doy cuenta que en la memoria que trae el pic internamente... no me alcanzan a entrar una cantidad mas o menos grandes de números telefónicos (en el caso del pic16F84 por ej.) y me dijeron que me veo obligado a utilizar una memoria externa del tipo 24LCxx que funcionan con el famoso I2C. Bueno el problema en cuestión es como hago yo con un PIC 16F84 para grabar datos en esa memoria y como hago para leer los datos de esa memoria? Estube leyendo la hoja de datos del pic y algo explica unas rutinas que tienen que ver con el EEDATA y el EEADR o algo similar , pero mucho no las entiendo así que si alguien es tan amable de subir algún ejemplo practico del uso de este tipos de memorias con este pic o alguno similar de la gama media se agradece 

Otra duda aparte que me surgió investigando por ahí... vi q algunos pics traen I2C pero como slave nada mas (como el caso del pic16F84) y hay otros q traen I2C como slave y como master.. que diferencias hay entre uno y otro?

Desde ya muchas gracias!


----------



## leo_programer (Ago 11, 2006)

Hay varias cosas que no me quedaron claras, el pic16f84 tiene un modulo de i2c?, enseñemelo por que yo he desbaratado y desarmado este pic (exagerando un poco) y no encontrado forma de utilizar i2c que no sea por hardware, muy curioso lo que posteas, pero solo por si estabas confundido, este pic no trae dicho modulo, o al menos que el manual que me baje de la pagina estuviera equivocado, y aparte de eso los pic16f84 que venden en colombia no tuvieran esa característica, pero de resto le toca por software hacer las rutinas, ahí le mando unas que no tengo ni idea si están autorizadas para ser publicadas, que el moderador revise esto y lo quite llegado el caso, por lo pronto si quiere un pic pequeño que tenga i2c, le aconsejo el pic16f818, o el pic16f819, son de la misma potencia que un pic 16f877 pero en versión de 18 patas.

otra cosa, eedata y eeadr son para grabar en la memoria eeprom interna del micro, tiene 64 bytes para ser grabados, revisa ese link que le posteo luis, veo que hay cosas interesantes, mas sin embargo no pude ver ningún tema, a menos que comprara el libro, pero no quiero, en todo caso, no esta tan complicado, lee con calma y vera que es fácil, si quiere le mando mi ejemplo también sobre la eeprom interna del micro, y mire, 
dependiendo de lo que quiere, ud puede grabar si quiere hasta 16 números telefónicos de 10 dígitos en la eeprom interna del micro, y hasta 17 números telefónicos iguales en la ram del micro sin utilizar ninguna especie de variables, dejaria sin memoria el micro guardando 33 números telefónicos, que como?, ...
mire, para hacer algo como eso, yo leería numero por numero y los almacenaría numero a numero, byte por byte como si se tratara de un caracter, y en este caso cada numero ocuparía hasta 10 bytes, pero es mejor si lo que hacemos es meterlos todos en una variable del tipo DWORD, doble palabra, 32 bits, 4 bytes, se hace una subrutina, una función, una macro o lo que sea que tenga como parámetro estos diez números y los concatene uno a uno, el primero como la unidad, el siguiente como la decena, y así, solo tendría que leer cada cuatro posiciones de memoria, y tenemos nuestro 33 números, es una sugerencia, si no le sirve, pues busque la memoria, pero le aconsejo que busque un micro que tenga i2c por módulos, para evitar desperdiciar la memoria de programa haciendo las subrutinas del i2c, eso va dependiendo de lo que ud quiere, no le aseguro que funcione por que no las probé, pero mire haber, la vida te da sorpresas, sorpresas teda la vida, ay Dios, cualquier cosa me avisa, cuídese...


----------



## Ivan N. (Ago 11, 2006)

Muchas gracias por los ejemplos me vienen muy bien ^_^
Y tenes razon, desde ese ultimo posteo e seguido investigando el tema y encontre algunos documentos sobre como trabaja bien el protocolo y las diferencias que hay. EL 16F84 trae I2C, pero el SSP (syncronus serial port) y unicamente sirve para usar como slave, por lo q si se quiere usar como master (como en el caso de la memoria) hay que hacer toda la adapatacion de software que aparece en el ejemplo.
Y por otro lado estan lso pics q traen el modulo MSSP (master syncronus serial port) que estos segun tengo entendido no necesitan ninguna adaptacion de software, por q lo traen en el mismo hardware. 
Pero hasta ahora no he podido encontrar un ejemplo explicito de como guardar o leer algun dato en la memoria usando este modulo MSSP. si alguien tiene algun ejemplo de esto por favor posteelo. 

Desde el vamos supongo que la programacion que se ahorra usdando un pic con MSSP debe ser bastante significativa, verdad?

Desde ya muchas gracias!


----------



## Aioria (May 2, 2007)

Ivan , si queres saber la posta de como se controla i2c con el pic, se sugiero visitar esta pagina que tiene un ejemplo muy claro de como se utiliza ese protocolo para comunicarse con una eeprom. Te sugiero que te armes de paciencia porque yo todavia sigo luchando con este protocolo, una cosa es la teoria y otra es la practica !!! como todos los electronicos sabemos , la primera vez que armes un circuito , no te va a funcionar, por mas simple que sea !!! asi que Hay que ser tenaz, probar y probar hasta que salga !!!
suerte !!!!!!!!


----------



## Aioria (May 2, 2007)

jejeje me olvidaba de poner la pagina indicada !!! :
http://picmania.garcia-cuervo.com/Experimentos.htm#EXP-10


----------



## sebitronic (Mar 15, 2009)

te aconsejo que use un pic 16f873 que tra I^2C  y usart en modo master y slave


----------



## Dari Valencia (Ene 7, 2010)

mira esto que me encontré http://www.phanderson.com/PIC/PICC/CCS_PCM/24_256_1.html


----------



## sebitronic (Ene 7, 2010)

otra cosa que podes hacer es programarlo en basic que viene con rutinas de manejo muy simple para la memorias I2C, otra cosa el PIC16F84 no tien I2C ni como mastr ni como slave, te aconsejaria que uses un micro de la familia 16F87x que traen I2C por hardware e implementan todas las funciones tanto de master como slave.


----------



## CEROVOLT (Mar 24, 2012)

hola amigo , yo te recomiendo que utilices un pic16f887 el cual tiene modulos de comunicacion MSSP claro por hardware y ademas puedes cambiarlo por software y te facilitaria cambiar hacia los pines que te queden disponibles , si es que colocas algun teclado , lcds o hagas ADCS


----------



## Mortz (Ago 24, 2013)

Hola amigo, tienes algún ejemplo para el 887 que mencionas? yo encontré esta librería, pero no me da...


```
;**************************************************************************************************
;SUBRUTINAS
;**************************************************************************************************
;env?a la condici?n de inicio
S_START        BCF        estado,5
            BCF        estado,6
            BCF        pir1,sspif
            BSF        estado,5
            BCF        estado,6
            BSF        sspcon2,sen        ;activa la secuencia de inicio
            BCF        estado,5
START_W        BTFSS    pir1,sspif        ;comprueba si ha terminado
            GOTO    START_W
            RETURN


;reenv?a la condici?n de inicio se usa para enviar el start sin enviar el stop primero
RS_START    BCF        estado,5
            BCF        estado,6
            BCF        pir1,sspif
            BSF        estado,5
            BCF        estado,6
            BSF        sspcon2,rsen        ;reactiva la secuencia de inicio
RSTART_W    BTFSC    sspcon2,rsen        ;comprueba si ha terminado
            GOTO    RSTART_W
            BCF        estado,5
            BCF        estado,6
            RETURN


;env?a la secuencia de parada
S_STOP        BCF        estado,5
            BCF        estado,6
            BCF        pir1,sspif            ;restaura el flag MSSP
            BSF        estado,5    
            BCF        estado,6
            BSF        sspcon2,pen            ;activa la secuencia de parada
            BCF        estado,5
STOP_W        BTFSS    pir1,sspif        ;comprueba si ha terminado
            GOTO    STOP_W
            RETURN

;Env?o del byte que se encuentra en W v?a I2C. La rutina finaliza cuando se escribe le ACK
SEND_B        BCF        estado,5
            BCF        estado,6
            BCF        pir1,sspif        ;restaura el flag MSSP
            MOVWF    sspbuf            ;llevar byte a buffer de salida
SEND_B_W    BTFSS    pir1,sspif        ;Pregunta si se ha recibido el ACK desde el esclavo
            GOTO    SEND_B_W        
            RETURN

;Lee un byte procendente del dispositivo I2C seleccionado y lo mete en W, seguidamente emite un ACK

READ_B        BCF        estado,5
            BCF        estado,6
            BCF        pir1,sspif            ;restaura el flag MSSP
            BSF        estado,5
            BCF        estado,6
            BSF        sspcon2,rcen        ;activa el modo receptor
            BCF        estado,5
READ_W        BTFSS    pir1,sspif            ;pregunta si el byte se ha recibido
            GOTO    READ_W
            MOVF    sspbuf,0                
            BCF        pir1,sspif            ;restaura el flag MSSP
            BSF        estado,5
            BCF        estado,6
            BCF        sspcon2,ackdt        ;pone el ACK a cero
            BSF        sspcon2,acken        ;activa la generaci?n del ACK
            BCF        estado,5
ACK_W        BTFSS    pir1,sspif            ;Pregunta si la secuencia del ACK finaliz?
            GOTO    ACK_W
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            RETURN


;Lee EL ULTIMO BYTE un byte procendente del dispositivo I2C seleccionado y lo mete en W, seguidamente emite un NACK para terminar

READ_B_LAST    BCF        estado,5
            BCF        estado,6
            BCF        pir1,sspif            ;restaura el flag MSSP
            BSF        estado,5
            BCF        estado,6
            BSF        sspcon2,rcen        ;activa el modo receptor
            BCF        estado,5
READ_W_LAST    BTFSS    pir1,sspif            ;pregunta si el byte se ha recibido
            GOTO    READ_W_LAST
            MOVF    sspbuf,0            
            BCF        pir1,sspif            ;restaura el flag MSSP
            BSF        estado,5
            BCF        estado,6
            BSF        sspcon2,ackdt        ;pone el NACK a cero
            BSF        sspcon2,acken        ;activa la generaci?n del NACK
            BCF        estado,5
            BCF        estado,6
NACK_W_LAST    BTFSS    pir1,sspif            ;Pregunta si la secuencia del ACK finaliz?
            GOTO    NACK_W_LAST
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            RETURN





;Envio un NACK al dispositivo I2C seleccionado se usa en muchos para acabar la lectura de un dispositivo

GEN_NACK    BSF        estado,5            ;GENERA UN NOT ACK
            BCF        estado,6
            BSF        sspcon2,ackdt        ;pone el NACK a cero
            BSF        sspcon2,acken        ;activa la generaci?n del NACK
            BCF        estado,5
            BCF        estado,6

NACK_W        BTFSS    pir1,sspif        ;Pregunta si la secuencia del NACK finaliz?
            GOTO    NACK_W
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            RETURN
```


----------

