Autor Tema: Lectura y escritura memoria EEPROM pic18F8722 (proyecto casero lampara Acuario)  (Leído 1926 veces)

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

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Necesito saber como guardar y leer la memoria eeprom del pic18f8722 en codigo C con el compilador PCW de CCS.

La idea es hacer una lampara de acuario con su programador de encendido y su control de temperatura por ventiladores  para disipar calor de los LEDs de alta potencia.



Vamos con el problema en cuestión, estas son las variables que quiero guardar:

//CONFIGURACION DE LOS ENCENDIDOS
int config_hora_inicio[7];
int config_minuto_inicio[7];

int config_hora_fin[7];
int config_minuto_fin[7];

donde los datos serian para programar un encedido de un pin cada dia de la semana siendo 0 para el sabado, 1 para el domingo, ....,6 para viernes. Peor lo que me interesa es guardar y leer para cada dia los datos para poder comprarlos en otra funcion (que aun tengo que hacer, pero hasta que no los peuda guardar los datos en la EEPROM no puedo continuar) y así poder poner en high el pin del pic.


Paso el programa hecho con el compilador PCW de CCS y el esquematico de Proteus 7.7 SP2


Con los pulsadores se puede acceder a als diferentes pantallas,

Pulsador superior = pantalla configuracion ds 1302
Pulsador inferior = pantalla configuracion hora de inicio y fin del encendido (esto es lo que queiro guardar en la eeeprom)

Para moverse por los diferentes valores a cambiar se usan los botones de derecha o izquierda, veran que saldra un caracter en la linea 3 que marca en que posicion estamos para variar con el pulsador o mas o menos uando tengamos claro lo que queremos introducir hay dos opciones para volver a la pantalla principal o por tiempo (el solo tiene un ciclo de inactividad que te devuelve a la pantalla principal) o saliendo por la derecha o izquierda con los pusadores derecha izquierda(es decir si estamos en el primer valor modificable si le damos a la izquierda nos saldriamos a la pantalla principal, y si estamos en el ultimo valor y le damos a la derecha nos salimos a la panatalla principal tambien)

Seria de gran ayuda, y antetodo muchas gracias por su amabilidad por leer y ayudar.
« Última modificación: 23 de Junio de 2015, 03:39:32 por Arkaedus »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Segun el manual de CCS


read_eeprom(address)
Reads the data EEPROM memory location

write_eeprom(address, value)
Erases and writes value to data EEPROM location address.

Relevant Preprocessor:
#ROM address={list}
Can also be used to put data EEPROM memory data into the hex file.

Tambien ofrece un codigo para casos que superan 1 byte, como por ejemplo un float(24bits) o variables de 16/32bits, aunque usa funciones como si fuera una ROM externa, que podrias cambir facilmente a la otra cambiando la funcion.

Código: C
  1. WRITE_FLOAT_EXT_EEPROM( long int n, float data) {
  2. int i;
  3. for (i = 0; i < 4 ; i++)
  4. write_ ext_ eeprom(i + n, *(((int 8 *)&data + i) ) ;
  5. }
  6.  
  7. float READ_FLOAT_EXT_EEPROM( long int n) {
  8. int i;
  9. float data;
  10. for (i = 0; i < 4; i++)
  11. *(((int 8 *)&data) + i) = read_ ext_ eeprom(i + n);
  12. return(data);
« Última modificación: 23 de Junio de 2015, 04:36:43 por KILLERJC »

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
Jajaja perdona pero como soy muy nuevo en este mundillo, me he quedado igual, vale he leido lo de las funciones.

Pero no entiendo como podria poner el codigo para guardar los datos en la eeprom de config_hora_inicio, config_minuto_inicio, config_hora_fin y config_minuto_fin para cada uno de los dias.

la cosa es que los datos se "guardan" en la variable segn el dia pero como no se el codigo para guaradar en la EEPROM cuando se apaga la simulacion y vuelev a arranacarse los datos estan a todos en 0

Este es el codigo que tengo para configurar las variables:

Código: [Seleccionar]
//PANTALLA DE CONFIGURACION DE ENCENDIDO
         case 1:
             switch (config_cursor_actual)
            {
               //CURSOR EN DIA DE LA SEMANA            
               case 0:
                  if (puls_up_fs )
                  {
                     if (++config_dia_actual == 7) config_dia_actual = 0;
                  }
                  if (puls_down_fs )
                  {
                     if (--config_dia_actual == -1) config_dia_actual = 6;                    
                  }
               //-------------------------                  
                  break;
               case 1:
                   if (puls_up_fs){
                     if (++config_hora_inicio[config_dia_actual] == 24) config_hora_inicio[config_dia_actual]= 0;
                  }
                  if (puls_down_fs){
                     if (--config_hora_inicio[config_dia_actual] == -1) config_hora_inicio[config_dia_actual]= 23;            
                  }
                  break;
               case 2:
                   if (puls_up_fs){
                     if (++config_minuto_inicio[config_dia_actual] == 60) config_minuto_inicio[config_dia_actual]= 0;
                  }
                  if (puls_down_fs){
                     if (--config_minuto_inicio[config_dia_actual] == -1) config_minuto_inicio[config_dia_actual] = 59;            
                  }
                  break;
               case 3:
                   if (puls_up_fs){
                     if (++config_hora_fin[config_dia_actual] == 24) config_hora_fin[config_dia_actual]= 0;
                  }
                  if (puls_down_fs){
                     if (--config_hora_fin[config_dia_actual] == -1) config_hora_fin[config_dia_actual]= 23;            
                  }
                  break;
               case 4:
                   if (puls_up_fs){
                     if (++config_minuto_fin[config_dia_actual] == 60) config_minuto_fin[config_dia_actual]= 0;
                  }
                  if (puls_down_fs){
                     if (--config_minuto_fin[config_dia_actual] == -1) config_minuto_fin[config_dia_actual] = 59;            
                  }
                  break;
            }
            
            if (puls_right_fs)
            {
               //Mover Cursor a la derecha y dar la vuelta
               //if (++config_cursor_actual == 9) config_cursor_actual = 0;

               //Volver a pantalla de info si se sale por la derecha
               //config_cursor_actual = 0;
               //pantalla_actual = 0;      
              
               //Mover Cursor a la derecha
               if (++config_cursor_actual == 5)
               {
                  //Volver a pantalla de info si se sale por la derecha
                     pantalla_actual = 0;
                     config_cursor_actual = 0;
                     actualizar_pantalla();            
               }
            }
            
            if (puls_left_fs)
            {
               //Mover Cursor a la izquierda y dar la vuelta
               //if (--config_cursor_actual == -1) config_cursor_actual = 8;
              
               //Volver a pantalla de info si se sale por la izquierda
               //config_cursor_actual = 0;
               //pantalla_actual = 0;
            
               //Mover Cursor a la izquierda
               if (--config_cursor_actual == -1)
               {
                  //Volver a pantalla de info si se sale por la izquierda
                     pantalla_actual = 0;
                     config_cursor_actual = 0;
                     actualizar_pantalla();
               }
            }
            
            if (pantalla_actual != 0 && (puls_right_fs || puls_left_fs))
            {
               actualizar_cursor_pantalla();  
            }


donde las dos horas van de 0 a 23 y los minutos de 0 a 59 en las variables. Y donde tenemos definido esto:

//CONFIGURACION DE LOS ENCENDIDOS
int config_hora_inicio[7];
int config_minuto_inicio[7];

int config_hora_fin[7];
int config_minuto_fin[7];

donde el 7 indica los 7 dias de la semana siendo sab = 0, dom = 1, lun = 2, mar = 3, mie = 4, jue = 5 y vie = 6


Lo suyo sería guardar en cada linea de la eeprom segun el dia lo s 4 valores de config_hora_inicio, config_minuto_inicio, config_hora_fin y config_min_fin.
Pero como he dicho no sé como abordar el problema.
« Última modificación: 23 de Junio de 2015, 05:53:25 por Arkaedus »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
En la simulacion siempre que lo cortes creo que no se guarda lo de la EEPROM aparte. tal ves comienze de 0 siempre.

Utilizando el codigo que pase del float, y espero que funcione bien (ya que lo escribi en el bloc de notas):

Código: C
  1. void WRITE_EEPROM_USER( long int n, int *data) {
  2.         int i;
  3.         for (i = 0; i < 7 ; i++)
  4.         write_eeprom(i + n, *(data + i));
  5. }
  6.  
  7. void READ_EEPROM_USER( long int n, int *data) {
  8.         int i;
  9.         for (i = 0; i < 7; i++)
  10.         *(data + i) = read_eeprom(i + n);
  11. }

Y se usaria:

Código: C
  1. // Escritura de todos los parametros
  2.  
  3. WRITE_EEPROM_USER(0x00,config_hora_inicio);
  4. WRITE_EEPROM_USER(0x07,config_minuto_inicio);
  5. WRITE_EEPROM_USER(0x0E,config_hora_fin);
  6. WRITE_EEPROM_USER(0x15,config_minuto_fin);
  7.  
  8. // Reestablecer todos los parametros, es decir lee los datos de la EEPROM y los guarda en los array esos
  9.  
  10. READ_EEPROM_USER(0x00,config_hora_inicio);
  11. READ_EEPROM_USER(0x07,config_minuto_inicio);
  12. READ_EEPROM_USER(0x0E,config_hora_fin);
  13. READ_EEPROM_USER(0x15,config_minuto_fin);

Hice que actualizara los arrays ya que deberian solo cambiar cargarse cuando inicie el programa ( el unico momento de leerlo )

Desconectado Arkaedus

  • PIC10
  • *
  • Mensajes: 25
He rpobado pero no eh sabido hacerlo funcionar, me podrias explicar un poco donde poner el segundo codigo que has puesto?


 

anything