Autor Tema: El Sol  (Leído 1650 veces)

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

Desconectado naho

  • PIC12
  • **
  • Mensajes: 62
El Sol
« en: 21 de Febrero de 2007, 17:39:37 »

MUCHAS GRACIAS A TODOS por vuestra ayuda

Trataba de conseguir que un led se comportara como el Sol.  Amanecer/anochecer progresivo
Gracias 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.


Código: [Seleccionar]
#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.

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: El Sol
« Respuesta #1 en: 21 de Febrero de 2007, 18:29:34 »
si te funko en el proteus, entonces la depuracion la debes hacer ahora en la realidad, y nos cuentas q fue!!!
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com