urriellu.net => Proyectos => Electrónica => CLK³

CLK³CLK³ es un reloj despertador binario construido completamente desde cero, basado en un microcontrolador PIC16F877A cuyo programa está escrito en lenguaje ensamblador.

La hora actual (y la hora configurada como alarma mientras se configura) se representa en formato BCD utilizando 20 LEDs [cómo leerlo].

La configuración se hace mediante cuatro pulsadores de la misma manera que cualquier otro reloj despertador digital.

Se alimenta mediante una fuente de alimentación externa de 7 a 35VCC.

Es el primer circuito electrónico que diseñé desde cero, la primera vez que programé un microcontrolador, la primera vez que escribí un programa en lenguaje ensamblador y mi segundo PCB casero. Normalmente las cosas se hacen poco a poco pero a mí me gusta aprender y construir cosas bastante más complejas de lo que sé, de manera que aprendo y avanzo mucho más rápido.

 

Circuito electrónico

esquema electrónico del reloj binarioLa alimentación externa de 7-35V se convierte a 5V con un LM7805. El circuito puede programarse mediante ICSP conectando el cable de programación a P2 y activando las posiciones 6 y 7 de S5 y desactivando todas las demás. Para usar el circuito en modo reloj deben activarse las posiciones 1 a 5 y desactivarse 6 y 7.

Los LEDs que representan las horas están conectados a PORTA, los de los minutos a PORTC y los de los segundos a PORTD. El pulsador S1 aumenta las horas, S2 los minutos, S3 se utiliza para configurar la hora actual y S4 para configurar la alarma.

La resistencia conectada a la base del transistor Q1 es demasiado pequeña.

El diodo D21 parece puesto al revés pero está conectado correctamente ya que a P1 se conecta el jack de alimentación, por lo que la corriente debe fluir desde la masa del circuito hacia P1-1 que es la masa de la alimentación externa.

El circuito tiene 2 masas: GND y Vss. Normalmente están cortocircuitadas pero se dividen cuando el PIC está siendo programado de manera que la alimentación que llega por Vss (desde el programador ICSP) está completamente aislada del resto del circuito.

El circuito está diseñado usando Altium Designer 6.

 

Programa/firmware

clk3.asm, 435 líneas      [descargar]

  1. ; CLK[cubo]
  2. ; por Adrian Bulnes [Urriellu]
  3. ; clk3 @ urriellu . net
  4. ; Aviso: todos los comentarios estan escritos sin tildes porque MPLAB solo soporta archivos en ASCII (y en teoria tambien UTF16, pero no esta bien implementado y su uso es inutil, culpa de Microchip ;-)
  5.         LIST P=16F877A, R=hex, W=-302, W=-208  ;elegimos modelo de PIC, raiz hexadecimal, eliminamos avisos 302 (registros en bancos !=0) y 208 (etiquetas demasiado largas)
  6.         INCLUDE P16F877A.INC
  7.         __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _BODEN_ON ;mirar el archivo de cabecera. Brown-Out Reset activado para que ante caidas de tension no siga funcionando y que se consideren algunos botones como pulsados
  8. ;aliases para pines
  9. PuertoAlarma                EQU PORTB
  10. BitAlarma                                   EQU 1
  11. PuertoPulsadores                        EQU PORTB
  12.  
  13. [...]

Con un oscilador de 20MHz se ejecuta una instrucción cada 200ns, utilizando un prescaler de 64 para TMR0 se consigue que el intervalo entre cada valor consecutivo en el registro TMR0 sea de 0,0000128s (12,8μs). Cada vez que se desborde TMR0 se procesa una interrupción, esto ocurre cada 256 intervalos de TMR0, es decir, cada 3276,8μs (3,2768ms). Si se contabilizan 305 desbordamientos del registro TMR0 obtenemos divisiones de tiempo de 999,424ms (0,999424s). Así que si contabilizamos 45 intervalos de TMR0 (de 12,8μs) (precargándolo a 211) además de los 305 desbordamientos de TMR0, conseguimos procesar cierta función exactamente cada segundo.

305 veces x 0,0032768 seg + 1 vez x 45 pulsos x 64 [prescaler] x 0,0000002 seg = exactamente 1 segundo

No obstante el reloj no es exacto debido a que el oscilador no lo es, así que las instrucciones no se ejecutan exactamente cada 200ns, lo que hace que acumule varios minutos de error al día.

Cascasa

La carcasa fue construida usando una plancha de aluminio de 2mm doblada para formar una caja irregular, de manera que el frontal (donde están los LEDs) quede ligeramente elevado y facilite la lectura.

El despiece está hecho en AutoCAD 2006. Todas las medidas están en milímetros.

despiece de la carcasa del reloj binario, vista generalpanel trasero de la carcasadespiece de la carcasa del reloj binario, vista lateralcarcasa del reloj binario montado en CADdoblando el aluminiodoblando el aluminiodoblando el aluminiodoblando el aluminiodoblando el aluminiocarcasa terminadacarcasa terminadacarcasa terminadacarcasa terminada 

 

PCB

PCB del reloj binariofotolitos impresosPCB revelado, antes de atacarPCB terminado 

 

Montando el circuito

colocando componentescolocando componentescolocando componentescolocando componentescolocando componentescolocando componentescortando placa perforada para colocar los LEDsplaca perforada cortadacolocando los LEDsestañando los LEDsuniéndolo todo 

 

Reloj terminado

CLK³CLK³CLK³ 

 

Vídeos

Vídeo del reloj binario/BCD funcionando sin carcasa, con los circuitos al aire. Se aprecia que los intervalos entre segundos no duran exáctamente un segundo, no obstante el problema es de la cámara (es de fotos, no de vídeo), el error cometido por el circuito es inapreciable.

Reloj terminado funcionando.