martes, 5 de marzo de 2013

Arduino - Reloj mediante DS1302

Página principal

Arduino
Reloj mediante DS1302
xsetaseta@gmail.com

Este montaje es otro reloj realizado mediante el CI DS1302.
El DS1302 es un integrado que contiene un reloj-calendario.
A falta de alimentación sigue funcionando mediante una pequeña batería de 3V.

La comunicación con el microprocesador se realiza mediante 3 lineas, siendo el formato de comunicaciones propio y muy simple.
El reloj realizado tiene además de hora-minutos-segundos , día-mes-año, una alarma y un auto apagado.
El programa es una mezcla de el programa que viene como ejemplo en la página de arduino
http://playground.arduino.cc/Main/DS1302y mi montaje http://seta43.duckdns.org/ardura2.html.
Estuve probando la librería ds1302 para el arduino, pero me paso algo curioso, a pesar de tener dos DS1302 aparentemente iguales, el uno funcionaba y el otro no. Por lo cual decidí utilizar el programa que viene como ejemplo en la página de arduino, que funciona en los dos CI.

Para mantener la alarma cuando se va la alimentación, he utilizado los registros del propio DS1302.

El programa tiene el siguiente menú:
SLEEP
ALARM
TIME
   DATE   
60 Minutos, -10 min.
ON/OFF
HORAS
DIA

HORAS
MINUTOS
MES

MINUTOS

AÑO



Circuito montado


El DS1302 montado con la batería


Esquema del circuito.

Programa arduino


Saludos
SETA43

Bibliografía:
http://playground.arduino.cc/Main/DS1302
http://salvador.maciashernandez.com/Escolares/Microprocesadores/DS1302/DS1302_001.html
http://www.fettesps.com/time-keeping-with-the-arduino-and-ds1302/
http://henningkarlsen.com/electronics/library.php?id=5

sábado, 2 de marzo de 2013

Radio-Reloj-Despertador con TEA5767 y Arduino.

Página principal

Radio-Reloj-Despertador con TEA5767 y Arduino.


Este montaje es un radio-reloj-despertador realizado con TEA5767 y un arduino.
Para manejar todas la funciones se utiliza dos pulsadores para los menús.
Hubiese sido mucho mas fácil utilizar mas botones pero lo he hecho de esta forma para minimizar al máximo el interface.
Para cambiar la frecuencia en modo DIAL se utiliza un potenciómetro.
Como amplificador de audio he utilizado unos altavoces de PC auto-alimentados.
Dispone de 20 memorias, se almacenan en la EEPROM de microcontrolador, por lo cual no desaparecen cuando se desconecta la radio.
El reloj se basa en interrupciones internas de microprocesador, cuando se quita la corriente se va la hora.
En próximos montajes utilizare un DS1302 como reloj, es más preciso y no se va la hora.
Todo se ven en un LCD de 2x16 caracteres.

El TEA5767 es un integrado que tiene todo lo necesario para realizar una radio FM. Se necesitan unos pocos componentes añadidos para su funcionamiento, de tal forma que se pueden comprar todo el conjunto montado por 3,5€.
Toda la programación del TEA5767 se realiza mediante el I2C-bus.
Las características del TEA5767 son las siguientes:
* High sensitivity due to integrated low-noise RF input amplifier
* FM mixer for conversion to IF of the US/Europe (87.5 MHz to 108 MHz) and Japanese
  (76 MHz to 91 MHz) FM band
* Preset tuning to receive Japanese TV audio up to 108 MHz
* RF Automatic Gain Control (AGC) circuit
* LC tuner oscillator operating with low cost fixed chip inductors
* FM IF selectivity performed internally
* No external discriminator needed due to fully integrated FM demodulator
* Crystal reference frequency oscillator; the oscillator operates with a 32.768 kHz clock
  crystal or with a 13 MHz crystal and with an externally applied 6.5 MHz reference
  frequency
* Phase-locked loop (PLL) synthesizer tuning system
* I2C-bus and 3-wire bus, selectable via pin BUSMODE
* 7-bit IF counter output via the bus
* 4-bit level information output via the bus
* Soft mute
* Signal dependent mono to stereo blend [Stereo Noise Cancelling (SNC)]
* Signal dependent High Cut Control (HCC)
* Soft mute, SNC and HCC can be switched off via the bus
* Adjustment-free stereo decoder
* Autonomous search tuning function
* Standby mode
* Two software programmable ports
* Bus enable line to switch the bus input and output lines into 3-state mode
Recomiendo encarecidamente ver product data sheet el TEA5767 y APPLICATION NOTE, para ver todas sus características y modos de programación.

Esquema de TEA5767


TEA5767 con todos los componentes.


Descripción de la patillas.


TEA5767 montado sobre un circuito impreso.


Arduino controlando el TEA5767 mediante el bus I2C.

Esquema

Para encender la radio, pulsar Button1->Button2->Button1, y la radio estara encendida 60 minutos.
También se encenderá la radio al llegar a la hora de la alarma, siempre y cuando este activa la alarma, esta alarma es diaria.
Se sabe que la alarma está activa cuando aparece una "A" colocada a la izquierda de la hora.
Alternativamente se muestra el nivel de señal y si la señal es mono o stereo.


Imagen del LCD

Programa del arduino

MENÚS
(Cambiar con Button1 y seleccionar con Button2)

SLEEP Button2 decrementa desde 60 min. en 10 min. hasta llegar
a 10 minutos, despues decrementa en 1min. hasta llegar a 0.
Salir con  Button1.
MODE MEMO En el modo memo se cambian las emisoras memorizadas mediante Button2.
Cada pulsación aumenta el numero de memoria.
Cuando llega a 20 se vuelve a cero.
MODE SCAN Escanea emisoras desde la posición actual de frecuencia pulsando Button2.
Llegado a 108MHz vuelve a buscar desde 87.5MHz.
MODE DIAL Sintoniza la frecuencia mediante el potenciometro.
ALARM Se selecciona entre (ON/OFF-Horas-Minutos) con Button1.
Se cambia el valor con Button2.
MEMORY Se selecciona la memoria con Button2. Se memoriza con Button1.
LEVEL-SCAN Se cambia el valor (1-2-3) con Button2. Se selecciona con Button1.
TIME Se selecciona entre (Horas-Minutos) con Button1.
Se cambia el valor con Button2.

Debido a que la frecuencia intermedia es de 225KHz, puede ocurrir de ciertas ocasiones cuando la señal de dos emisoras sean muy fuerte y este muy cerca la una de la otra que se interfieran.
Para estos casos deberiamos utilizar el bit :
    4 HLSI HIGH/LOW Side Injection: if HLSI = 1 then HIGH side LO injection; if HLSI = 0 then   LOW side LO injection
Además deberiamos cambiar el modo de que se calcula la frecuencia, mirar APPLICATION NOTE.
En mi ciudad existen bastantes emisoras, pero no me a ocurrido el problema, por lo cual no he tenido en cuenta el problema.

Vídeo de la radio funcionando


Saludos.
JUAN GALAZ



Bibliografía:
http://www.doctormonk.com/2012/03/tea5767-fm-radio-breakout-board-for.html
http://www.electronicsblog.net/arduino-fm-receiver-with-tea5767/
http://kalum.posterous.com/arduino-with-tea5767-single-chip-radio-and-no

viernes, 22 de febrero de 2013

Control de la radio TEA5767 mediante RS232. Programación en Gambas y SDL.

Control de la radio TEA5767 mediante RS232.
Programación en Gambas y SDL.


Este artículo no sabía si ponerlo en montajes electrónicos o en programación. Pero debido a que la programación en Gambas y SDL me a supuesto el 90% del trabajo, he decidido ponerlo en informática.
El TEA5767 es un integrado que tiene todo lo necesario para realizar una radio FM. Se necesitan unos pocos componentes añadidos para su funcionamiento, de tal forma que se pueden comprar todo el conjunto montado por 3,5€.
Toda la programación del TEA5767 se realiza mediante el I2C-bus.
Las características del TEA5767 son las siguientes:
* High sensitivity due to integrated low-noise RF input amplifier
* FM mixer for conversion to IF of the US/Europe (87.5 MHz to 108 MHz) and Japanese
  (76 MHz to 91 MHz) FM band
* Preset tuning to receive Japanese TV audio up to 108 MHz
* RF Automatic Gain Control (AGC) circuit
* LC tuner oscillator operating with low cost fixed chip inductors
* FM IF selectivity performed internally
* No external discriminator needed due to fully integrated FM demodulator
* Crystal reference frequency oscillator; the oscillator operates with a 32.768 kHz clock
  crystal or with a 13 MHz crystal and with an externally applied 6.5 MHz reference
  frequency
* Phase-locked loop (PLL) synthesizer tuning system
* I2C-bus and 3-wire bus, selectable via pin BUSMODE
* 7-bit IF counter output via the bus
* 4-bit level information output via the bus
* Soft mute
* Signal dependent mono to stereo blend [Stereo Noise Cancelling (SNC)]
* Signal dependent High Cut Control (HCC)
* Soft mute, SNC and HCC can be switched off via the bus
* Adjustment-free stereo decoder
* Autonomous search tuning function
* Standby mode
* Two software programmable ports
* Bus enable line to switch the bus input and output lines into 3-state mode

Recomiendo encarecidamente ver product data sheet el TEA5767, para ver todas sus características y modos de programación.

Esquema de TEA5767


TEA5767 con todos los componentes.


Descripción de la patillas.



TEA5767 montado sobre un circuito impreso.


Arduino controlando el TEA5767 mediante el bus I2C.

He creado dos programas, uno en Gambas y otro con la librería SDL, que manejan a través del arduino la radio FM TEA5767.
Su funcionamiento es el siguiente:
El programa en el ordenador mandan a través del puerto USB ordenes al arduino.
    DATO1=15
    DATO2=117

El arduino las procesa y manda las ordenes oportunas a través de bus-I2C al TEA5767.
     Wire.beginTransmission(0x60);
     Wire.write(dato1);
     Wire.write(dato2);
     Wire.write(dato3);
     Wire.write(dato4);
     Wire.write(dato5);
     Wire.endTransmission();


La salida del audio se puede conectar a unos altavoces amplificados de PC, donde se escucha la radio.

Lo que me satisface más, es el poder compilar para las dos plataformas, Linux o Windows, con solo cambiar la directiva YesWindows 0 por #define YesWindows 1 en el fichero define.h.

La programación se ha realizado en Linux  con la IDE geany , y en Dev-C++ bajo Windows.

Archivos_SDL
Programa SDL funcionando en Linux.


Programa SDL funcionando en Windows.


Programa Gambas funcionando en Linux.

Archivos_Gambas

Programa_Arduino


Saludos.
JUAN GALAZ

Bibliografía:
http://www.doctormonk.com/2012/03/tea5767-fm-radio-breakout-board-for.html
http://www.electronicsblog.net/arduino-fm-receiver-with-tea5767/
http://kalum.posterous.com/arduino-with-tea5767-single-chip-radio-and-no

jueves, 7 de febrero de 2013

Antena wifi. Antena sectorial o de panel.

Página principal

Antena wifi
Antena sectorial o de panel.
xsetaseta@gmail.com

El otro día me trajo un amigo una antena recibida desde China, era grande, además llevaba integrado el chip.
Tenía buena pinta, y al hacer pruebas nos dio una muy buena recepción de señal.



Después de investigar por internet pude descubrir que esta antena tenía dos nombres, dependiendo de donde mirases, antena sectorial o de panel.
La antena es de muy fácil construcción. Tiene una chapa de aluminio de 180x160 mm en el fondo. A 7 mm sobre la placa de aluminio se a colocado una placa de circuito impreso con el dibujo de la antena.
La placa de aluminio es la masa y en el punto central del circuito impreso se conecta el vivo del cable.
Los planos son los siguientes:
Plano de medidas
Plano del circuito impreso


Como en este momento no tengo una placa de circuito impreso tan grande he decidido hacerlo en chapa, soldando todos los elementos con estaño. La separación entre las chapas la he hecho con trozos de barrita de pegamento térmico. He comprobado que el pegamento termofusible no se calienta en el microondas.




De las pruebas hechas comparando con la antena Belgrado, diría que la belgrano es mas directiva, y la otra coge más señales de router.
Con la antena Belgrado he recibido 67 señales de router, con la antena de panel 93 señales de router.
Pero unas señales que se veían con una antena no se veían con la otra y a la inversa.

Como conclusión diría que tiene muy buena ganancia y recomiendo su construcción.

Saludos.
JUAN GALAZ

Enlaces:
    http://notodoeswindows.files.wordpress.com/2009/11/antenas-caseras.pdf
   http://www.zero13wireless.net/foro/showthread.php?3489-Paso-a-Paso-Fabricacion-de-Antena-Sectorial-14-dBi-s-por-Topacho

miércoles, 6 de febrero de 2013

Arduino - Reloj mediante interrupciones internas y registrador de temperaturas.

Página principal

Arduino
Reloj mediante interrupciones internas
y
registrador de temperaturas.
xsetaseta@gmail.com

Este montaje es un reloj hecho mediante arduino utilizando interrupciones internas, se basa en mi anterior montaje reloj.
Tiene además dos sensores de temperatura DS18S20 colocados en un cable de dos hilos utilizando la librería OneWire.

Se registran la temperaturas  y se almacenan en la EEPROM interna (512 bytes) del ATmega328.
Cada registro costa de 5 bytes, por lo que el máximo de registros es de 101 registros.
He realizado distintos tipos de REC, dependiendo del tiempo entre grabación de datos.


El montaje tiene dos pulsadores para poner en hora el reloj y realizar las distintas funciones que dispone el circuito.




Realización del circuito.


Esquema.
No he podido simular en proteus los sensores de temperatura.

Debido a que el  código fuente es muy extenso lo he puesto en una página separada de la presentación
Código fuente del arduino CÓDIGO

Con los datos grabados toda la noche en Palencia (España),  y utilizando una hoja de cálculo para realizar un gráfico, he hecho esto.
El sensor1 está colocado en el exterior, y el sensor2 está colocado en el interior de la casa.

En el eje X he figurado las horas, y en el eje Y los grados centígrados.


Gráfico del sensor metido en el frigorífico.

El consumo total del circuito es de 27mA, el LCD solo consume 1,5mA.
La autonomía utilizando baterías es un tanto escasa, mi próximo objetivo es reducir su consumo.
He leído un artículo de como reducir el consumo http://blog.dosbotones.com/2011/09/reducir-el-consumo-de-arduino.html , en algún montaje posterior intentare poner en práctica todo lo que indica el artículo.


Saludos.
Juan Galaz

domingo, 13 de enero de 2013

Arduino Medidor temperatura, servidor WEB, reloj

Página principal

Arduino
Medidor temperatura, servidor WEB, reloj.
xsetaseta@gmail.com

Este montaje es una mezcla de varios de los anteriores proyectos, es un medidor de temperatura de dos sensores interior y exterior, un pequeño servidor de web en modo texto, y un pequeño reloj funcionando mediante interrupciones internas.
Utiliza la tarjeta Arduino Ethernet Shieldb con lectora de tarjetas micro SD.

-El medidor de temperatura se basa en dos sensores DS18S20 colocados en un cable de dos hilos utilizando la librería OneWire.
Para mas detalles recomiendo mi anterior montaje ardusd.html
La lectura de la temperatura se efectúa  dos veces por minuto, en el segundo 5 y en el 30.

Esquema de los sensores de temperatura.

-Para el servidor de web en modo texto,  utilizo un fichero llamado html.txt almacenado en una tarjeta micro SD.
Aquí se puede poner el texto que se desee visualizar en el servidor, debe tener formato html, demás he añadido un pequeño script hecho en JavaScript para ver la fecha y la hora del navegador.
Ya que vivo en Palencia, he puesto un texto sacado de Wikipedia sobre la ciudad.
int LeerSD()
{
 File midataFile;
  midataFile=SD.open("html.txt", FILE_READ);
  if(midataFile)
   {   
     while (midataFile.available())
       {
        client.write(midataFile.read());
       }     
     midataFile.close();
   }
    else
   {
    Serial.println("Error read SD ");  
   }
}

Código del volcado del fichero html.txt en la página web

-El reloj de tiempo real se basa en interrupciones internas.
Cuando el Timer1 llega a  la cifra 15624, genera una interrupción y se pone a cero el contador volviendo a contar otra vez.
Este numero se saca de la siguiente forma:
 Frecuencia del procesador 16Mhz dividido por el prescaler puesto a 1024 nos da una frecuencia de 15625, y a esta cifra le debemos restar 1, con lo cual nos da la el numero 15624.
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;
              }
         }
    }    
}

Código de la interrupción que realiza la cuenta de segundo, minutos y horas.


Esquema del circuito.


Montaje del circuito.


Visualización de la página web.

// SETA43
// Modificacion 5-01-2012
//servidor web_ficheros


#include <SD.h>
#include <SPI.h>
#include <Ethernet.h>
#include <OneWire.h>


#include <LiquidCrystal.h>
LiquidCrystal lcd(18, 19, 14, 15, 16, 17);

char horas,minutos,segundos;
char bandera=1;
char VARI[30]="0";

//numero de MAC
//numero de ip, depende de tu red
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,2, 177);

EthernetClient client;


static char valor[10];
float ftempe;
float sensor1;
float sensor2;

byte LedPin=8; //Led

OneWire ds(2); // pin utilizado para el bus Onewire

// Inicializa la libreria  Ethernet 
// Selecciona el puerto 80, por defecto HTTP):
EthernetServer server(80);

void setup()
{
  pinMode(18, OUTPUT);
  pinMode(19, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(15, OUTPUT);
  pinMode(16, OUTPUT);
  pinMode(17, OUTPUT);
  lcd.begin(16, 2);
  
  pinMode(LedPin, OUTPUT); //Led
  
  pinMode(4, OUTPUT); // Declaramos el pin ChipSelect como salida
  Serial.begin(9600);
  Serial.println("Servidor WEB almacenada en SD");
  Serial.println("Iniciando tarjeta SD"); // Texto informativo
  if(!SD.begin(4))
    {  
    Serial.println("Tarjeta erronea o no insertada");
    return;
    }
  Serial.println("Tarjeta OK"); // Texto informativo

  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("Servidor en ");
  Serial.println(Ethernet.localIP());
  
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  
  cli();
  TCCR1A=0;
  TCCR1B=0;
  OCR1A=15624;
  TCCR1B |= (1<<WGM12);
  TCCR1B |= (1<<CS10);
  TCCR1B |= (1<<CS12);
  TIMSK1=(1<<OCIE1A);
  sei();  
}

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;
              }
         } 
    }     
}

void loop()
{
  if(segundos==5 || segundos==30 )
    {
     LeerSensores(); 
     Serial.println(VARI);
     lcd.setCursor(0, 1);
     lcd.print("A-");
     lcd.print(sensor1);
     lcd.print(" B-");
     lcd.print(sensor2);
     lcd.print(" ");
    }
    
if(bandera)
    {
     bandera=0;
     sprintf(VARI,"%02d:%02d:%02d",horas,minutos,segundos);
     lcd.setCursor(0, 0);
     lcd.print(VARI);
     digitalWrite(LedPin, !digitalRead(LedPin));
    }    

if(!digitalRead(7))
       {
         minutos++;
         segundos=0;
         if(minutos==60)minutos=0;
         bandera=1;
         while(!digitalRead(7));
       }
   if(!digitalRead(6))
       {
        horas++;
        if(horas==24)horas=0;
        bandera=1;
        while(!digitalRead(6));
       }    
    
  client = server.available();
  if (client) {
    Serial.println("new client");

    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        
        if (c == '\n' && currentLineIsBlank) {
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
 
          client.println("<hr>");
          client.print("<h4>Temperatura en Palencia</h4>");
          client.print("<table border=\"1\">");
          client.print("<tr><td>Sensor1<br>Exterior</td><td >Sensor2<br>Interior</td></tr>");
          client.print("<tr>");
          client.print("<td><h1><font color=\"#cc0000\">");
          client.print(sensor1);
          client.println("&ordm;C");
          client.print("</font></h1></td>");
          client.print("<td><h1><font color=\"#cc0000\">");
          client.print(sensor2);
          client.println("&ordm;C");
          client.print("</font></h1></td>");
          client.print("</tr>");
          client.print("</table>");
          client.println("Hora Arduino ");
          client.println(VARI);
          client.println("<hr>");
          LeerSD();            
          client.println("</html>");
          break;
        }
        if (c == '\n') currentLineIsBlank = true;
          else if (c != '\r') currentLineIsBlank = false;
      }
    }
    delay(1);
    client.stop();
    Serial.println("client disonnected");
  }
}



int LeerSD()
{ 
 File midataFile;
  midataFile=SD.open("html.txt", FILE_READ);
  if(midataFile)
   {    
     while (midataFile.available())
       {
        client.write(midataFile.read());
       }      
     midataFile.close();
   }
    else
   {
    Serial.println("Error read SD ");
   }
}

int LeerSensores()
{
         getTemp(1);
         sensor1=ftempe;
         getTemp(1);
         sensor2=ftempe; 
         getTemp(0);
         Serial.print(sensor1);
         Serial.print(",");
         Serial.print(sensor2);
         Serial.println(" ");
}

int getTemp(char x)
{

byte data[12];
byte addr[8];
char i;
byte MSB;
byte LSB;

  if ( x==0 || !ds.search(addr))
    {
      ds.reset_search();
      return 0;
    }

  if ( OneWire::crc8( addr, 7) != addr[7])
    {
      Serial.println("CRC is not valid!");
      return -1;
    }

  if ( addr[0] != 0x10 && addr[0] != 0x28)
    {
      Serial.print("Device is not recognized");
      return -1;
    }

  ds.reset();
  ds.select(addr);
  ds.write(0x44,1); // start conversion, with parasite power on at the end
  delay(1000); // espera para que carge la tension el IC

  byte present = ds.reset();
  ds.select(addr);
  ds.write(0xBE); // Read Scratchpad

  for ( i = 0; i < 9; i++) data[i] = ds.read();

    MSB = data[1];
    LSB = data[0];

   float tempRead = ((MSB << 8) | LSB); //using two's compliment
   ftempe = tempRead / 2;
  return 1;
}
Programa del arduino.

Comento que la mezcla de las interrupciones con algunas librerías me ha vuelto loco, creo que se debe a que algunas librerías utilizan interrupciones por lo cual algunas veces se solapan. En cualquier caso tal como está escrito el programa funciona bien.


Un saludo.
JUAN GALAZ

Bibliografía:
    http://en.wikipedia.org/wiki/1-Wire .
    tallerarduino.wordpress.com David Alvarez Medina
    http://bildr.org/2011/07/ds18b20-arduino/
    http://owfs.org/index.php?page=ds18s20
    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


martes, 8 de enero de 2013

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.

//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