Autor Tema: lectura de datos de memoria sacados a LCD  (Leído 1484 veces)

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

Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
lectura de datos de memoria sacados a LCD
« en: 25 de Abril de 2005, 04:11:00 »
Hola tod@s!! Estoy realizando un proyecto y 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, yambien 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 la 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 su aportación, Un saludo.


Desconectado jdj

  • PIC10
  • *
  • Mensajes: 37
RE: lectura de datos de memoria sacados a LCD
« Respuesta #1 en: 28 de Abril de 2005, 10:01: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 jdj

  • PIC10
  • *
  • Mensajes: 37
RE: lectura de datos de memoria sacados a LCD
« Respuesta #2 en: 02 de Mayo de 2005, 04:07:00 »
Aqui os pongo las rutinas que tengo para escribir y leer en la EEPROM, pero no se que tengo que poner: Por ejemplo en unsigned int adr, tendría que poner la direcciónmdonde queiero que me lo escriba?
En float número, en número pondré el valor que quiero escribir?
Y en eso de (unsigned char*)???


//************************************************************
//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 de memoria sacados a LCD
« Respuesta #3 en: 03 de Mayo de 2005, 02:03:00 »
CASI MEJOR LO HARÉ CON ENTEROS.
Aqui os pongo las rutinas de escritura y lectura en la EEPROM.
Querría saber si alguin 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);
}




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

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

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!!


 

anything