MUCHAS GRACIAS A TODOS por vuestra ayuda Trataba de conseguir que un led se comportara como el Sol.
Amanecer/anochecer progresivoGracias a vuestros consejos y a los ejemplos de “Ejemplitos en C para 16F648A” he ido cogiendo unas cositas de aquí y otras de allí. Y creo que lo que me ha salido FUNCINAAAAAAAAA!!!!
Por lo menos en la simulación del proteus. JEJEJE
Ahora, si no es pedir demasiado. Me gustaría que le echarais un vistazo y me contarais que tal lo veis. Si se puede mejorar en algo…
Por ejemplo el delay_ms(1000); del for(;
no me gusta nada. Me hubiera gustado usar alguna interrupción pero no he sabido de donde sacar la señal.
Tampoco sé si la forma de comparar las fechas en la correcta…
En fin, por favor echadle un vistazo y opináis. Admito críticas, tanto las constructivas como las destructivas.
#include <16f648a.h> //pic a utilizar
#use delay(CLOCK=4000000) //Fosc=4Mhz
#fuses HS,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWDT,NOMCLR //comandos para el programador
#use standard_io(a)
#use standard_io(b)
#define use_portb_lcd TRUE //utilizar el port b para lcd
#define RTC_SCLK PIN_A1 //definimos pin's...
#define RTC_IO PIN_A2
#define RTC_RST PIN_A0 //...de conexion de la rtc ds1302
#include <ds1302.c> //libreria de rtc ds1302
#include <lcd.c> //libreria de lcd
///VARIABLES GLOBALES
int day,mth,year,dow,hour,min,sec; //variabes para ds1302
byte menu=0,var=2; //variables para menu configurar
int horaOn=0,minOn=0,horaOff=0,minOff=0; // on = amanecer; off = anochecer
int1 estado =0; // 1 =>dia; 0 =>noche
int duty = 0; // nivel del pwm
///DEFINICION DE FUNCIONES
void configurar(void);
void horas(void);
void minutos(void);
void dia(void);
void mes(void);
void anio(void);
void hOn(void);
void mOn(void);
void hOff(void);
void mOff(void);
///PROGRAMA
void main(void){
char LAST_VOLUME=0; //lee la última programación de la eeprom
horaOn=read_EEPROM (LAST_VOLUME);
LAST_VOLUME++;
minOn=read_EEPROM (LAST_VOLUME);
LAST_VOLUME++;
horaOff=read_EEPROM (LAST_VOLUME);
LAST_VOLUME++;
minOff=read_EEPROM (LAST_VOLUME);
lcd_init(); //inicializa lcd
rtc_init(); //inicializa rtc
setup_ccp1 (CCP_PWM); //ccp1 moDO PWM
setup_timer_2 (T2_DIV_BY_16, 127, 1); //2, 05ms - > 487,8Hz
set_pwm1_duty (duty);
configurar(); // establece la hora y el día.
for(;;){
rtc_get_date(day,mth,year,dow); //coge dia,mes,año
rtc_get_time(hour,min,sec ); //coge hora,minuto,segundo
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/%02D/%02D",hour,min,sec,day,mth,year);
delay_ms(1000);
if(estado == 1 && duty < 128){ // si está encendo pero no al max sube poco a poco
duty++;
}
if(estado == 0 && duty > 0){ // si está apagado pero no del todo apaga poco a poco
duty--;
}
if(estado == 0){ // Si es de noche busca la hora de amanecer
if(hour==horaOn && min == minOn && sec == 0){
estado = 1; // Es la hora empieza a amanecer
}
}else{ // Busca el apagado
if(hour==horaOff && min == minOff && sec == 0){
estado = 0; // Empieza a anochecer
}
}
set_pwm1_duty (duty); // Establece el nivel del PWM
if(input(PIN_A5)==0){ //Si se pulsa Conf....
while(!input(PIN_A5)){} //elimina rebotes
configurar();
} //ve a menu configurar
}
}
///FUNCION CONFIGURAR
void configurar(void){
char LAST_VOLUME=0; //variables de direccion escritura eeprom y mensaje
lcd_putc("\f");
printf(lcd_putc,"Configurando \n\n");
delay_ms(1000);
do{
switch(menu){
case 0: //horas
horas();
menu=1;
break;
case 1: //minutos
minutos();
menu=2;
break;
case 2: //Dias
dia();
menu=3;
break;
case 3: //Mes
mes();
menu=4;
break;
case 4: //años
anio();
menu=5;
break;
case 5: //Hora On
hOn();
menu=6;
break;
case 6: //Minuto On
mOn();
menu=7;
break;
case 7: //Hora Off
hOff();
menu=8;
break;
case 8: //Minuto Off
mOff();
menu=9; //pa fuera.
break;
}
}while(menu<9);
menu=0; //actualiza indices menu
rtc_set_datetime(day,mth,year,dow,hour,min); //nueva hora,minuto,...
// Programamos en la eeprom la hora del encendido
write_eeprom(LAST_VOLUME,horaOn);
LAST_VOLUME++;
write_eeprom(LAST_VOLUME,minOn);
LAST_VOLUME++;
// Programamos en la eeprom la hora de apagado
write_eeprom(LAST_VOLUME,horaOff);
LAST_VOLUME++;
write_eeprom(LAST_VOLUME,minOff);
}
///FUNCION CONFIGURA HORAS
void horas(void){
do{
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/%02D/%02D",hour,min,sec,day,mth,year);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
hour++; //SI -> incremento hour
if(hour > 23){ hour=00; } //limites...
}
printf(lcd_putc,"\f :%02D:%02D\n%02D/%02D/%02D",min,sec,day,mth,year);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MINUTOS
void minutos(void){
do{
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/%02D/%02D",hour,min,sec,day,mth,year);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
min++; //SI -> incremento min
if(min > 59){ min=00; } //limites...
}
printf(lcd_putc,"\f%02D: :%02D\n%02D/%02D/%02D",hour,sec,day,mth,year);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA DIAS
void dia(void){
do{
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/%02D/%02D",hour,min,sec,day,mth,year);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
day++; //SI -> incremento day
if(day > 31 ){ day=01;} //limites...
}
printf(lcd_putc,"\f%02D:%02D:%02D\n /%02D/%02D",hour,min,sec,mth,year);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA MES
void mes(void){
do{
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/%02D/%02D",hour,min,sec,day,mth,year);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
mth++; //SI -> incremento mth
if(mth > 12){ mth=01; } //limites...
}
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/ /%02D",hour,min,sec,day,year);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCION CONFIGURA AÑOS
void anio(void){
do{
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/%02D/%02D",hour,min,sec,day,mth,year);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
year++; //SI -> incremento mth
}
printf(lcd_putc,"\f%02D:%02D:%02D\n%02D/%02D/ ",hour,min,sec,day,mth);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCIÓN CONFIGURA HORA DE INICIO DEL AMANECER
void hOn(void){
do{
printf(lcd_putc,"\f On : %02D:%02D:00 \n Off: %02D:%02D:00",horaOn,minOn,horaOff,minOff);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
horaOn++; //SI -> incremento hour
if(horaOn > 23){ horaOn=00; } //limites...
}
printf(lcd_putc,"\f On : :%02D:00 \n Off: %02D:%02D:00",minOn,horaOff,minOff);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCIÓN CONFIGURA MINUTO DE INICIO DEL AMANECER
void mOn(void){
do{
printf(lcd_putc,"\f On : %02D:%02D:00 \n Off: %02D:%02D:00",horaOn,minOn,horaOff,minOff);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
if(!input(PIN_A3)){delay_ms(300);} //elimina rebotes
minOn++; //SI -> incremento min
if(minOn > 59){ minOn=00; } //limites...
}
printf(lcd_putc,"\f On : %02D: :00\n Off: %02D:%02D:00",horaOn,horaOff,minOff);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCIÓN CONFIGURA HORA DE INICIO DEL ANOCHECER
void hOff(void){
do{
printf(lcd_putc,"\f On : %02D:%02D:00 \n Off: %02D:%02D:00",horaOn,minOn,horaOff,minOff);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
if(!input(PIN_A3)){delay_ms(300);} //elimina rebotes
horaOff++; //SI -> incremento hour
if(horaOff > 23 ){horaOff=00;} //limites...
}
printf(lcd_putc,"\f On : %02D:%02D:00 \n Off: :%02D:00",horaOn,minOn,minOff);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
///FUNCIÓN CONFIGURA MINUTO DE INICIO DEL ANOCHECER
void mOff(void){
do{
printf(lcd_putc,"\f On : %02D:%02D:00 \n Off: %02D:%02D:00",horaOn,minOn,horaOff,minOff);
delay_ms(500);
if(!input(PIN_A3)){ //¿se ha pulsado up?
if(!input(PIN_A3)){delay_ms(300);} //elimina rebotes
minOff++; //SI -> incremento min
if(minOff>59){ minOff=00; } //...min
}
printf(lcd_putc,"\f On : %02D:%02D:00 \n Off: %02D: :00",horaOn,minOn,horaOff);
delay_ms(100);
}while(input(PIN_A5));
while(!input(PIN_A5)){} //elimina rebotes
}
Adjunto simulación en proteus
Muchas gracias a todos.