Página principal
Arduino
Reloj mediante interrupciones internas
xsetaseta@gmail.com

Este montaje es un reloj hecho mediante arduino utilizando interrupciones internas.
Es un reloj simple, sin alarmas, hecho en 3 horas. Es una utilidad rápida de interrupciones internas.
Hace tiempo hice un reloj mediante un ATMEGA88 utilizando un cristal de cuarzo hecho específicamente para relojes, por lo cual es bastante mas exacto. miAT8.html
Esto es simplemente una práctica rápida.


Esquema de conexión.



Realización del circuito.



Emulación con proteus.

//Reloj hecho mediante interrupciones internas
// SETA43
// Programa hecho por JUAN GALAZ
//08/01/2012
#include <avr/io.h>
#include <avr/interrupt.h>

#include <LiquidCrystal.h>

byte LedPin=8;
byte e1Pin=7;
byte e2Pin=6;

byte horas,minutos,segundos;
byte bandera=1;

char time[15];

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup(){
  Serial.begin(9600);
  lcd.begin(16, 2);
  Serial.println("RELOJ");
  pinMode(LedPin, OUTPUT);
  pinMode(e1Pin, INPUT);
  pinMode(e2Pin, INPUT);
  cli();
  TCCR1A=0;
  TCCR1B=0;
  OCR1A=15624;
  TCCR1B |= (1<<WGM12);
  TCCR1B |= (1<<CS10);
  TCCR1B |= (1<<CS12);
  TIMSK1=(1<<OCIE1A);
  sei();
}

void loop()
{
  if(bandera)
    {
     bandera=0;
     digitalWrite(LedPin, !digitalRead(LedPin));    
     sprintf(time,"%02d:%02d:%02d",horas,minutos,segundos); 
     Serial.println(time);
     lcd.setCursor(0, 1);
     lcd.print(time);      
    }
   if(!digitalRead(e1Pin))
       {
         minutos++;
         segundos=0;
         if(minutos==60)minutos=0;
         bandera=1;
         while(!digitalRead(e1Pin));
       }
   if(!digitalRead(e2Pin))
       {
        horas++;
        if(horas==24)horas=0;
        bandera=1;
        while(!digitalRead(e2Pin));
       }
   if(segundos==0)
      {
       lcd.setCursor(0, 0);
       lcd.print("xsetaseta@gmail");
      } 
   if(segundos==15)
      {
       lcd.setCursor(0, 0);
       lcd.print("Reloj simple   ");
      }   
   if(segundos==30)
      {
       lcd.setCursor(0, 0);
       lcd.print("Arduino        ");
      }     
       
}

ISR(TIMER1_COMPA_vect)
{
  bandera=1;
  segundos++;
  if(segundos>59)
    {
     segundos=0;
     minutos++;
     if(minutos>59)
         {
          minutos=0;
          horas++;
            if(horas>23)
              {               
               segundos=0;
               minutos=0;
               horas=0;
              }
         } 
    }
     
}
Programa del arduino.

Hasta pronto.
JUAN GALAZ

Bibliografía:
http://www.bairesrobotics.com/2012/08/ansi-c-arduino-parte-3-timers-interrupts/
http://tallerarduino.wordpress.com/2012/03/15/arduino-tutorials-cap-5-interrupciones-internas/
http://www.pjrc.com/teensy/td_libs_LiquidCrystal.html