PROYECTO RELOJ


Realizaremos el Proyecto: reloj/calendario en lcd de 16x2 avr8 para el cual hemos obtenido la informacion necesaria del Blog http://microcontroladores2utec.wordpress.com/ del laboratorio de Electronica de la Universidad Tecnológica este reloj,  Está basado en el microcontroladores  ATMEGAx8 cuya función es la de mostrar la hora y fecha actual en una pantalla LCD16x2, el registro de la hora y fecha la realiza un circuito integrado DS1307 especialmente diseñado para tal función.
El micro controlador se debe programar para realizar tres grandes tareas:

1Leer la fecha y hora actual desde el DS1307 vía puerto I2C,
2 Mostrar la información  leída, en una pantalla LCD 16x2, ç
3 Recibir instrucciones de los botones de ajuste y realizar los cambios necesarios según estos.

La programación de este está basado en un firmware que se ha diseñado basado en las tres tareas del microcontrolador: Leer, Mostrar, Ajustar. El cual ha escrito en BASCOMAVR.
Teniendo en cuenta el uso de una  batería de Backup de 3v, que es una batería interna que le sirve al DS1307 para no “perder” la hora ante un fallo de la energía principal. es decir que aunque el micro se reinicie, no se perderá el ajuste previo.


Comenzaremos con los detalles de la construcción de nuestro reloj.
Detalle de los componentes a utilizar y cantidad de cada componente:
1 – Atmegax8 – Microcontrolador, 28 pines.
1 – DS1307 – IC RTC
1 -  32.768 Khz – Cristal de cuarzo
1 – LCD 16×2 – Pantalla de cristal liquido
1 – BATERIA 3v – Bateria interna de Backup
1– 10k – trimpot o trimmer
8 – 10kx1/4 – resistor
1 – fuente de 5 VDC
*otros: conector para batería, alambres, bases para IC, PCB.

Esquema de Simulación en Proteus DNS el link de descarga esta al final

Programa a Utilizar el .bas y .hex esta abajo el link de descarga
'********************************************************************************* '* RELOG-CALENDARIO-AVR * '* Programa que muestra la hora y la fecha en un Lcd16x2 * '* botones para cambiar Hora, Minutos, Dia, Mes y Año * '* AtmegaX8, DS1307 , LCD16x2 * * '* abril2011 * '* otoniel.flores@mail.utec.edu.sv * '******************************************************************************* '//Directivas $regfile = "m8def.dat" $crystal = 8000000 $lib "mcsbyte.lbx" $lib "ds1307clock.lib" '//Configuraciones Config Portc = Input Config Debounce = 30 '---configurar el LCD Config Lcd = 16 * 2 Config Lcdpin = Pin , Rs = Pind.5 , E = Pind.4 , Db4 = Pind.3 , Db5 = Pind.2 , Db6 = Pind.1 , Db7 = Pind.0 Cls '---configurar los pines I2C Config Sda = Portd.7 Config Scl = Portd.6 '---configurar direcciones del DS1307 Const Ds1307w = &HD0 Const Ds1307r = &HD1 '//Dim variables Dim Segundos As Byte , Minutos As Byte , Horas As Byte Dim Dia As Byte , Mes As Byte , Anio As Byte Dim Horas_12 As Byte Dim Numero_de_dia As Byte Dim Meridiano As String * 2 Dim Nombre_de_dia As String * 3 '//Inicializaciones Cursor Off Noblink Lcd "***RELOJ-AVR8***" Wait 1 Lowerline : Lcd "*****UTEC12*****" Wait 1 Upperline : Lcd " Rosales y " Waitms 500 Lowerline : Lcd " Carbajal " Waitms 500 Gosub Leer_ds1307 If Anio = 0 Then Gosub Ini_ds1307 '//Programa Principal Do Gosub Leer_ds1307 'leer el DS1307 Gosub Mostrar 'Mostrar en el LCD la hora y fecha Gosub Botones 'Chekear los botones Loop End '//Subrutinas '------------------------------------------------------------------------------- Leer_ds1307: I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cstart I2cwbyte Ds1307r I2crbyte Segundos , Ack I2crbyte Minutos , Ack I2crbyte Horas , Ack I2crbyte Numero_de_dia , Ack I2crbyte Dia , Ack I2crbyte Mes , Ack I2crbyte Anio , Nack I2cstop Segundos = Makedec(segundos) : Minutos = Makedec(minutos) : Horas = Makedec(horas) Dia = Makedec(dia) : Mes = Makedec(mes) : Anio = Makedec(anio) Return '------------------------------------------------------------------------------- Mostrar: '---¿am o pm? If Horas = 0 Then Horas_12 = 12 Meridiano = "AM" Else Horas_12 = Horas Meridiano = "AM" End If If Horas = 12 Then Meridiano = "PM" If Horas > 12 Then Horas_12 = Horas - 12 Meridiano = "PM" End If '...¿nombre_de_dia? If Numero_de_dia = 1 Then Nombre_de_dia = "DO" If Numero_de_dia = 2 Then Nombre_de_dia = "LU" If Numero_de_dia = 3 Then Nombre_de_dia = "MA" If Numero_de_dia = 4 Then Nombre_de_dia = "MI" If Numero_de_dia = 5 Then Nombre_de_dia = "JU" If Numero_de_dia = 6 Then Nombre_de_dia = "VI" If Numero_de_dia = 7 Then Nombre_de_dia = "SA" '---mostrar hora If Horas_12 < 10 And Minutos < 10 And Segundos < 10 Then Upperline : Lcd " " ; " " ; Horas_12 ; ":0" ; Minutos ; ":0" ; Segundos ; " " ; Meridiano End If If Horas_12 < 10 And Minutos < 10 And Segundos > 9 Then Upperline : Lcd " " ; " " ; Horas_12 ; ":0" ; Minutos ; ":" ; Segundos ; " " ; Meridiano End If If Horas_12 < 10 And Minutos > 9 And Segundos < 10 Then Upperline : Lcd " " ; " " ; Horas_12 ; ":" ; Minutos ; ":0" ; Segundos ; " " ; Meridiano End If If Horas_12 < 10 And Minutos > 9 And Segundos > 9 Then Upperline : Lcd " " ; " " ; Horas_12 ; ":" ; Minutos ; ":" ; Segundos ; " " ; Meridiano End If If Horas_12 > 9 And Minutos < 10 And Segundos < 10 Then Upperline : Lcd " " ; Horas_12 ; ":0" ; Minutos ; ":0" ; Segundos ; " " ; Meridiano End If If Horas_12 > 9 And Minutos < 10 And Segundos > 9 Then Upperline : Lcd " " ; Horas_12 ; ":0" ; Minutos ; ":" ; Segundos ; " " ; Meridiano End If If Horas_12 > 9 And Minutos > 9 And Segundos < 10 Then Upperline : Lcd " " ; Horas_12 ; ":" ; Minutos ; ":0" ; Segundos ; " " ; Meridiano End If If Horas_12 > 9 And Minutos > 9 And Segundos > 9 Then Upperline : Lcd " " ; Horas_12 ; ":" ; Minutos ; ":" ; Segundos ; " " ; Meridiano End If '---mostrar fecha If Dia < 10 And Mes < 10 And Anio < 10 Then Lowerline : Lcd " " ; Dia ; "/0" ; Mes ; "/0" ; Anio ; " " ; Nombre_de_dia End If If Dia < 10 And Mes < 10 And Anio > 9 Then Lowerline : Lcd " " ; Dia ; "/0" ; Mes ; "/" ; Anio ; " " ; Nombre_de_dia End If If Dia < 10 And Anio < 10 And Mes > 9 Then Lowerline : Lcd " " ; Dia ; "/" ; Mes ; "/0" ; Anio ; " " ; Nombre_de_dia End If If Dia < 10 And Anio > 9 And Mes > 9 Then Lowerline : Lcd " " ; Dia ; "/" ; Mes ; "/" ; Anio ; " " ; Nombre_de_dia End If If Dia > 9 And Mes < 10 And Anio < 10 Then Lowerline : Lcd " " ; Dia ; "/0" ; Mes ; "/0" ; Anio ; " " ; Nombre_de_dia End If If Dia > 9 And Mes < 10 And Anio > 9 Then Lowerline : Lcd " " ; Dia ; "/0" ; Mes ; "/" ; Anio ; " " ; Nombre_de_dia End If If Dia > 9 And Anio < 10 And Mes > 9 Then Lowerline : Lcd " " ; Dia ; "/" ; Mes ; "/0" ; Anio ; " " ; Nombre_de_dia End If If Dia > 9 And Anio > 9 And Mes > 9 Then Lowerline : Lcd " " ; Dia ; "/" ; Mes ; "/" ; Anio ; " " ; Nombre_de_dia End If Waitms 250 Return '------------------------------------------------------------------------------- Botones: Debounce Pinc.0 , 0 , Set_minutos Debounce Pinc.1 , 0 , Set_horas Debounce Pinc.2 , 0 , Set_dia Debounce Pinc.3 , 0 , Set_mes Debounce Pinc.4 , 0 , Set_anio Debounce Pinc.5 , 0 , Set_dia_sem Return '-------------------------------------- Set_minutos: Incr Minutos If Minutos > 59 Then Minutos = 0 Minutos = Makebcd(minutos) I2cstart I2cwbyte Ds1307w I2cwbyte 1 I2cwbyte Minutos I2cstop Return '-------------------------------------- Set_horas: Incr Horas If Horas > 23 Then Horas = 0 Horas = Makebcd(horas) I2cstart I2cwbyte Ds1307w I2cwbyte 2 I2cwbyte Horas I2cstop Return '-------------------------------------- Set_dia: Incr Dia If Mes = 1 Or Mes = 3 Or Mes = 5 Or Mes = 7 Or Mes = 8 Or Mes = 10 Or Mes = 12 And Dia > 31 Then Dia = 1 If Mes = 4 Or Mes = 6 Or Mes = 9 Or Mes = 11 And Dia > 30 Then Dia = 1 If Mes = 2 And Dia > 28 Then Dia = 1 Dia = Makebcd(dia) I2cstart I2cwbyte Ds1307w I2cwbyte 4 I2cwbyte Dia I2cstop Return '-------------------------------------- Set_mes: Incr Mes If Mes > 12 Then Mes = 1 Mes = Makebcd(mes) I2cstart I2cwbyte Ds1307w I2cwbyte 5 I2cwbyte Mes I2cstop Return '-------------------------------------- Set_anio: Incr Anio If Anio > 99 Then Anio = 0 Anio = Makebcd(anio) I2cstart I2cwbyte Ds1307w I2cwbyte 6 I2cwbyte Anio I2cstop Return '-------------------------------------- Set_dia_sem: Incr Numero_de_dia If Numero_de_dia > 7 Then Numero_de_dia = 1 Numero_de_dia = Makebcd(numero_de_dia) I2cstart I2cwbyte Ds1307w I2cwbyte 3 I2cwbyte Numero_de_dia I2cstop Return '-------------------------------------- Ini_ds1307: '---inicializar ds1307 Dia = 29 : Mes = 4 : Anio = 11 : Numero_de_dia = 6 Horas = 9 : Minutos = 59 : Segundos = 57 Segundos = Makebcd(segundos) : Minutos = Makebcd(minutos) : Horas = Makebcd(horas) Dia = Makebcd(dia) : Mes = Makebcd(mes) : Anio = Makebcd(anio) : Numero_de_dia = Makebcd(numero_de_dia) I2cstart I2cwbyte Ds1307w I2cwbyte 0 I2cwbyte Segundos I2cwbyte Minutos I2cwbyte Horas I2cwbyte Numero_de_dia I2cwbyte Dia I2cwbyte Mes I2cwbyte Anio I2cstop Return '////FIN DEL CODIGO

Diseño de PCB recomendación elaborar su propio diseño, pero al igual abajo esta el link de descarga



Teniendo ya el impreso Procedemos elaborarlo en una tabla o base de cobre especial para circuitos impresos


 






Soldamos cada uno de los componentes a utilizar en el circuito impreso, teniendo en cuenta utilizar poco estaño para que las soldaduras se vean estéticas.


Una vez soldados nuestros componentes tendremos algo asi.




Ya teniendo cada uno de los componentes en su lugar procederemos a adactar nuestro circuito a un chasis.
DSC08970.JPGDSC08982.JPG










El chasis puede ser de Acrílico, los pernos o tornillos que utilizamos son de 2.5 pugadas, se puede utilizar el tamaño de acuerdo a la altura que le quieran dar al chasis.
Una vez ensablado cada una de las partes procedemos a programar el micro y conectamos nuestro reloj con una fuente de 5v para poder ver el funcionamiento de nuestro reloj.



NOTA: a la hora de programar el micro en el SinaProg NO olviden primero programar los fuses y luego cargar el programa a nuestro microcontrolador.

GALERÍA DE FOTOS



Vídeo Informativo sobre el proyecto


Para descargar los archivos tienen que registrarse en www.4shared.com







3 comentarios: