Manejo de la memoria EEPROM pic 16f887

Buenas, es primera vez que escribo en el foro y espero tengan paciencia ya que estoy empezando en el tema de programar PIC´s.

Estoy realizando un proyecto: controlador por tonos dtmf.

La parte de decodificar es sencillo, lo hice con un MT-8870, ahora tengo cada tono del teclado en binario. Cada bit esta conectado al puerto B del PIC (PIN_B0, PIN_B1, PIN_B2, PIN_B3).

pregunta: ¿Cómo hago para que el PIC me guarde la combinación binaria (por ejemplo: El numero 1 = 0001,
el asterisco * = 1011) como el digito 1, y * en la memoria en un vector de 4 elementos, que puedan ser el codigo para activar por ejemplo el PIN_C1 ?

Muchas gracias por los aportes. ...
 
Guárdalo así como lo muestras, en cada localidad de la memoria puedes grabar 8 Bits (Un Byte)
Si el número 1 lo muestras como b'0001' en realidad es b'00000001' = 0x01 ó 001 Decimal
Para el asterisco sería b'00001011' = 0x0B ó 011 Decimal.

Si lo que quieres es obtener el estado del nibble bajo del puerto B puedes sencillamente poner la parte alta en 0.

También puedes usar una mascara para obtener los bits del nibble bajo.

¿Cual es el problema?
 
Última edición:
Buenas, es primera vez que escribo en el foro y espero tengan paciencia ya que estoy empezando en el tema de programar PIC´s.

Estoy realizando un proyecto: controlador por tonos dtmf.

La parte de decodificar es sencillo, lo hice con un MT-8870, ahora tengo cada tono del teclado en binario. Cada bit esta conectado al puerto B del PIC (PIN_B0, PIN_B1, PIN_B2, PIN_B3).

pregunta: ¿Cómo hago para que el PIC me guarde la combinación binaria (por ejemplo: El numero 1 = 0001,
el asterisco * = 1011) como el digito 1, y * en la memoria en un vector de 4 elementos, que puedan ser el codigo para activar por ejemplo el PIN_C1 ?

Muchas gracias por los aportes. ...

Hola...Bienvenido al foro...Para que te podamos ayuda debes decirnos en que lenguaje de programación estas trabajando ya que no todos sabemos de todos los lenguajes y cada uno tiene su tratamiento...de todas formas en la barra superior donde dice "Google Búsqueda personalizada" que es el buscador del foro si colocas "MT 8870" te traerá un montón de enlaces a revisar con mensajes que ya trataron el tema y podrás sacar la mayoría de tus dudas.
Saludos.

Ric.
 
>Muchas gracias por el aporte Darkbytes...trataré de realizar el codigo para subirlo.

El lenguaje que utilizo es en Ccompiler ricbevi... Gracias miraré la informacion que me dices.
 
Yo estoy trabajando también con la EEPROM, pero tengo un problema.
Tengo una variable que guarda un conteo, dicha variable puede llegar a tomar un valor de hasta 6000 "unidades" ese valor quiero guardarlo en la EEPROM, pero en una sola dirección o ubicación en la EEPROM no guarda un valor tan grande.
Creo que lo máximo que guarda es hasta 256.

¿Me podrán ayudar en eso?

Gracias.

Pdt. Programo en basic con protón ide
 
Última edición por un moderador:
Yo estoy trabajando también con la EEPROM, pero tengo un problema.
Tengo una variable que guarda un conteo, dicha variable puede llegar a tomar un valor de hasta 6000 "unidades" ese valor quiero guardarlo en la EEPROM, pero en una sola dirección o ubicación en la EEPROM no guarda un valor tan grande.
Creo que lo máximo que guarda es hasta 256.

¿Me podrán ayudar en eso?

Gracias.

Pdt. Programo en basic con protón ide
Puedes guardar 1 Byte por dirección 0 a 255, no hasta 256.
Lo que puedes hacer es usar dos direcciones de memoria y guardar en una el Low Byte y en otra el High Byte.

Luego las lees y las sumas para obtener el valor de la variable Word.
 
Puedes guardar 1 Byte por dirección 0 a 255, no hasta 256.
Lo que puedes hacer es usar dos direcciones de memoria y guardar en una el Low Byte y en otra el High Byte.

Luego las lees y las sumas para obtener el valor de la variable Word.


Y como hago eso??




Puedes guardar 1 Byte por dirección 0 a 255, no hasta 256.
Lo que puedes hacer es usar dos direcciones de memoria y guardar en una el Low Byte y en otra el High Byte.

Luego las lees y las sumas para obtener el valor de la variable Word.
 
Y como hago eso??
Para no sumar los valores, puedes hacerlo de una forma sencilla.
Tienes tu variable tipo Word, por ejemplo...
Dim Cuenta As Word
Dim Cuenta_Alta As Cuenta.HighByte ; Cuenta_Alta tendrá el Byte Alto de Cuenta.
Dim Cuenta_Baja As Cuenta.LowByte ; Cuenta_Baja tendrá el Byte Bajo de Cuenta.

Y luego guardas los datos suponiendo que la variable Cuenta tiene el valor de 1024...
Cuenta = 1024
EWrite 0,[Cuenta_Alta] ; Guarda en la EEPROM dirección 0 el Byte Alto de Cuenta.
DelayMS 10
EWrite 1,[Cuenta_Baja] ; Guarda en la EEPROM dirección 1 el Byte Bajo de Cuenta.
DelayMS 10

Después recuperas el valor de esta forma...
Cuenta = 0 ; Esto lo pongo sólo para limpiar la variable cuenta (No es necesario, sólo es para que compruebes lo que sigue a continuación)

Cuenta_Alta = ERead 0 ; Se lee la dirección 0 de la EEPROM (Contiene el Byte Alto de Cuenta)
DelayMS 10
Cuenta_Baja = ERead 1 ; Se lee la dirección 1 de la EEPROM (Contiene el Byte Bajo de Cuenta)
DelayMS 10

Después de está parte la variable Cuenta ya tiene nuevamente el valor 1024 que se guardó anteriormente. :cool:

Disculpa si en algo me equivoco, el código lo escribí aquí mismo, pero en sí, esa es la idea.

Saludos.
 
Última edición:
Para no sumar los valores, puedes hacerlo de una forma sencilla.
Tienes tu variable tipo Word, por ejemplo...
Dim Cuenta As Word
Dim Cuenta_Alta As Cuenta.HighByte ; Cuenta_Alta tendrá el Byte Alto de Cuenta.
Dim Cuenta_Baja As Cuenta.LowByte ; Cuenta_Baja tendrá el Byte Bajo de Cuenta.

Y luego guardas los datos suponiendo que la variable Cuenta tiene el valor de 1024...
Cuenta = 1024
EWrite 0,[Cuenta_Alta] ; Guarda en la EEPROM dirección 0 el Byte Alto de Cuenta.
DelayMS 10
EWrite 1,[Cuenta_Baja] ; Guarda en la EEPROM dirección 1 el Byte Bajo de Cuenta.
DelayMS 10

Después recuperas el valor de esta forma...
Cuenta = 0 ; Esto lo pongo sólo para limpiar la variable cuenta (No es necesario, sólo es para que compruebes lo que sigue a continuación)

Cuenta_Alta = ERead 0 ; Se lee la dirección 0 de la EEPROM (Contiene el Byte Alto de Cuenta)
DelayMS 10
Cuenta_Baja = ERead 1 ; Se lee la dirección 1 de la EEPROM (Contiene el Byte Bajo de Cuenta)
DelayMS 10

Después de está parte la variable Cuenta ya tiene nuevamente el valor 1024 que se guardó anteriormente. :cool:

Disculpa si en algo me equivoco, el código lo escribí aquí mismo, pero en sí, esa es la idea.

Saludos.

Ok muchas gracias. Más luego pruebo y te comento que tal me fue.

---------- Actualizado después de 3 horas ----------

cguerrero1205 dijo:
Ok muchas gracias... Más luego pruebo y te comento que tal me fue :thumbup:


Si me sirvió :D gracias
 
Última edición por un moderador:
Guárdalo así como lo muestras, en cada localidad de la memoria puedes grabar 8 Bits (Un Byte)
Si el número 1 lo muestras como b'0001' en realidad es b'00000001' = 0x01 ó 001 Decimal
Para el asterisco sería b'00001011' = 0x0B ó 011 Decimal.

Si lo que quieres es obtener el estado del nibble bajo del puerto B puedes sencillamente poner la parte alta en 0.
Solo que así el resultado es diferente. Para el número 1 sería b'00010000' 0x10 ó 016 Decimal.
Para el asterisco sería b'10110000' 0xB0 ó 176 Decimal.

También puedes usar una mascara para obtener los bits del nibble bajo.

¿Cual es el problema?

El problema es que no sé bien como manejar las funciones y/o directivas para guardar los datos en la memoria.
Lo que hice fue mirando de diferentes partes en la web.

Este fue el código que yo hice para guardar una clave de 4 dígitos que si en el puerto B es igual a la clave me permita activar el PIN_C0.
Espero me puedan ayudar. Muchas gracias.

Código:
#include <16f887.h>
#fuses XT, NOWDT, MCLR
#use delay (clock=4M)

#use standard_io(B)
#use standard_io(C)

#rom 0x2100 = {'*', '1', '1', '#'} // esta es la contraseña

char clave[4];  //Vector clave.
char dato[4];   // vector dato, almacena lo leido en el port_b.     
int i;             //contador.

void main()
{  
 while(TRUE){
       i=0;             
       while(i<4){
                  
                  input_B();               //leemos el puerto B
                  
                  if(input_B()!=0)        // si se ha pulsado alguna tecla
                  dato[i]=input_B();    // se guarda en el vector dato
                      i++;
                  } 
                      for(i=0; i<4; i++)
                         clave[i] = read_eeprom(i);  // Guarda la contraseña en el vector clave
               
      //Comparo cada posicion del dato con la clave, si son iguales que me activen el PIN_C0
                       
      if(dato[0]==clave[0]&&dato[1]==clave[1]&&dato[2]==clave[2]&&dato[3]==clave[3])
 
         output_high(PIN_C0); 
    
         else
         output_low(PIN_C0);
        
                }  
 
 
   
}
 
Última edición por un moderador:
El problema es que no sé bien como manejar las funciones y/o directivas para guardar los datos en la memoria.
Lo que hice fue mirando de diferentes partes en la web.
Quizás este ejemplo que adjunto te pueda servir cómo base para lo que pretendes realizar.
El programa realiza una comparación de una clave de 4 dígitos la cual se ingresa por el puerto B.
Cómo es difícil saber cuando se ha ingresado un número por el puerto B, lo he realizado esperando cierto tiempo.
También se va mostrando con LED's que dígito es el que se está comparando.

El código está comentado y adjunto también la simulación para que en modo "debug" puedas ver lo que sucede.

Espero te sirva el ejemplo.

Suerte.
 

Adjuntos

  • 16F887 Comparar Clave en Puerto B.rar
    40.7 KB · Visitas: 39
Atrás
Arriba