con un poco de entrenamiento es fácil la lectura de este reloj si prestan atención a las leyendas se puede leer que marca la 1:27 el circulo (12 puntos) muestra las horas la barra de 5 puntos muestra las decenas de minuto y finalmente la barra grande (9 puntos) muestra los minutos.
Si contamos los LEDs son 26, utilizando multiplexación tradicional necesitaríamos 11 pines en el mejor de los casos para lograr encenderlos todos y el diagrama sería como muestra la figura.
pero su utilizamos la técnica propuesta se reduce considerablemente el numero de pines.
Según la ecuación antes mostradas los pines necesarios serian:
Pines=1+√1+4∗262=5.62
Lo aproximamos a 6, y la disposición de los LEDs sería la mostrada en el siguiente diagrama.
también tiene adjunta la tabla de control de salidas y pines. Bien ya tenemos la el diagrama general de la disposición de los LEDs solo nos faltaria dos botones para ajustar la hora y minutos, en general una buena disposicion de los componentes seria la siguiente.
El esquemático del circuito propuesto es el siguiente. incluyendo todo lo necesario como conectores y botones.
disposición general de los componentes.
Algunas imágenes de la construcción y ensamblaje.
la simulación corre demasiado lento así que la omito esta vez.
y quedo así el circuito después de ensamblado.
un pequeño vídeo del funcionamiento.
Lista de partes...
Bill Of Materials For Charlieplexing 002.DSN | |||||||||||||||||||||||||||||||||||||||||||||||
|
9 Resistors | |||||||||||||||||||||||||||||
Quantity: | References | Value | Order Code | ||||||||||||||||||||||||||
7 | R1-R7 | 150R | M150R | ||||||||||||||||||||||||||
2 | R8, R9 | 200R | M200R | ||||||||||||||||||||||||||
2 Capacitors | |||||||||||||||||||||||||||||
Quantity: | References | Value | Order Code | ||||||||||||||||||||||||||
2 | C1, C2 | 22pF | |||||||||||||||||||||||||||
1 Integrated Circuits | |||||||||||||||||||||||||||||
Quantity: | References | Value | Order Code | ||||||||||||||||||||||||||
1 | U2 | PIC16F84A | |||||||||||||||||||||||||||
26 Diodes | |||||||||||||||||||||||||||||
Quantity: | References | Value | Order Code | ||||||||||||||||||||||||||
26 | D1-D26 | LED-BLUE | |||||||||||||||||||||||||||
5 Miscellaneous | |||||||||||||||||||||||||||||
Quantity: | References | Value | Order Code | ||||||||||||||||||||||||||
1 | J1 | TBLOCK-I2 | |||||||||||||||||||||||||||
3 | PU1-PU3 | ||||||||||||||||||||||||||||
1 | X1 | CRYSTAL |
Para finalizar el software propuesto para el pic16f84a en asembler.
;********************************************************************************************
;
; RELOJ DE MULTIPLEXACION TIPO CHARLIPLEXING
; Angel I Gonzalez M
;
;********************************************************************************************
__CONFIG _CP_OFF& _WDT_OFF& _PWRTE_ON& _XT_OSC ; Configuracion del PIC
; _CP_OFF protteccion de codigo off
; _WDT_OFF watchdog off
; _PWRTE_ON delay de inicio on
; _XT_OSC tipo de oscilador Cristal
LIST P=16F84A ; tipo de pic a utilizar
INCLUDE ; libreria de cabeceras incluida
;********************************************************************************************
#DEFINE banco1 BSF STATUS,RP0 ;Ir a banco de config
#DEFINE banco0 BCF STATUS,RP0 ;Ir a banco de programa
;********************************************************************************************
temp EQU 0x0C ; TEMP igual a la dirección 0Ch de memoria ram
led_no EQU 0x0D
hora EQU 0x0E
dec_min EQU 0x0F
min EQU 0x10
temp2 EQU 0x11
sen_h EQU 0x12
sen_m EQU 0x13
control EQU 0x14
mult EQU 0x15
mili EQU 0x16
acum EQU 0x17
stat EQU 0x18
seg EQU 0x19
;********************************************************************************************
ORG 00
GOTO inicio
NOP
NOP
ORG 04
inter MOVWF acum ; GUARDA EL VALOR DE W PARA RESTAURAR DESPUES
MOVF STATUS,W ; GUARDA EL VALOR DE STATUS PA RESTAURAR DESPUES
MOVWF stat ;
banco0 ; por si vengo del banco 1
; el registro esta guardado en stat
trm0_set MOVLW D'61' ; CARGA TMR0 CON UN VALOR PREVIO
MOVWF TMR0
BCF INTCON,T0IF ; ACTIVA INTERRUPCION DE TMR0
MILISEG INCF mili,F ; INCREMENTA EL CONTADOR DE UN MILISEGUNDO
referen BTFSS PORTA,RA2
GOTO on_test
GOTO off_test
on_test BSF PORTA,RA2
GOTO restaura
off_test BCF PORTA,RA2
incseg MOVLW d'20'
SUBWF mili,W
BTFSS STATUS,Z
GOTO restaura
INCF seg,F
CLRF mili
incmin MOVLW d'60'
SUBWF seg,W
BTFSS STATUS,Z
GOTO restaura
INCF min,F
CLRF seg
incdec MOVLW d'10'
SUBWF min,W
BTFSS STATUS,Z
GOTO restaura
INCF dec_min,F
CLRF min
inchor MOVLW d'6'
SUBWF dec_min,W
BTFSS STATUS,Z
GOTO restaura
INCF hora,F
CLRF dec_min
clrhor MOVLW d'12'
SUBWF hora,W
BTFSS STATUS,Z
GOTO restaura
CLRF hora
restaura MOVF stat,W ; RESTAURA STATUS
MOVWF STATUS ;
SWAPF acum,F ; RESATURA EL ACUMULADOR
SWAPF acum,W ;
RETFIE ; FIN DE LA INTERRUPCION
inicio banco1
MOVLW b'00011011'
MOVWF TRISA
BCF OPTION_REG,T0CS ; ASIGNAMOS TRMO POR CLOCK
BCF OPTION_REG,PSA ; divison asignada a trm0
BSF OPTION_REG,PS2 ;\
BSF OPTION_REG,PS1 ; | division en 256 trm0
BSF OPTION_REG,PS0 ;/
banco0
INTERRUP BSF INTCON,GIE ; INTERRUPCIONES GLOBALES
BSF INTCON,T0IE ; HABILITADAS
CLRF hora
CLRF dec_min
CLRF min
CLRF seg
CLRF mili
MOVLW d'50' ;ciclos de espera de teclado
MOVWF sen_h
MOVLW d'50' ;ciclos de espera de teclado
MOVWF sen_m
MOVLW d'61'
MOVWF TMR0
;******************************************************************************************
test
;******************************************************************************************
teclado
BTFSC PORTA,RA0
CALL test_hora
BTFSC PORTA,RA1
CALL test_min
CALL presenta
GOTO teclado
;********************************************************************************************
test_hora CALL presenta
delayhora DECFSZ sen_h,F
GOTO delayhora
horamas BTFSS PORTA,RA0
GOTO errlimpiarh
INCF hora,F
MOVLW d'12'
SUBWF hora,W
BTFSC STATUS,Z
CLRF hora
MOVLW d'50'
MOVWF sen_h
esphoffh BTFSC PORTA,RA0
GOTO callpres
RETURN
callpres CALL presenta
GOTO esphoffh
errlimpiarh MOVLW d'50'
MOVWF sen_h
RETURN
;***************************************************
test_min CALL presenta
delaymin DECFSZ sen_m,F
GOTO delaymin
minmas BTFSS PORTA,RA1
GOTO errlimpiarm
INCF min,F
MOVLW d'10'
SUBWF min,W
BTFSC STATUS,Z
GOTO decada
subdec MOVLW d'50'
MOVWF sen_m
GOTO esphoffm
decada CLRF min
INCF dec_min,F
MOVLW d'6'
SUBWF dec_min,W
BTFSC STATUS,Z
CLRF dec_min
GOTO subdec
esphoffm BTFSC PORTA,RA1
GOTO callpresm
RETURN
callpresm CALL presenta
GOTO esphoffm
errlimpiarm MOVLW d'50'
MOVWF sen_m
RETURN
;********************************************************************************************
presenta MOVF hora,W ; enciende el led de hora
CALL enciende_led_no ; llama la rutina de encender led no
MOVLW d'12' ; mueve 12 a w para mostrar led despues de 12
ADDWF dec_min,W ; suma dec_min con w y guarda en w para encender led no
CALL enciende_led_no
MOVLW d'20'
ADDWF min,W
CALL enciende_led_no
RETURN
;********************************************************************************************
enciende_led_no MOVWF led_no
CLRF PORTB
CALL tabla_salidas
banco1
CLRF PORTB
MOVWF TRISB
banco0
MOVF led_no,W
CALL tabla_valores
CLRF PORTB
MOVWF PORTB
CALL retardo_larg
RETURN
;Subrutina "tabla_valores 1/0 puerto b" -----------------------------------------------------
tabla_valores ADDWF PCL,F
tabla_1 RETLW b'00000001' ; 12
RETLW b'00000010' ; 1
RETLW b'00000010' ; 2
RETLW b'00000100' ; 3
RETLW b'00000001' ; 4
RETLW b'00000100' ; 5
RETLW b'00000100' ; 6
RETLW b'00001000' ; 7
RETLW b'00000010' ; 8
RETLW b'00001000' ; 9
RETLW b'00000001' ; 10
RETLW b'00001000' ; 11
RETLW b'00000000' ; none 0
RETLW b'00010000' ; dec 10
RETLW b'00000100' ; dec 20
RETLW b'00010000' ; dec 30
RETLW b'00000010' ; dec 40
RETLW b'00010000' ; dec 50
RETLW b'00000000' ; none 0
RETLW b'00000000' ; none 0
RETLW b'00000000' ; none 0
RETLW b'00100000' ; min 1
RETLW b'00001000' ; min 2
RETLW b'00100000' ; min 3
RETLW b'00000100' ; min 4
RETLW b'00100000' ; min 5
RETLW b'00000010' ; min 6
RETLW b'00100000' ; min 7
RETLW b'00000001' ; min 8
RETLW b'00100000' ; min 9
;********************************************************************************************
;Subrutina "tabla_salidas I/O puerto b" -----------------------------------------------------
tabla_salidas ADDWF PCL,1
tabla_2 RETLW b'11111100' ; 12
RETLW b'11111100' ; 1
RETLW b'11111001' ; 2
RETLW b'11111001' ; 3
RETLW b'11111010' ; 4
RETLW b'11110011' ; 6
RETLW b'11111010' ; 5
RETLW b'11110011' ; 7
RETLW b'11110101' ; 8
RETLW b'11110101' ; 9
RETLW b'11110110' ; 10
RETLW b'11110110' ; 11
RETLW b'11111111' ; none 0
RETLW b'11100111' ; dec 10
RETLW b'11101011' ; dec 20
RETLW b'11101011' ; dec 30
RETLW b'11101101' ; dec 40
RETLW b'11101101' ; dec 50
RETLW b'11111111' ; none 0
RETLW b'11111111' ; none 0
RETLW b'11111111' ; none 0
RETLW b'11001111' ; min 1
RETLW b'11010111' ; min 2
RETLW b'11010111' ; min 3
RETLW b'11011011' ; min 4
RETLW b'11011011' ; min 5
RETLW b'11011101' ; min 6
RETLW b'11011101' ; min 7
RETLW b'11011110' ; min 8
RETLW b'11011110' ; min 9
;********************************************************************************************
retardo_larg MOVLW d'5' ; mueve el valor 5 en decimal
MOVWF mult ; mueve el valor en W (5) a la variable mult
bucle MOVLW d'255' ; mueve el valor de 255 en decimal a w
MOVWF temp ; mueve el valor en W (255) a la variable mult
DECFSZ mult,F ; decrementar mult y salta si el resultado es cero
GOTO bucle_in ; saltar a bucle_in
RETURN ; fin de subrutina
bucle_in DECFSZ temp,F
GOTO bucle_in ; saltar a bucle_in
GOTO bucle ; retorno del llamado
;********************************************************************************************
END ; fin de programa del pic
hola, te quiero hacer una pregunta. Quisiera hacer algo similar (pero solo las horas) y además quisiera que empezaran todas prendidas y que cada hora se fuese apagando una y que cuando haga el ciclo de las 12 hs se vuelvan a prender todas. Qué tendría que modificar en el código assembler? Te agradecería si podés ayudarme. Un saludo
ResponderEliminarSaludos Natsumi, gracias por leernos, disculpa la tardanza en la repuesta, bueno 12 leds se pueden manejar perfectamente con la técnica, y que se aprecien encendidos, recepto a que eliminar del assembler solo las rutinas que encienden los leds de minutos y decenas de minutos, pero ahora tendrías que realizar una nueva rutina que encienda todos los leds con la excepción del de la hora marcada, dado que esta técnica esta diseñada para "encender leds" de uno en uno, no apagarlos, pero en ese caso seria mas recomendable usar multiplexacion convencional dado que son solo 12 leds se utilizarían 7 pines solamente, en dos grupos de 6 y 6 utilizando respectivo transistor para la corriente. espero sea de tu ayuda.
EliminarHola Natsumi, buen día lograste hacer tu reloj, si es así podrías apoyarme a realizar uno igual
EliminarMi nombre es German me gusto mucho el proyecto quisiera hacerlo pero tengo problemas en crear el archivo hex necesitaria ayuda si no es molestia muchas gracias ibara2012@gmail.com
ResponderEliminarHola Germán, primero Gracias por leernos, disculpa la tardanza... no te contesto por un correo porque me gustaría que tus dudas queden en esta pagina también, una vez dicho explícame cual es tu problema...
EliminarSaludos AngelX.
Hola que tal me llamo Melchor y me gusta tu buen trabajo y original reloj binario que has hecho esta guapo y bien terminado pero te comento tengo problemas cuando intento pasar el archivo a HEX meda error quisiera saber si tu tienes el asembler.o el HEX correctos si es asi me lo podrias enviar por email por favor si no te importa y no es mucha molestia muchas GRACIAS.
ResponderEliminarSaludos hasta pronto
tirapusin@hotmail.com
Hola Melchor, gracias por leernos, el compilador que use para este proyecto fue mplab de microchip, el código esta como lo corrí, tiene un error de retraso pero se puede corregir, cuéntame que error te da al compilar. te mando los archivos para que los revises...
Eliminarattm
AngelX
Hola Angelx mira yo tmb tuve problema al compilar queria saber como se hace bien es la primera vez q compilo pic, no se si me podrias madar los pasos para poder compilar bien, te dejo mi email gracias
ResponderEliminarhdscherfa@gmail.com
Hola Fernanado, Gracias por leernos, ¿ que problemas te da el Compidador?, puede ser que no estas colocando los parámetros correctamente en el mplab ; _CP_OFF protteccion de codigo off
Eliminar; _WDT_OFF watchdog off
; _PWRTE_ON delay de inicio on
; _XT_OSC tipo de oscilador Cristal
te envio los archivos del proyecto, allí esta el .hex que utilice recuerda que tiene un error en la rutina de tiempo como 3 segundos por hora xD, me cuentas ti experiencia.
attm
AngelX
hoal angel como va ahi arregle el problema con el programador mio, ahora voy armar el proyecto una pregunta las resistencias son de 150 y 200 ohm k ohm o megaohm?
ResponderEliminargracias fernando
Hola Fernando, disculpa la tardanza, Las resistencias son de 200R o 200ohm, así lo pone el proteus, son solo para limitar la corriente de los diodos y en los pulsadores, ¿ya lograste iniciar el proyecto?
EliminarSaludos
AngelX
si logre grabarlo quedo bien ahora hay q probarlo en le circuito, otra consulta el error ese de 3 segundos influye a largo tiempo en el reloj o no, se puede arreglar?
ResponderEliminarHola Fernando, hermoso el proyecto y lo quiero hacer, pero no puedo compilar con MPLab, me da error por todos lados, si puedes mandarme el .HEX por mail como has hecho con otros colegas te agradecería mucho. Abrazo grande y felicitaciones !!!
ResponderEliminarguda@necocheanet.com.ar
Gustavo
Hola Gustavo, Gracias por leernos, Fernando es otro lector, con gusto te envió los archivos, publica tu experiencia.
EliminarSaludos
AngelX
Hola Axel, hice el reloj luego de que me mandaste mail con el archivo .hex pero no me anda, se prenden los leds, lo puedo poner en hora con los botoncitos pero se queda parado en la hora que le he puesto. Probe si oscilaba con un frecuencímetro y si, esta en 4MHz clavadito, asi que de electrónica estoy seguro esta bien, la fuente es regulada y están en 4.99 Volts.
ResponderEliminarVoy a seguir probando.....
Hola Gustavo,
EliminarLo montaste en protoboard? si es así, colócale algunas resistencias a tierra en los pines que no estas usando, y usa el reset para probar que no se esta quedando en alguna rutina.
Saludos.
AngelX
Ok Axel, muchas gracias, lo monte en un circuito impreso que hice, ahora voy a probar con lo que me decis y luego te contesto, gracias nuevamente!!
ResponderEliminarHola Axel, ya hice las conecciones a masa de las patitas que no se usan atravez de resistencias de 150 Ohms y sigue sin andar, por ahí si alguno de los que le anduvo me pasa el archivo .hex o vos otra vez Axel, por ahí en la pasada anterior por mail se le estropio algún carácter, que se yo, el impreso lo he revisado de punta a punta para ver algún cortocicuito de soldadura o algún corte pero nada, si queres fotos decime donde las mando. Gracias otra vez.....
ResponderEliminarhola tengo una pequeña falla en el circuito, queda apagado totalmente y solo parpadean los leds de las dos primeras horas si mantengo presionado mclr. que podria ocurrir?
ResponderEliminarHola, gracias por leernos, si ves el programa del pic. tiene un test de todos los leds al principio si no puedes verlo, hay algo en el quemado del chip...
ResponderEliminarSaludos AngelX
Hola Axel, a mi sigue sin arrancar, con los botones de puesta en hora andan bien, pero una vez puesto en hora no anda, queda todo parado en esa hora..
ResponderEliminarHola Gustavo, estas complilando de nuevo el .hex o estas usando el que te envie?, si puedes mandame las fotos a mi correo, ya lo tienes, y si estas usando el .hex te recomiendo volver a compilarlo.
EliminarSaludos, AngelX
Ahí te mando las fotos por mail, mil gracias !!
ResponderEliminarhola amgelx mi nombre es kilder excelente proyecto y muy llamativo podrías enviarme los archivos del proyecto, incluido el archivo .hex que utilizastes te lo agradecería mucho deseo probarlo mi correo kmc27_@hotmail.com
ResponderEliminarHola Kilder, gracias por leernos, ya estas servido.
EliminarHola Angelx, tengo ganas de volver a probar con el reloj pero en una formatiada de mi pc se me ha perdido el archivo .hex, podrias mandármelo otra vez? lu1dwv@gmail.com y quisiera saber si lo hiciste con un pic 16f84 o un 16f84A, si? porque tengo entendido que no anda el mismo programa en uno que en otro. Gracias
ResponderEliminarBuenas quería saber cómo hacer para dos círculos uno de minutos y otro para las 12 horas y que empieze todo prendido y a medida que pase una un minuto se apague unled y cuando se apague los 60 Leds se apague el de una hora
ResponderEliminar