Autor Tema: Lectura de datos en memoria sacados a LCD  (Leído 4213 veces)

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

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
Lectura de datos en memoria sacados a LCD
« en: 25 de Abril de 2005, 04:50:00 »
Hola tod@s!!
Necesitaba un programa en C que hiciera lo siguiente.
Tengo un teclado matricial 4x4, una LCD, y símplemente me piden que pueda leer y escribir datos. El micro utilizado es un PIC16F877, y tambien tengo una memoria EEPROM (93LC66).Por ejemplo me piden:
Que pulsando el 1 del teclado--> Que me aparezca en la LCD "Temperatura ambiente= xxxx" las xxxx será el dato que hay cargado en una dirección de memoria que le digamos.
Con el 2-->"Temperatura de calefacción=yyyy"
Con el 3-->"Porcentaje ventilador=zzzz"
Con el 4-->Poder escribir nosotros un valor de temperatura en memoria desde el teclado y que a la vez me aparezca en la LCD.

Sería simplemente como realizar una especie de menú donde pueda leer y escribir en memoria. Por cierto, escribiria en la memoria ram del micro o en la EEPROM??

Muchas gracias por tu aportación, Un saludo.

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #1 en: 25 de Abril de 2005, 06:55:00 »
Codigo:
Por cierto, escribiria en la memoria ram del micro o en la EEPROM??


Si te piden que uses el modulo de memoria EEPROM si, si no te piden que uses la memoria EEPROM es mucho mas sencillo usar la memoria del PIC, y usar variables normales.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #2 en: 25 de Abril de 2005, 09:41:00 »
Que onda jdj,
una de las grandes ventajas de este foro sobre cualquier otro foro en la red, es que ontiene una infinidad de ejemplos aportados por todos los usuarios, Si estas usando c "quiero " suponer que estas usando CCs, Tienes el Microcursillo de c donde puedes aprender este y muchos temas mas relacionados, y veras que no es nada dificil hacer el programa que requieres. Como basse de lo que buscas podrias buscar en la web del pana Modulay con muchos ejemplos diversos y de gran calidad:
http://personal.auna.com/asencio5/Ejemplos%20C/
Aqui un ejemplo del uso de lcd:
http://personal.auna.com/asencio5/Ejemplos%20C/LCD/Dado2%20por%20migsantiago.zip
Aqui hay un ejemplo de como usar una memoria EXTERNA(eeprom)
http://personal.auna.com/asencio5/Ejemplos%20C/I2C/I2C%201%20por%20migsantiago.zip
Aui un ejemplo en conjunto con dos pics, una memoria y Lcd, leyendo y escribiendo datos
http://personal.auna.com/asencio5/Ejemplos%20C/I2C/I2C%202%20por%20Lager.zip
Todos estos y muchos mas, los puedes localizar en su sitio:
http://personal.auna.com/asencio5/Ejemplos%20C/
Ahora que si en realidad quieres APRENDER , entonces reviza este microcursillo en c:
http://miarroba.com/foros/ver.php?foroid=46840&temaid=2307248 , esta de lujo!

Espero y te sean de utilidad para tu proyecto
Salu2 pana Sonrisa

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #3 en: 26 de Abril de 2005, 05:01:00 »
muchas gracias Langer!! inentaré hacer algo y si tengo duadas  las coloco aqui ok??

Tornar, no me han dicho nada de si leerlo desde la ram del micro o desde la EEPROM, no se desde donde es mas facil hacerlo.

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #4 en: 28 de Abril de 2005, 10:04:00 »
Hola de nuevo !!

No se si esto está bien hecho he direccionado la memoria EEPROM.por ejemplo:
//Dirección de Inicio y tamaño de cada uno de los Buffers dentro de la EEPROM
#define DIR_INI_EEVE_TEMP_VENTILACIÓN 0 // 2 byte (Temp.de la sala)
#define SIZE_EEVE_TEMP_VENTILACIÓN 16
define DIR_INI_EEVE_TEMP_CALEFACCIÓN 16 // 2byte (Temp. de calefacción)
#define SIZE_EEVE_TEMP_CALEFACCIÓN 16
#define DIR_INI_EEVE_VENTIL_MÍN 32 // 2Byte (Temp. Ventilación)
#define SIZE_EEVE_VENTIL_MÍN 16
#define DIR_INI_EEVE_TEMP_NIDO 48 // 2byte(Temp.de nido(Temp.en placa))
#define SIZE_EEVE_UNID_TEMP_NIDO 16

Ya tengo unas rutinas de como leer datos y escribir en la EEPROM.
Pero no se que menú crear para que por ejemplo cuando quiera leer la TEMP_VENTILACIÓN, tendré que referenciarme a la dirección??, que dirección es??
Puedo poner la que yo quiera pero no si ni cual se pone, ni como se referencia a esa dirección.
Si me popdeis hechar una manita......
gracias, un saludo.

Desconectado tornar

  • PIC18
  • ****
  • Mensajes: 342
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #5 en: 29 de Abril de 2005, 05:08:00 »
Codigo:
Ya tengo unas rutinas de como leer datos y escribir en la EEPROM. Pero no se que menú crear para que por ejemplo cuando quiera leer la
TEMP_VENTILACIÓN, tendré que referenciarme a la dirección??, que dirección es??


1º) Te aconsejo que postees esas rutinas, para que veamos exactamente que es lo que hacen y como lo hacen.

2º) Seguramente puedas usar un nombre que tu elijas para referenciar a cada direccion de la EEPROM donde tengas almacenado un dato, para que no sea tan engorroso todo.

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #6 en: 02 de Mayo de 2005, 03:42:00 »
Aqui estan las rutinas que tengo de lectura y escritura en la EEPROM, pero no se como sacar un dato guardado por ejemplo el de TEMP, le tendré que decir la dirección en la que está guardada para sacarla o simplemente con llamar a la variable TEMP valdria??????



//************************************************************
//FUNCION: void float_e2prom(float numero,unsigned int adr)
// RECIBE: float a escribir a partir de la dirección adr
// DEVUELVE: NADA
//
// Escritura de un float en la EEPROM    
//************************************************************
void float_e2prom(float numero,unsigned int adr){

   
    byte_e2prom(*(unsigned char *)&numero,adr);         //Almacena en Big Endiand
   byte_e2prom(*((unsigned char*)&numero+1),adr+1);
    byte_e2prom(*((unsigned char*)&numero+2),adr+2);   
   byte_e2prom(*((unsigned char*)&numero+3),adr+3);
    
}

//************************************************************
//FUNCION: float e2prom_float(unsigned int adr)
// RECIBE: dirección adr donde se encuentra el float a leer
// DEVUELVE: float leído en la dirección adr
//
// Lectura de un float en la EEPROM    
//************************************************************
float e2prom_float(unsigned int adr){
float numero;
unsigned char banco=0;
unsigned int adr1;

   adr1=adr;   
   if(adr1>0xff)                // Comprueba si la dirección pertenece al banco 0
   {                          // (adr<=256) o al banco 1 (adr>2545)
      adr1-=0x100;
      banco=2;
   }
   STOP;                  // Macro de inicializacion o fin de comunicacion i2C
    START;                  // Macro de comienzo de comunicacion i2C
    w_ee(0xa0+banco);        // Direccionamiento para escritura
    w_ee((unsigned char)adr1);  // Direccion incial de memoria
    REPOSO;                  // Macro de reposo lineas SCL y SDA del i2C
    START;
    w_ee(0xa1+banco);        // Direccionamiento para lectura
   ( * (char *) &numero )=r_ee();
    SI_ACK;
    ( * ((char *) &numero + 1 ))=r_ee();
   SI_ACK;
    ( * ((char *) &numero + 2 ))=r_ee();
   SI_ACK;
    ( * ((char *) &numero + 3 ))=r_ee();
   NO_ACK;   
   STOP;
   REPOSO;
    return(numero);
}

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #7 en: 02 de Mayo de 2005, 03:57:00 »
Aqui tengo otra rutina para leer el dato guardado de la EEPROM y sacarlo a la LCD, pero no se scomo funcionaría.


//************************************************************
//FUNCION: long rd_long_lcd(unsigned int adr,char x_lcd,char y_lcd )
// RECIBE: dirección adr donde se encuentra el long y coord del lcd
// DEVUELVE: long leído en la dirección adr
//
// Rutina para leer de la  E2PROM un long          
// presenta el dato en en LCD (x,y)                      
//*********************************************************
long rd_long_lcd(unsigned int adr,char x_lcd,char y_lcd )
{
char bufhex [8];
unsigned char i,n;
long muestra;

    muestra=e2prom_long(adr);
   n=sprintf(bufhex,"%lu",muestra);   
   lcd_gotoxy(x_lcd,y_lcd);
   for (i=0;i<8;i++)
   {
      if (i<n) lcd_write_DR(bufhex);
      else lcd_str(" "Giño;
      lcd_delay(100);         
   }
   return(muestra);
}

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #8 en: 03 de Mayo de 2005, 02:09:00 »
CASI MEJOR LO HARÉ CON ENTEROS.
Aqui os pongo las rutinas de escritura y lectura en la EEPROM.
Querría saber si alguien me podia ayudar algún menú en C, que sea sencillo para controlar todo esto desde un teclado matricial.
Simplemente tendría que pulsar por ejemplo el 1 del teclado y poder leer el dato que haya en la direción 0x00 de mi EEPROM,.
Con el 2, poder acceder a la EEPROM y sacar el dato contenido en la dirección 0x02.
Por ejemplo con el 3, poder escribir un dato en la posición 0x03 de la EEPROM.


Rutinas de la EEPROM.De lectura y escritura:
//***********************************************************************************
// F_eeprom.C
//Funciones de manejo de la EEPROM I2C ATMEL 24C04
//***********************************************************************************
#include <F_eeprom.h>
#include <stdio.h>
#include <reg51.h>
#include <ctype.h>
#include <sfr.h>
#include <absacc.h>
#include <lcd.h>
#include <i2c.h>

void int_e2prom(unsigned int numero,unsigned int adr);
unsigned int e2prom_int(unsigned int adr);
unsigned int rd_int_lcd(unsigned int adr,char x_lcd,char y_lcd );


//************************************************************
//FUNCION: void int_e2prom(unsigned int numero,unsigned int adr)
// RECIBE: unsigned int a escribir a partir de la dirección adr
// DEVUELVE: NADA
//
// Escritura de un int en la EEPROM
//************************************************************
void int_e2prom(unsigned int numero,unsigned int adr){

cs=0;
byte_e2prom((unsigned char)numero,adr+1); //Almacena en Big Endiand
numero>>=8; //1º MSB y luego LSB
byte_e2prom((unsigned char)numero,adr);
cs=1;

}

//************************************************************
//FUNCION: unsigned int e2prom_int(unsigned int adr)
// RECIBE: dirección adr donde se encuentra el int a leer
// DEVUELVE: unsigned int leído en la dirección adr
//
// Lectura de un int en la EEPROM
//************************************************************
unsigned int e2prom_int(unsigned int adr){
unsigned int numero;
unsigned char banco=0;
unsigned int adr1;
cs=0;
adr1=adr;
if(adr1>0xff) // Comprueba si la dirección pertenece al banco 0
{ // (adr<=256) o al banco 1 (adr>255)
adr1-=0x100;
banco=2;
}
STOP; // Macro de inicializacion o fin de comunicacion i2C
START; // Macro de comienzo de comunicacion i2C
w_ee(0xa0+banco); // Direccionamiento para escritura
w_ee((unsigned char)adr1); // Direccion incial de memoria
REPOSO; // Macro de reposo lineas SCL y SDA del i2C
START;
w_ee(0xa1+banco); // Direccionamiento para lectura
( * (char *) &numero )=r_ee();
SI_ACK;
( * ((char *) &numero + 1 ))=r_ee();
NO_ACK;
STOP;
REPOSO;
CS=1;
return(numero);
}




Muchas gracias por vuestra aportación. EStoy con el agua al cuello y lo necesito terminar para antes del viernes, Socorro!!!!!!!!No me da tiempooooooooo!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #9 en: 03 de Mayo de 2005, 03:19:00 »
A ver, Jorge, en primer lugar creo que sería conveniente que pusieras tus post sólo en un hilo del foro, en lugar de hacerlo de forma paralela en dos. Además, puesto que tienes que resolver tu problema en C, casi mejor que dejes este y elimines el otro.

Con respecto a lo que solicitas, veo que ya has determinado que la EEPROM es externa e incluso has conseguido las rutinas para leerla. Ya lo tienes casi todo, porque lo de leer el teclado e imprimir en LCD es muy fácil.

Mira el ejemplo EX_LCDKB.C de CCS que te adjunto, y seguro que te aclara bastante las ideas con respecto a la lectura del teclado y la impresión en LCD:

Codigo:
#if defined(__PCB__)
#include <16c56.h>
#fuses HS,NOWDT,NOPROTECT
#use delay(clock=20000000)

#elif defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif

#include <lcd.c>
#include <kbd.c>


void main() {
   char k;

   lcd_init();
   kbd_init();

   lcd_putc("fReady...
"Giño;

   while (TRUE) {
      k=kbd_getc();
      if(k!=0)
        if(k=="*")
          lcd_putc("f");
        else
          lcd_putc(k);
   }
}


Con todo esto, ya sólo te falta montar tu programa y probarlo. ¿Cómo lo vas a probar?. Si no tienes posibilidad de hacer el circuito en real, prueba con un simulador como Proteus y ganarás bastante tiempo.

Y si sigues teniendo dudas, pega aquí tu programa completo y lo miramos, pero no sólo las rutinas I2C...

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #10 en: 03 de Mayo de 2005, 10:31:00 »
Tengo ese mismo programa hecho en asm, con la libreria de la LCD y el teclado que propone RA-MA en su libro y va bien. Ahora he probado el que esta en este hilo, con un resultado frustrante, y es mas, tb e probado este que ha pegado arriba nocturno y lo mismo. ¿Será la libreria? Podeis hecharle un vistazo tb en el mismo hilo:

http://miarroba.com/foros/ver.php?foroid=46840&temaid=3631960
Si juegas contra el mejor, pierdes como los demás.

Desconectado Lager.

  • Moderadores
  • PIC18
  • *****
  • Mensajes: 477
RE: Lectura de datos en memoria sacados a LCD
« Respuesta #11 en: 03 de Mayo de 2005, 19:17:00 »
Que onda panas, como nota adicional, solo quiero agregar el proceso metodologico de elaboracion del codigo:
Es y seria de mucha relevancia para este y futuros proyectos que se manejen MODULOS de procesos, asi no habra confuciones.
Pana jgj, si vas a usar una memoria externa eeprom, puedes usar las rutinas YA implementadas por ccs... hay varios ejemplos en los links que te di para que veas el funcionamiento basico(con todo y diseño en proteus). Una ves terminada la lectura y escritura, Ponla a prueba.. usa proteus para simular las conexiones y demas... una ves terminado esto, agregale el lcd.. y una funcion de escritura.... y alf inal el tercer modulo que es el teclado matricial, que esta vinculado con el manejo de la memoria externa via PIC...
Como te comente varios ejemplos ya poseen lcd y memoria externa... solo necesitas incorporarle tanto al diseño como al codigo el teclado que vayas a usar..... CUANDO HAYAS TERMINADO.......ahora si podras pulir el codigo, y hacerle todos los cambios y ajustes esteticos que te puedas imaginar... pero es importante que primero tengas el prototipo con el cual vas a trabajar.... ya que si estas trabajando en el primer modulo(eeprom) y se te ocurren mas y mas y mas ideas.. y sigues depurando ni vas a acabar el prototipo,.. y mucho menos vas a terminar.
Asi que PRIMERO termina un prototipo... usa las herramientas que ya possees, que son las rutinas para eeproms,lcd,teclado,etc... y despues las depuras, o las HACES a tu manera...
Salu2 pana Sonrisa


 

anything