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
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
Estoy con un problema que no he podido resolver con mi proyecto
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)
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: