Autor Tema: Reloj despertador con 16F84A en CCS  (Leído 8244 veces)

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

Desconectado kekoss

  • PIC10
  • *
  • Mensajes: 1
Reloj despertador con 16F84A en CCS
« en: 29 de Abril de 2011, 06:11:29 »
Hola soy nuevo en esto de los temas de los micros. Bien planteo lo que quiero hacer. Es un reloj despertador con el pic 16F84A, el despliegue de la hora sera con display de 7 segmentos multiplexados. El codigo lo muestro el cual tome de la pagina de REDPIC, me ha dado bastante idea o casi toda de como hacer algunas funciones del reloj, aunque necesito hacer algunas modificaciones como en la directiva del pic y agregarle la parte de la Hora ya que en este codigo solo usa y despliega segundos y minutos, y en mi caso pretendo desplegar horas y minutos.
Otra cosa que me faltaria modificar es poner el codigo para poder ajustar la hora del reloj como cualquier otro y ademas de poner la hora de alarma para disparar un buzzer, al momento de ajustar la alarma quiero que como cualqueir reloj se despliegue en ese momento la hora de la alarma y se vea el cambio al presionar un push boton. Pues en pocas palabras hacer lo tipico de un reloj despertador jejeje. No estoy seguro si el programa en CCS para el reloj despertador pueda ser almacenado en el pic 16F84A. Una cosilla mas el despertador en vez de ser desactivado por pushboton quiero que se desactive por laser con un ldr o algun dispositivo optoelectronico, jejeje como vi por ahi en internet a un reloj que le disparaban a un blanco con una pistolita con laser para desactivar la alarma :).
No se si los botones para modificar la hora del reloj y la hora de alarma las pudiera hacer con interrupciones, Ademas usar tres botones, uno que fuera para entrar al cambio de hora de reloj y otro para el cambio de hora de alarma y el tercero para incrementar minuto a minuto la hora tanto del reloj como de la alarma o usar mas botones. :mrgreen:
Aqui dejo el link donde tome el codigo http://picmania.garcia-cuervo.net/picc.php#CRONOPIC1
   
Código: [Seleccionar]

#include <16f876a.h> // Selecciona el PIC
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT // Opciones de configuración
#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz
#use standard_io(B) // PORTB en estandar IO digital
#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)

char const RTCCxS=15; // Número de RTCC's para 1 segundo con 4 Mhz / 1:256.

// VARIABLES GLOBALES

int nRTCC=0x00;           // Contador de interrupciones RTCC completas
int segundo=0x0;          // Segundos del Reloj
int minuto=0x0;           // Minutos del Reloj
int D1=0x00;              // Contenido de los Displays
int D2=0x00;
int D3=0x00;
int D4=0x00;
int l_digit, h_digit;     // Resultado de la conversión bin2bcd
int i;                    // index general

void testdisplays(void);  // Función que testea los displays
void display_reloj(void); // Función que muestra el contenido del reloj
void time2bcd(void);      // Función que convierte minutos y segundos a 4 x BCD
void bin2bcd(int valor);  // Función que convierte de Binario a BCD

#int_RTCC                 // Interrupción por desbordamiento
RTCC_isr() {              // del TIMER0 RTCC

  if(++nRTCC==RTCCxS){
    nRTCC=0x00;
    if(++segundo>59){
      segundo=0;
      if(++minuto>59){
        minuto=0;
      }
    }
  }

}

void main(void) {

  int ksegundo=0x00;

  setup_counters(RTCC_INTERNAL,RTCC_DIV_256); // TIMER0: Clock Interno y Preescaler
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);

  enable_interrupts(INT_RTCC);// Habilito Interrupción RTCC
  enable_interrupts(global);  // Habilito Interrupciones


  do{ // Bucle infinito

    if(segundo!=ksegundo){    // si cambia el segundo actualizo las
      time2bcd();             // variables con lo que hay que mostrar
      ksegundo=segundo;
    }

    display_reloj();          // Muestra constantemente

  }While(TRUE);

}

void display_reloj(void){ // Función que muestra el contenido del reloj

  output_b(D1);           // Muestro 1er carácter de segundo
  output_high(PIN_B4);
  delay_us(30);
  output_b(D2);           // Muestro 2do carácter de segundo
  output_high(PIN_B5);
  delay_us(30);
  output_b(D3);           // Muestro 1er carácter de minuto
  output_high(PIN_B6);
  delay_us(30);
  output_b(D4);           // Muestro 2do carácter de minuto
  output_high(PIN_B7);
  delay_us(30);

}

void time2bcd(void){     // Función convierte minutos y segundos a 4 x BCD

  bin2bcd(segundo);      // Paso de binario a BCD el segundo y actualizo
  D1 = l_digit;          // contenido a mostrar
  D2 = h_digit;
  bin2bcd(minuto);       // Paso de binario a BCD el minuto y actualizo
  D3 = l_digit;          // contenido a mostrar
  D4 = h_digit;

}

void bin2bcd(int valor){ // Función que convierte de Binario a BCD

  h_digit=0;

  if (valor>=10){
    do{
      valor-=10;
      h_digit++;
    } while (valor>=10);
  }
  l_digit=valor;
}