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.


Vídeo Informativo sobre el proyecto
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.


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
GALERÍA DE FOTOS
Vídeo Informativo sobre el proyecto
Muy bien Hecho !
ResponderEliminarnota 9
Gracias Ing. Esperando salir Bien en las notas restantes Nos encontramos en Domotica y Robotica.
ResponderEliminardd
ResponderEliminar