Autor Tema: problemita con eeprom para pic 18f452  (Leído 4080 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
problemita con eeprom para pic 18f452
« en: 17 de Junio de 2008, 22:32:29 »
hola estoy haciendo un programa que tengo q terminar para la otra semana y es con el pic 18f452 lo que tengo q hacer es leer un sensor de temperatura 80 veces almacenarlo en la eeprom y luego mostrarlo en la hyperterminal bueno el programa me almacena y me lee los datos pero ene la posicion 65 hasta la 80 me salen unos datos que no concuerdan yo creo que es porque la memoria es de 63 bytes pero no se como arreglarlo



el codigo que hice es este

#include "24lc256.h"
#include "terminal.h"
#use I2C (MASTER, SDA=PIN_C4, SCL=PIN_C3, RESTART_WDT, FAST)


// Makron för minnet
#define EEROM_ADDR        0xa0      // I2C adress för EEPROM
#define EEPROM_ADRESS_LO   0x00   // Låg Adressbyte för EEPROM
#define EEPROM_ADRESS_HI   0x00   // Hög Adressbyte för EEPROM. Max (0-63)
#define EEPROM_BYTES       10      // EEPROM-bytes +1 som skrivs/läses
#define READ_DATA         1      // Läs data
#define TEMP_P1 0x0   
#define TEMP_MASK   0x80
#define SENSOR_ADDR 0x9e   
#define Thyst_High   23   
#define Thyst_Low   128
#define Thyst_POINTER 0x2
#define ACK         1      
#define NO_ACK      0      
#define READ_BIT   1      
#define WRITE_BIT    0      
#define ZERO_DATA   0      
#define GRAD0      '0'      
#define GRAD5      '5'


// Globala variabler
BYTE bTemplo;
BYTE bTempThyst;            // Tempvärde 1/2- grader
signed int iTemphi;        // Tempvärde grader
signed int iTempThyst;
char cGrad=GRAD0;

// Funktionsprototyper
void storage_eeprom(void);         // Spara i EEPROM
void las_eeprom(void);            // Läs ur EEPROM
void get_temperature(void);
void set_thyst(void);
void get_thyst(void);

//Funktioner
/* Lagra i EEPROM, max 63 bytes */
void storage_eeprom(void)
{
   int iCounter;
    i2c_start();
    i2c_write(EEROM_ADDR);                  // Hårdvaruadressen för minneskapseln
    i2c_write(EEPROM_ADRESS_HI);            // Startadress i minnet hög
    i2c_write(EEPROM_ADRESS_LO);            // Startadress i minnet låg
    for(iCounter=0; iCounter <= 80;iCounter++)
       {
          i2c_write(iTempThyst);            // Skriv data till eeprom
      }
    i2c_stop();
}

/* Läs från EEPROM, max 63 bytes */
void las_eeprom(void)
{
    int iCounter;
    byte bData;
    BOOLEAN EndOfMemoryFlag = 1;            // För att växla så att sista minnesläsningen är utan ACK
    i2c_start();
    i2c_write(EEROM_ADDR);
    i2c_write(EEPROM_ADRESS_HI);
    i2c_write(EEPROM_ADRESS_LO);
    i2c_start();
    i2c_write(EEROM_ADDR | READ_DATA);         // Bitvis OR med 1 ger att den minst signifikanta biten blir 1 (0xA1)
                                    // vilket betyder läs data frånEEPROM
    for(iCounter =0; iCounter <= 80;iCounter++)
       {
           if(iCounter == 80) EndOfMemoryFlag = 0;
            bData= i2c_read(EndOfMemoryFlag);   // Läs  0, 1, 2... osv ur eeprom
            delay_ms(300);
            printf("Adress %X %2d   Data %d %c \n\r",EEPROM_ADRESS_HI,iCounter,bData,cGrad,);

         
      }
    i2c_stop();
}

void get_temperature(void)
{
    i2c_start();
    i2c_write(SENSOR_ADDR | READ_BIT);      // Bitvis OR med 1 ger att den minst signifikanta biten blir 1 (0x9F)
                                 // vilket betyder läs data från LM75.
    iTemphi = i2c_read(ACK);            // Läs mest signifikanta byten, svara med en ack till LM75 när byten är läst.
    bTemplo = i2c_read(NO_ACK);            // Läs minst signifikanta byten, svara inte med en ack till LM75 när byten är läst.
    i2c_stop();
   if(bTemplo & TEMP_MASK) cGrad = GRAD5;   // Lägg till 0.5 grader om LM75 byte2 är hög
   else cGrad = GRAD0;
}

void set_thyst(void)
{
    i2c_start();
    i2c_write(SENSOR_ADDR | 0);   
   i2c_write(Thyst_POINTER);   
   i2c_write(Thyst_High);      
   i2c_write(Thyst_Low);
    i2c_stop();
}

void get_thyst(void)
{
    i2c_start();
    i2c_write(SENSOR_ADDR | 0);               
   i2c_write(Thyst_POINTER);               
   i2c_start();                        
   i2c_write(SENSOR_ADDR | READ_BIT);         
    iTempThyst = i2c_read(ACK);      
    bTempThyst = i2c_read(NO_ACK);   
    i2c_stop();                           
   if(bTempThyst & TEMP_MASK) cGrad = GRAD5;   
   else cGrad = GRAD0;
}

void main(void)
{
   int count;
   startup();
   set_thyst();
   printf(CLR_SCR);                  // Rensa skärmen
    do{
      puts("\n\n\rI2C minneshantering");
       output_bit(PIN_C2,~input(PIN_C2));
      get_temperature();
      delay_ms(100);
      get_thyst();
      for (count=0;count<80;count++){
      storage_eeprom();   
                              }
      delay_ms(WAIT_500_MS);
      las_eeprom();                  // Läs i serieminnet
      }while(TRUE);



« Última modificación: 17 de Junio de 2008, 22:47:54 por lybuendia »

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: problemita con eeprom urgente
« Respuesta #1 en: 17 de Junio de 2008, 22:40:12 »
Hola lybuendia. Bienvenido al foro y te recomiendo que pases a leerte las reglas del mismo lo mas "urgente" posible, ya que aqui tratamos de evitar colocar "urgente" en los titulos de los post  :mrgreen:.

pero ene la posicion 65 hasta la 80 me salen unos datos que no concuerdan yo creo que es porque la memoria es de 63 bytes pero no se como arreglarlo

La forma de arreglarlo es leer el datasheet del 18F452 y comprobar realmente la EEPROM disponible. Si no te alcanzan la memoria para almacenar todos los datos me temo que tendrás que optar por una EEPROM externa.

0x01 Saludo.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: problemita con eeprom para pic 18f452
« Respuesta #2 en: 17 de Junio de 2008, 22:51:38 »
bueno es que la eeprom es externa y el enunciado me lo dio el profesor pero es que no entiendo muy bien esto porque apenas llevo unas semnaas trabajando con pics

en el enunciado del problema el profesor da un
Tip:
Total 160 sitios de memorias deben ser usados en la memoria del i2c
 si usas "page write mode" nota que el maximo es de 64 bytes para ser escritos en la memoria 

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: problemita con eeprom para pic 18f452
« Respuesta #3 en: 17 de Junio de 2008, 22:52:46 »
y ya cambie el titulo =) ... no sabia eso pero ya lei las reglas!!  gracias!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: problemita con eeprom para pic 18f452
« Respuesta #4 en: 17 de Junio de 2008, 22:55:40 »
Saludos lybuendia, bienvenido al foro!
Pues sería bueno que tomes en cuenta las observaciones del dr. Gonzalo.

Ahora bien Gonzalo, en cuanto a esto:

La forma de arreglarlo es leer el datasheet del 18F452 y comprobar realmente la EEPROM disponible. Si no te alcanzan la memoria para almacenar todos los datos me temo que tendrás que optar por una EEPROM externa.

No termino de entender bien... no está usando él una eeprom externa?
Porque en el código veo que tiene:
Código: C
  1. #include "24lc256.h"

Y luego también tiene rutinas con i2c y demás... entonces me has dejado medio confundido  :?
En caso de que yo tenga razón y el esté usando una memoria externa, entonces no entiendo tampoco por qué no usa los comandos write_ext_eeprom y read_ext_eeprom... no funcionan perfectamente de esta forma?

Bueno esperemos que él nos aclare un poco la cosa...
Ok nos leemos!  :mrgreen:

EDITO: ya había escrito el post y resulta que se me ha adelantado lybuendia con los otros dos posts... :D
« Última modificación: 17 de Junio de 2008, 22:58:28 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: problemita con eeprom para pic 18f452
« Respuesta #5 en: 17 de Junio de 2008, 23:02:38 »
jajaja no hay problema bueno pero no soy el soy ella.. el problema tbn es que practicamente estoy aprendiendo esto sola porque yo estoy de intercambio en suecia y los libros estan en sueco entonces me toca leer como pueda de foros y asi
por eso digo que no se mucho sobre memorias y eso

yo creo que el problema es por lo de los 63 bytes de la memoria que es una 24c256 de 32kx8 pero no se como escribir los 80 datos correctamente los curioso del programa es que en la posicion 65 me escribe algo incoherente pero en la 66 me escribe la temperature osea apartir de la posicion 65 de impar a impar sale algo raro pero las posiciones pares no hay problema

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: problemita con eeprom para pic 18f452
« Respuesta #6 en: 17 de Junio de 2008, 23:10:37 »
jajaja no hay problema bueno pero no soy el soy ella..
Mil disculpas sta. lybuendia... es que como no está especificado su género en el perfil supuse que era usted chico, ya veo que me equivoqué  :(

Varias preguntas:
1- estás montando el circuito en físico o simulándolo en proteus?
2- has probado con las instrucciones "init_ext_eeprom", "write_ext_eeprom" que te mencioné?
3- has intentado cambiando, en la declaración #i2c, usar "SLOW" en vez de "FAST"? Leí por ahí que el ccs a veces da problemas con FAST.
4- estoy fastidiando mucho con tantas preguntas?  :D

Yo estoy haciendo un proyecto con algo similar y no me funcionaba inicialmente y el problema estaba en que usaba "FORCE_HW", cuando quité esa opción funcionó de lujo.  :)

Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: problemita con eeprom para pic 18f452
« Respuesta #7 en: 17 de Junio de 2008, 23:21:37 »
gracias por responder tan rapido

bueno ya le cambie por slow pero sigue el error

es un circuito una tarjeta de esas para materias que trae un sensor la memoria el pic y otras cosillas mas pero todo esta en la misma tarjeta por lo que el i2c esta conectado a todo y la direccion es donde esta el dispositivo

disculpa mi ignorancia pero que es el force_hw?

y lo de las funciones write_ext no se porque la manera de escribir en la memoria las saque de un ejemplo que me envio el profesor y el usaba esas funciones


Desconectado lybuendia

  • PIC10
  • *
  • Mensajes: 10
Re: problemita con eeprom para pic 18f452
« Respuesta #8 en: 17 de Junio de 2008, 23:23:43 »
estoy usando MPLAB bueno esto es lo que me sale en hyperterminal

2C minneshantering
Adress 00  0   Data 23 5
Adress 00  1   Data 23 5
Adress 00  2   Data 23 5
Adress 00  3   Data 23 5
Adress 00  4   Data 23 5
Adress 00  5   Data 23 5
Adress 00  6   Data 23 5
Adress 00  7   Data 23 5
Adress 00  8   Data 23 5
Adress 00  9   Data 23 5
Adress 00 10   Data 23 5
Adress 00 11   Data 23 5
Adress 00 12   Data 23 5
Adress 00 13   Data 23 5
Adress 00 14   Data 23 5
Adress 00 15   Data 23 5
Adress 00 16   Data 23 5
Adress 00 17   Data 23 5
Adress 00 18   Data 23 5
Adress 00 19   Data 23 5
Adress 00 20   Data 23 5
Adress 00 21   Data 23 5
Adress 00 22   Data 23 5
Adress 00 23   Data 23 5
Adress 00 24   Data 23 5
Adress 00 25   Data 23 5
Adress 00 26   Data 23 5
Adress 00 27   Data 23 5
Adress 00 28   Data 23 5
Adress 00 29   Data 23 5
Adress 00 30   Data 23 5
Adress 00 31   Data 23 5
Adress 00 32   Data 23 5
Adress 00 33   Data 23 5
Adress 00 34   Data 23 5
Adress 00 35   Data 23 5
Adress 00 36   Data 23 5
Adress 00 37   Data 23 5
Adress 00 38   Data 23 5
Adress 00 39   Data 23 5
Adress 00 40   Data 23 5
Adress 00 41   Data 23 5
Adress 00 42   Data 23 5
Adress 00 43   Data 23 5
Adress 00 44   Data 23 5
Adress 00 45   Data 23 5
Adress 00 46   Data 23 5
Adress 00 47   Data 23 5
Adress 00 48   Data 23 5
Adress 00 49   Data 23 5
Adress 00 50   Data 23 5
Adress 00 51   Data 23 5
Adress 00 52   Data 23 5
Adress 00 53   Data 23 5
Adress 00 54   Data 23 5
Adress 00 55   Data 23 5
Adress 00 56   Data 23 5
Adress 00 57   Data 23 5
Adress 00 58   Data 23 5
Adress 00 59   Data 23 5
Adress 00 60   Data 23 5
Adress 00 61   Data 23 5
Adress 00 62   Data 23 5
Adress 00 63   Data 23 5
Adress 00 64   Data 23 5
Adress 00 65   Data -128 5
Adress 00 66   Data 23 5
Adress 00 67   Data -128 5
Adress 00 68   Data 23 5
Adress 00 69   Data -128 5
Adress 00 70   Data 23 5
Adress 00 71   Data -128 5
Adress 00 72   Data 23 5
Adress 00 73   Data -128 5
Adress 00 74   Data 23 5

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: problemita con eeprom para pic 18f452
« Respuesta #9 en: 18 de Junio de 2008, 11:50:31 »
Saludos lybuendia!
Mira el FORCE_HW es una opción que le dice a CCS que use únicamente el módulo i2c (MSSP) que trae el microcontrolador para la interfaz serial.
En cuanto a init_ext_eeprom, write_ext_eeprom, read_ext_eeprom... esas son funciones deben estar definidas en el archivo que estás adjuntando, el "24LC256"...
Digo "deben" porque no estoy seguro, pues acabo de revisar y el CCS que tengo instalado no trae ese archivo, tiene es uno llamado "24256", me imagino que es el equivalente...
Bueno pues si estás incluyendo ese archivo, puedes usar esas funciones para escribir y leer en la eeprom... no tienes que hacerlo tu manualmente con el i2c, aunque hay quienes prefieren hacerlo así. Es decisión personal.
Si quieres saber más acerca de estas funciones, puedes echarte una ojeada por este hilo:
http://www.todopic.com.ar/foros/index.php?topic=4530.msg38929#msg38929
Allí el maestro vszener publicó un ejemplo de cómo escribir y leer en una eeprom externa, justamente esa que tú estás usando, la 24LC256.
Si lo quieres hacer a pie usando las funciones i2c, entonces puedes leerte este otro hilo:
http://www.todopic.com.ar/foros/index.php?topic=4783.0
Donde el gran maestro redpic da ejemplos de cómo hacerlo correctamente.
Estoy seguro te serán de utilidad.
Ok nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: problemita con eeprom para pic 18f452
« Respuesta #10 en: 18 de Junio de 2008, 13:21:39 »
La forma de arreglarlo es leer el datasheet del 18F452 y comprobar realmente la EEPROM disponible. Si no te alcanzan la memoria para almacenar todos los datos me temo que tendrás que optar por una EEPROM externa.

Si les digo que no lei el código, solo el enunciado del mensaje de lybuendia me creen?!? De ahi mi incorrecta suposición de que estaba usando un eeprom interna. Mil disculpas, ya saben, el tiempo es tirano ... inclusive cuando uno trata de ahorrarlo leyendo solo una parte de un post  :D.

Saludos.

"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: problemita con eeprom para pic 18f452
« Respuesta #11 en: 18 de Junio de 2008, 23:13:20 »
Dr. Gonzalo, tú cómo que estás enamorado...  :D
Bueno sea verdad o no, no te preocupes... errar es de humanos...  :lol:
Lybuendia, espero que hayas podido resolver tu problema. Ya nos contarás...
Ok saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web