urriellu.net => Proyectos => Electrónica => 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
La 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]
- ; CLK[cubo]
- ; por Adrian Bulnes [Urriellu]
- ; clk3 @ urriellu . net
- ; 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 ;-)
- 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)
- INCLUDE P16F877A.INC
- __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
- ;aliases para pines
- PuertoAlarma EQU PORTB
- BitAlarma EQU 1
- PuertoPulsadores EQU PORTB
- [...]
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.
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.
- Descargar AVI (XviD + MP3 LAME) [10.05MiB]
ProyectosElectrónicaCLK³pic³progMecatrónicaSoftwarePigmeoOtrosmabxArtículosElectrónicaSoftwareOtrosVentajas C#EventosII Concurso Universitario de Software LibreCampeonato de microbótica en la Universidad de Oviedo. Verano 2007Sobre urriellu.netEste sitio webSobre míLicencias de publicaciónContacto
idiomaespañolrot13código morsebrailleenglishrot13código morsebraille