Reloj Charlieplexing Pic 16F84A

Para la puesta en practica de la técnica charlieplexing utilizaremos un inusual reloj propuesto por alexchin, que muestra la hora en 26 LEDs. La disposición de los LEDs sera la que se muestra a continuación.
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 = \frac{1+\sqrt{1+4*26}}{2} = 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
Design Title:charlieplexing 002.DSN
Author:<NONE>
Revision:<NONE>
Design Created:viernes, 18 de marzo de 2011
Design Last Modified:jueves, 24 de mayo de 2012
Total Parts In Design:43
9 Resistors
Quantity:ReferencesValueOrder Code
7R1-R7150RM150R
2R8, R9200RM200R
2 Capacitors
Quantity:ReferencesValueOrder Code
2C1, C222pF
1 Integrated Circuits
Quantity:ReferencesValueOrder Code
1U2PIC16F84A
26 Diodes
Quantity:ReferencesValueOrder Code
26D1-D26LED-BLUE
5 Miscellaneous
Quantity:ReferencesValueOrder Code
1J1TBLOCK-I2
3PU1-PU3
1X1CRYSTAL



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

27 comentarios:

  1. 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

    ResponderEliminar
    Respuestas
    1. Saludos 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.

      Eliminar
    2. Hola Natsumi, buen día lograste hacer tu reloj, si es así podrías apoyarme a realizar uno igual

      Eliminar
  2. Mi 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

    ResponderEliminar
    Respuestas
    1. Hola 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...
      Saludos AngelX.

      Eliminar
  3. 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.
    Saludos hasta pronto
    tirapusin@hotmail.com

    ResponderEliminar
    Respuestas
    1. 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...
      attm
      AngelX

      Eliminar
  4. 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
    hdscherfa@gmail.com

    ResponderEliminar
    Respuestas
    1. 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
      ; _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

      Eliminar
  5. 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?
    gracias fernando

    ResponderEliminar
    Respuestas
    1. 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?
      Saludos
      AngelX

      Eliminar
  6. 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?

    ResponderEliminar
  7. Hola 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 !!!
    guda@necocheanet.com.ar
    Gustavo

    ResponderEliminar
    Respuestas
    1. Hola Gustavo, Gracias por leernos, Fernando es otro lector, con gusto te envió los archivos, publica tu experiencia.
      Saludos
      AngelX

      Eliminar
  8. 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.
    Voy a seguir probando.....

    ResponderEliminar
    Respuestas
    1. Hola Gustavo,
      Lo 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

      Eliminar
  9. 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!!

    ResponderEliminar
  10. Hola 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.....

    ResponderEliminar
  11. hola 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?

    ResponderEliminar
  12. Hola, 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...
    Saludos AngelX

    ResponderEliminar
  13. 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..

    ResponderEliminar
    Respuestas
    1. Hola 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.

      Saludos, AngelX

      Eliminar
  14. Ahí te mando las fotos por mail, mil gracias !!

    ResponderEliminar
  15. hola 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

    ResponderEliminar
  16. Hola 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

    ResponderEliminar
  17. Buenas 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