Problemas para guardar datos en la memoria eepom interna de un pic

soy nuevo en foros de electronia y primiparo en ccs , es un sitio muy interesante.
Estoy con un problema que no he podido resolver con mi proyecto :unsure:

Estoy realizando un dispositivo para tomar datos cada 10min de voltaje y corriente de un sistema solar el proposito de este es que estos datos los tengo que guardar en la eeprom interna de el pic16f877a el cual estoy utilizando el ds1307 (rtc):) para grabar cada 10 min eso lo tego listo ahora si vamos a el problema el adc es de 10tits y no se como poder guardar estos datos en la memoria eeprom interna, esto lo estoy visualizando en una lcd 4*20 en la cual muestro la hora,temperatura con un lm35 y datos de voltaje y corriente aqui les dejo mi inquietud ¡ y dejo el codigo ccs como lo llevo hasta el momento el problema es que no tengo claro como hago para guardar estos datos y despues ingresar a ellos y asi poder sacar un estudio sobre voltaje y corriente entregados en un dia
estare atento y gracias por la ayuda que me puedan brindar,gracias:)

Código:
#include <16F877A.h>         ///   libreria para el manejo del pic16f877a
#device adc=10        ///NUMERO DE BITS A UTILIZAR EN LA CONVERSION A/D EN ESTE CASO 8BITS
#use delay(clock=4000000)    ///   declara  la frecuencia del cristal
#fuses HS,NOWDT,NOPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT
#include <LCD420.C>     //LIBERIA LCD 4X20
#include "ds1307.c"     //LIBERIA DS1307

#BYTE TRISA = 0X85
#BYTE PORTA = 0X05     ///   DIRECCION  DE PUERTOS A,B,C,D,E
#byte PORTB = 0X06
#BYTE TRISB = 0X86
#BYTE TRISC = 0X87
#BYTE PORTC = 0X07
#BYTE TRISD = 0X88
#byte PORTD = 0X08
#BYTE TRISE = 0X89
#BYTE PORTE = 0X09

int  I        =0;    /*VARIABLES CREADAS PARA LA CONVERSION A/D*/
INT  I1       =0;
INT  I2       =0;
INT  V        =0;
INT  A       =0;  
INT  T    =0;
volatile int sec   =0;
volatile int min   =0;
volatile int hrs   =0;

void main()
{
INT16 LAST_VOLUME=0,volume;      //variables de direccion escritura eeproM
CHAR UNI=0;
CHAR DEC=0;
CHAR CENT=0;
GOTO NORMAL; /// AQUI SALTA A VISUALIZAR,,, EL USUARIO MAS ADELANTE DECIDE EN QUE MOMENTO CONFIGURAR HORA Y FECHA

CONFIG:     /// AQUI SE LEEN LOS DATOS ALMACENADOS EN LA MEMORIA EEPROM SE QUEDA EN UN BUCLE INFINITO MOSTRANDO LOS DATOS va incrementando primero muestra V y despues I
 
for( ; ; ){   //bucle...
      for(LAST_VOLUME=0;LAST_VOLUME<255;LAST_VOLUME++){   //bucle que recorre las posiciones de eeprom  en este caso se nesecita toda la eeprom que tiene 256bytes
      lcd_gotoxy (1,1) ;  /// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
      printf (lcd_putc, "                    "); //ESCRIBO EN LA LCD
      lcd_gotoxy (1,2) ;
      printf (lcd_putc, "                     "); ///se despliegan los datos
      lcd_gotoxy (1,3) ;
      printf (lcd_putc, "                      "); ///se despliegan los datos
      lcd_gotoxy (1,4) ;/// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
      printf (lcd_putc, "                       ");
      volume = read_EEPROM (LAST_VOLUME);            //almacena mensaje de la direccion eeprom
      I=volume/1;//DIVIDO EL RESULTADO DEL CONVERSOR EN 1PARA VISUALIZAR el voltaje EN 3 DIGITOS
      CENT=((I/100)%10);
      DEC=((I/10)%10);
      UNI=(I%10);
      delay_ms(100);
     // ds1307_get_date (day, month, yr, dow);  /// se obtiene la fecha
      lcd_gotoxy (1,4) ;  /// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
      printf (lcd_putc, "EEPROM: %01d%01d,%01d VA"CENT,DEC,UNI); //ESCRIBO EN LA LCD
      lcd_gotoxy (4,1) ;
      printf (lcd_putc, "ENERGIA LIMPIA"); ///se despliegan los datos
      lcd_gotoxy (2,2) ;
      printf (lcd_putc, "DATOS ALMACENADOS"); ///se despliegan los datos
      //lcd_gotoxy (1, 3) ;/// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
      //printf (lcd_putc, "FECHA: %02d/ %02d/ %02d", day,month,yr);
      delay_ms(5000);
      }      //...infinito
   }

NORMAL:
lcd_init();  // Antes de usar el lcd,hay que inicializarlo
ds1307_init ();      ///se inicializa el ds1307
TRISC=0X00;
PORTC=0X00;
PORTD=0X00;
PORTB=0X00;
set_tris_a(255);
set_tris_c(0);
set_tris_b(0);  
set_tris_d(0);
port_b_pullups (true) ; //ACTIVO LAS RESISTENCIAS DE PULLUPS INTERNAS DE PORTB 
setup_adc_ports(all_analog);//QUE PUERTOS SE VAN A UTIIZAR PARA LA CONVERSION, EN ESTE CASO SON TODOS LOS DEL PUERTOS
setup_adc(adc_clock_internal);//EL TIEMPO DE MUESTREO DE LA SEÑAL ANALOGA, EN ESTE CASO ES EL INTERNO QUE ES MAS O MENOS 19,7uS
write_eeprom (0,0);
// ds1307_set_date_time (15,03,12,3,18,22,50);
ds1307_get_time (hrs, min, sec);   /// se obtiene la hora
//ds1307_get_date (day, month,yr,dow);  /// se obtiene la fecha

while(true) {   
 IF(PORTD==0X03) // SI PORTB=03H ENTRA A CONFIGURACION INICIAL DE LO CONTRARIO CONTINUA MOSTRANDO LA HORA ACTUAL
 GOTO CONFIG; 
delay_ms (100) ;
ds1307_get_time (hrs, min, sec);   /// se obtiene la hora
//ds1307_get_date (day, month, yr, dow);  /// se obtiene la fecha
lcd_gotoxy (2, 2) ;
printf (lcd_putc, "HORA: %02d:%02d:%02d  ", hrs,min,sec); ///se despliegan los datos
lcd_gotoxy (1, 1) ;/// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
printf (lcd_putc, "ENERGIA RENOVABLE");
SWITCH(min){
      CASE 00:
      write_eeprom(LAST_VOLUME,v);   //escritura de los adc...
      LAST_VOLUME++;
      write_eeprom(LAST_VOLUME,A);   //escritura de los adc...
      LAST_VOLUME++;
      BREAK;
      CASE 10:
      write_eeprom(LAST_VOLUME,v);   //escritura de los adc...
      LAST_VOLUME++;
      write_eeprom(LAST_VOLUME,A);   //escritura de los adc...
      LAST_VOLUME++;
      BREAK;  
      CASE 20:
      write_eeprom(LAST_VOLUME,v);   //escritura de los adc...
      LAST_VOLUME++;
      write_eeprom(LAST_VOLUME,A);   //escritura de los adc...
      LAST_VOLUME++;
      BREAK;
      CASE 30:
      write_eeprom(LAST_VOLUME,v);   //escritura de los adc...
      LAST_VOLUME++;
      write_eeprom(LAST_VOLUME,A);   //escritura de los adc...
      LAST_VOLUME++;
      BREAK;
      CASE 40:
      write_eeprom(LAST_VOLUME,v);   //escritura de los adc...
      LAST_VOLUME++;
      write_eeprom(LAST_VOLUME,A);   //escritura de los adc...
      LAST_VOLUME++;
      BREAK;
      CASE 50:
      write_eeprom(LAST_VOLUME,v);   //escritura de los adc...
      LAST_VOLUME++;
      write_eeprom(LAST_VOLUME,A);   //escritura de los adc...
      BREAK;
      default:}   
set_adc_channel(0);//CANAL A UTILIZAR PARA LA CONVERSION
delay_us(20);
V=read_adc(); //LA LECTURA LA HACE IGUAL A UNA VAIABLE
I=V/1;//DIVIDO EL RESULTADO DEL CONVERSOR EN 1.2 PARA VISUALIZAR el voltaje EN 3 DIGITOS
CENT=((I/100)%10);
DEC=((I/10)%10);
UNI=(I%10);
lcd_gotoxy (1,3) ;  /// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
printf (lcd_putc, "VOLTS:%01d%01d,%01d"CENT,DEC,UNI); //ESCRIBO EN LA LCD
       
set_adc_channel(1);//CANAL A UTILIZAR PARA LA CONVERSION
delay_us(20);
A=read_adc(); //LA LECTURA LA HACE IGUAL A UNA VAIABLE
I1=A-512/4;//DIVIDO EL RESULTADO DEL CONVERSOR EN 5 PARA VISUALIZAR LA TEMPERATURA EN 2 DIGITOS 
CENT=((I1/100)%10);
DEC=((I1/10)%10);
UNI=(I1%10);
lcd_gotoxy (13,3) ;  /// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
printf (lcd_putc, "AMP:%01d%01d,%01d"CENT,DEC,UNI); //ESCRIBO EN LA LCD
      
      set_adc_channel(2);//CANAL A UTILIZAR PARA LA CONVERSION
      delay_us(20);
      T=read_adc(); //LA LECTURA LA HACE IGUAL A UNA VAIABLE
       I2=T/2;//DIVIDO EL RESULTADO DEL CONVERSOR EN 5 PARA VISUALIZAR LA TEMPERATURA EN 2 DIGITOS 
       CENT=((I2/100)%10);
       DEC=((I2/10)%10);
       UNI=(I2%10);
       lcd_gotoxy (3,4) ;  /// DECIMOS EN QUE PARTE DE LA LCD QUEREMOS ESCRIBIR
       printf (lcd_putc, "TEMP: %01d%01d GRADOS ",DEC,UNI); //ESCRIBO EN LA LCD
       
}
}
 
Última edición por un moderador:
Atrás
Arriba