Reloj Digital con Displays de 7 Segmentos y PIC 16F84A

En esta oportunidad quiero compartir con ustedes un sencillo reloj basado en un Microcontrolador PIC de la serie 16F84A y usando display ánodo común de 7 segmentos. 

Adicionalmente usa otros circuitos con la finalidad de expander el número de salidas, tanto para control como para datos, y de esa forma podemos contar con más displays y más opciones de Configuración. Entre estos circuitos tenemos el conocido 74LS47, de cuál dejaré el esquema mostrando la disposición de sus pines (Figura 1), así como su tabla de verdad (Figura 2). Para mayor información pueden consultar el datasheet de este componente.

Disposición de pines

Tabla de Verdad

Otro circuit usado es el 74LS138, el cuál funcionará como selector de display para realizar el efecto de barrido. No detallaré tampoco a este componente puesto que no es el objetivo de este post, pero si dejaré algunas imágenes, que al igual que las anteriores, nos da una vista rápida de la disposición y el funcionamiento de este integrado.

Disposición de pines

Tabla de Verdad

También dejaré el diagrama de pines de un display de 7 segmentos.

Ahora, una vez conocido el funcionamiento de los componentes individuales, a continuación muestro el diagrama total del reloj, en donde veremos como estos integrados interactuan entre sí para poder obtener nuestro sencillo reloj digital.
Las resistencias que van a los displays son de 330Ω (Naranja, Naranja, Marrón) y las que van a los transistores son de 1KΩ (Marrón, Negro, Rojo). Y claro, las resistencias que van a los pulsadores son de 10KΩ (Marrón, Negro, Naranja).

Antes que nada tenemos que conectar los componentes básicos para el funcionamiento del microcontrolador pic, que son las conexiones a tierra y 5 voltios, el reloj de 4MHz y los capacitores.

Luego podemos armar el siguiente diagrama esquemático para tener en funcionamiento a nuestro sencillo Reloj Digital.
Archivos adjuntos del proyecto:

El código está escritor en ensamblador. Pueden usar el mplab para recompilarlo y usarlo de acuerdo a sus necesidades.
__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST    P=16F84A
INCLUDE  <P16F84A.INC>

M_UNI equ  H'1D' ; Registro para las unidades de los minutos.
M_DEC equ  H'1C' ; Registro para las decenas de los minutos.

H_UNI equ  H'1F' ; Registro para las unidades de las horas.
H_DEC equ  H'1E' ; Registro para las decenas de las horas.

S_UNI equ  H'20' ; Registro para las unidades de los segundos.
S_DEC equ  H'21' ; Registro para las decenas de los segundos.

BARR equ  H'1B' ; Registro para almacenar el número de barridos.
PAUSE equ  H'1A' ; Registro para almacenar el tiempo de barrido.

;Algunas definiciones de registros y pines
;-----------------------------------------
#DEFINE  REINICIO PORTA,0   ; Pulsador conectado a RA0.
#DEFINE  MINUTO  PORTA,1   ; Pulsador conectado a RA1.
#DEFINE  HORA  PORTA,2   ; Pulsador conectado a RA2.
#DEFINE  DISPLAY  PORTB   ; El display está conectado al Puerto B.

ORG 0

Inicio
bsf  STATUS,RP0  ; Acceso al Banco 1.
clrf DISPLAY   ; Línea del LED configurada como salida.
movlw b'00011111'  ; Las 5 líneas del Puerto A se configuran como entrada.
movwf PORTA
bcf  STATUS,RP0  ; Acceso al Banco 0.
;Inicialización de Registros
;---------------------------
clrf S_UNI   
clrf S_DEC
clrf M_UNI
clrf M_DEC
clrf H_UNI
clrf H_DEC
clrf BARR
;---------------------------

Principal
clrf BARR    ; Limpiamos el registro de barridos
;Para el botón de reinicio no importa los rebotes
;------------------------------------------------
VerificarPulsadorReset
btfss REINICIO   ; ¿Pulsador reposo?, ¿Pulsador=1?
call InicializarRegistros
;------------------------------------------------------------------------------

;Para el botón de incremento de minutos si importan los rebotes
;--------------------------------------------------------------
VerificarPulsadorMinutos
btfsc MINUTO     ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto VerificarPulsadorHoras ; No vuelve a leerlo
call Temporizador   ; Espera a que se estabilicen los niveles de tensión.
btfsc MINUTO     ; Comprueba si es un rebote.
goto VerificarPulsadorHoras ; Era un rebote y sale.
goto    SoloMinutosEnUno  ; Salta a la subrutina para incrementar los minutos en 1
;------------------------------------------------------------------------------

;Para el botón de incremento de horas también importan los rebotes
;-----------------------------------------------------------------
VerificarPulsadorHoras
;------------------------------------------------------------------------------
btfsc HORA      ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto SoloSegundosEnUno   ; No vuelve a leerlo
call Temporizador    ; Espera a que se estabilicen los niveles de tensión.
btfsc HORA      ; Comprueba si es un rebote.
goto SoloSegundosEnUno   ; Era un rebote y sale fuera.
call    SoloHorasEnUno
;------------------------------------------------------------------------------

SoloSegundosEnUno
call IncrementarSegundosEnUno

Mostrar
call ValidarTiempo
call Barrido
;------------------------------------------------------------------------------

Fin 
goto Principal
;------------------------------------------------------------------------------

SoloMinutosEnUno
call IncrementarMinutosEnUno
goto Mostrar

SoloHorasEnUno
call IncrementarHorasEnUno
goto Mostrar

;*************************************
; Subrutina de Incremento de Registros
;*************************************

;------------------------------------------------------------------------------
IncrementarSegundosEnUno
incf S_UNI,f      ; Incrementa el valor de S_UNI
movfw S_UNI      ; Carga W con el valor del regustro S_UNI
sublw D'10'      ; Resta 10 para verificar si S_UNI=10?
btfsc STATUS, Z     ; Verifica si el resultado fué cero
call IncrementarSegundosEnDiez ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarSegundosEnDiez
clrf S_UNI      ; El acarreo implica limpiar el registro anterior
incf S_DEC,f      ; Incrementa el valor de S_DEC
movfw S_DEC      ; Carga W con el valor del regustro S_DEC
sublw D'6'      ; Resta 6 para verificar si S_UNI=6?
btfsc STATUS, Z     ; Verifica si el resultado fué cero
call IncrementarMinutosEnUno  ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarMinutosEnUno
clrf S_DEC      ; El acarreo implica limpiar el registro anterior
incf M_UNI,f      ; Incrementa el valor de M_UNI
movfw M_UNI      ; Carga W con el valor del regustro M_UNI
sublw D'10'      ; Resta 10 para verificar si S_UNI=10?
btfsc STATUS, Z     ; Verifica si el resultado fué cero
call IncrementarMinutosEnDiez ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarMinutosEnDiez
clrf M_UNI      ; El acarreo implica limpiar el registro anterior
incf M_DEC,f      ; Incrementa el valor de M_DEC
movfw M_DEC      ; Carga W con el valor del regustro M_DEC
sublw D'6'      ; Resta 6 para verificar si S_UNI=6?
btfsc STATUS, Z     ; Verifica si el resultado fué cero
call IncrementarHorasEnUno  ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarHorasEnUno
clrf M_DEC      ; El acarreo implica limpiar el registro anterior
incf H_UNI,f      ; Incrementa el valor de H_UNI
movfw H_UNI      ; Carga W con el valor del regustro H_UNI
sublw D'10'      ; Resta 6 para verificar si S_UNI=10?
btfsc STATUS, Z     ; Verifica si el resultado fué cero
call  IncrementarHorasEnDiez  ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

IncrementarHorasEnDiez
clrf H_UNI      ; El acarreo implica limpiar el registro anterior
incf H_DEC,f      ; Incrementa el valor de H_DEC
movfw H_DEC      ; Carga W con el valor del regustro H_DEC
sublw D'10'      ; Resta 6 para verificar si S_UNI=10?
btfsc STATUS, Z     ; Verifica si el resultado fué cero
clrf H_DEC      ; Si es cero, entonces acarreamos uno
return
;------------------------------------------------------------------------------

;*********************************
; Subrutina de Barrido de Displays
;*********************************

;------------------------------------------------------------------------------

Barrido
btfss REINICIO   ; ¿Pulsador reposo?, ¿Pulsador=1?
call InicializarRegistros
incf BARR, f    ; Incrementa en 1 el registro de barridos
;Unidades de segundos
;--------------------
movlw b'00001111'  ; Activamos el primer display
movwf DISPLAY   ; Movemos el dato al puerto B
movf S_UNI,0   ; Mueve M_UNI al registro W
iorlw b'00000000'  ; Aplicamos la máscara
movwf   DISPLAY   ; Mostramos en el puerto B
call  Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00001111'  ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY   ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Decenas de segundos
movlw b'00011111'  ; Activamos el segundo display
movwf DISPLAY   ; Movemos el dato al puerto B
movf S_DEC,0   ; Mueve S_DEC al registro W
iorlw b'00010000'  ; Aplicamos la máscara
movwf   DISPLAY   ; Mostramos en el puerto B
call  Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00011111'  ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY   ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Unidades de minutos
movlw b'00101111'  ; Activamos el tercer display
movwf DISPLAY   ; Movemos el dato al puerto B
movf M_UNI,0   ; Mueve M_UNI al registro W
iorlw b'00100000'  ; Aplicamos la máscara
movwf   DISPLAY   ; Mostramos en el puerto B
call  Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00101111'  ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY   ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Decenas de minutos
movlw b'00111111'  ; Activamos el cuarto display
movwf DISPLAY   ; Movemos el dato al puerto B
movf M_DEC,0   ; Mueve M_UNI al registro W
iorlw b'00110000'  ; Aplicamos la máscara
movwf   DISPLAY   ; Mostramos en el puerto B
call  Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'00111111'  ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY   ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Unidades de horas
movlw b'01001111'  ; Activamos el quinto display
movwf DISPLAY   ; Movemos el dato al puerto B
movf H_UNI,0   ; Mueve M_UNI al registro W
iorlw b'01000000'  ; Aplicamos la máscara
movwf   DISPLAY   ; Mostramos en el puerto B
call  Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'01001111'  ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY   ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Decenas de horas
movlw b'01011111'  ; Activamos el sexto display
movwf DISPLAY   ; Movemos el dato al puerto B
movf H_DEC,0   ; Mueve M_UNI al registro W
iorlw b'01010000'  ; Aplicamos la máscara
movwf   DISPLAY   ; Mostramos en el puerto B
call  Temporizador ; Pausa para establecer niveles de tensión correctamente
movlw B'01011111'  ; Cargamos el valor adecuado a W para limpiar los registros
movwf DISPLAY   ; Limpiamos el display para evitar que los dígitos se repitan
;------------------------------------------------------------------------------
;Verificar barrido
movfw BARR   ; carga W con el número de barridos
sublw D'50'   ; Resta 50 para comparar si es igual a 50
btfsc STATUS, Z  ; Verifica si el resultado fué 0, o sea si BARR=50?
return     ; Se completó el número de barridos
goto    Barrido
;------------------------------------------------------------------------------

ValidarTiempo
movfw H_UNI   ; Carga el registro W con el valor del registro H_UNI
sublw D'4'   ; Resta 4 para verificar si es que el valor de W=4?
btfsc STATUS, Z  ; Verifica si el resultado fué cero
goto ValidarHora  ; Ahora llamamos al subrutina para verificar el siguiente dígito de la hora
return
;------------------------------------------------------------------------------

ValidarHora
movfw H_DEC     ; Carga el registro W con el valor del registro H_DEC
sublw D'2'     ; Resta 2 para verificar si es que el valor de W=2?
btfsc STATUS, Z    ; Verifica si el resultado fué cero
goto InicializarRegistros ; Al llamar a esta subrutina quiere decir que la hora=24, lo cuál implica un reinicio
return
;------------------------------------------------------------------------------

InicializarRegistros
clrf S_UNI
clrf S_DEC
clrf M_UNI
clrf M_DEC
clrf H_UNI
clrf H_DEC
return
;------------------------------------------------------------------------------

Temporizador
movlw D'255'  ; w = 50 decimal
movwf PAUSE  ; K = w

Kloop
decfsz PAUSE,f  ; K = K - 1 , salta a la siguiente instrucción si es cero.
goto  Kloop
return
;------------------------------------------------------------------------------

END    ; Fin del programa.

74 comentarios:

  1. devuelveme mis integrados qt preste _gr! _XD

    ResponderEliminar
  2. :O... El reloj!!!!!... Se ve muy bien el esquema y todo. Lo descargaré y probaré --- Gracias por postearloooo. :P

    ResponderEliminar
  3. Muy bonito tu diseño amigo(Y),Sugerencia XDD, puedes usar los NetLabels par conectar todo tu circuito y evitar todas esas conexiones. En el ISIS se encuentran dentro del submenu: Terminals -> Default.

    Saludos Buen Proyecto (Y)

    ResponderEliminar
  4. Claro amigo Ramòn, mejoraré el esquema y quizás hasta postee el PCB. Gracias por tu apoyo y tus consejos. Cuidate amigo!

    ResponderEliminar
  5. Hola amigo, excelente circuito muchas felicidades!!!

    Oye solo tengo unas dudas: ¿Tus push buttons son de 2 ó 4?
    ¿Estos mismos son conectos al PIC o a donde?

    Las conexiones del 74LS47 a donde van? por que en el diagrama solo dice ABCDEFG.

    Muchas Gracias ojala puedas responder estas sencillas dudas

    ResponderEliminar
  6. Los pulsadores pueden ser de dos o de cuatro, y si te das cuenta las salidas del 74LS47 etiquetadas como ABCDEFG van a los displays que también tiene etiquetas ABCDEFG.

    ResponderEliminar
  7. una pregunta lo tienes en vmlab

    ResponderEliminar
  8. VMLab creo que es para microcontroladores de la familia de Atmel cierto?
    De ser así no creo poder ayudarte amigo. Trata de revisar como manejo los registros para que lo puedas adecuar a la arquitectura de tu microcontrolador.

    ResponderEliminar
  9. a cuantos voltios traba el reloj o q le pongo para q prenda por es urgente ??????

    ResponderEliminar
  10. Utiliza voltajes TTL amigo, es decir 5 voltios.

    ResponderEliminar
  11. que mas hombre, estaba mirando el plano, pero voe que las imagenes y el video muestran un componente que no está en el circuito, me puedes confirmar cual es y como va conectado??

    ResponderEliminar
  12. Claro amigo, son los condensadores y el cristal de 4 MHz, pero he añadido una imágen en el post donde podrás apreciar la forma de conectar esos componentes. Primero haces las conexiones elementales como son el cristal, los capacitores de 22p y las conexiones a tierra y 5 voltios.

    ResponderEliminar
  13. Hola que tal.
    Oye disculpa podrías ser un poco màs amplio en tu explicación de los transistores. A donde van cada una de las tres patas.
    Muchas Gracias

    ResponderEliminar
  14. Oye aprovechando la duda anterior. Podrias explicarme como van las conexiones a los display? Es decir desde la salida del PIC al display van cables para cada display(Seis Cables A,B,C...) o hay una manera más sencilla de conectarlo.
    Muchas Gracias

    ResponderEliminar
  15. Hola Rolando, estoy interesado en hacerme este reloj, he intentado convertir el archivo a hex pero el mplab me da unos errores de configuracion y de memoria del pic.
    Estos son los erroes:
    Error[126] C:\RELOJ CON SEGUNDOS.ASM 1 : Argument out of range (not a valid config register address)
    Warning[215] C:\RELOJ CON SEGUNDOS.ASM 2 : Processor superseded by command line. Verify processor symbol.
    Message[301] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 35 : MESSAGE: (Processor-header file mismatch. Verify selected processor.)
    Error[126] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 114 : Argument out of range (must be greater than or equal to 255)
    Error[126] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 115 : Argument out of range (__MAXRAM must be used first)
    Error[126] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 115 : Argument out of range (__MAXRAM must be used first)
    Error[126] C:\ARCHIVOS DE PROGRAMA\MICROCHIP\MPASM SUITE\P16F84A.INC 115 : Argument out of range (__MAXRAM must be used first)

    Espero que puedas ayudarme. Gracias

    ResponderEliminar
  16. Claro @charlyfoxtros. Lo que pasa es que no has configurado el dispositivo en tu MPLAB IDE. Para hacerlo tienes que seguir los siguientes pasos:

    1. Clic en menú [Configure]
    2. Seleccionar [Select Device]
    3. En la lista desplegable de dispositivos(Device) selecciona el pic 16F84A.
    4. Clic en OK.
    5. Clic en menú [Project]
    6. Clic en Quickbuild

    Espero te sea de utilidad y resulva tus dudas y problemas. Saludos desde Trujillo-Perú

    ResponderEliminar
  17. Muchas gracias, tenias razon, ese era el fallo que tenia.

    Ahora me pondré manos a la obra y realizare el PCB en proteus y lo pasaré a placa de circuito impreso.

    Cuando lo tenga terminado y funcionando, pondré unas fotos para que podais verlo.

    ResponderEliminar
  18. Hola Rolando, he realizado un proyecto de un reloj con pic 16f84 y cuatro displays de catodo comun, no lleva transistores para los catodos de los displys, la salida del puerto b del pic van conectados a los segmentos de los displays a traves de unas resistencias de 220 ohmios. Los displays son pequeños, pero me gustaria colocar unos displays mas grandes, cuyos anodos se iluminan a partir de 5 voltios. Quiero que sean de catodo comun, pues ya tengo la placa de circuito impreso hecha y los displays colocados, pero el problema es que no se que componentes colocar para poder utilizarlos.
    He intentado poner transistores NPN para los segmentos y PNP para los katodos pero es imposible que se puedan encender.
    Con un ULN2803 tampoco porque me invierte los estados de positivo y negativo, osea que se encenderian los segmentos que deberian estar apagados.

    Creo que puedo probar con unos optoacopladores a la salida del pic para activar los segmentos de dichos displays y claro unos transistores PNP para gobernar los catodos.

    Espero que me des alguna idea.

    UN saludo.

    ResponderEliminar
  19. Rolando, proyecto en verdad muy bueno. Por la simplicidad pues veo que aprovechas al maximo el pic16f84. Tengo un poco de experiencia y he construido varios relojes en asm y en C. Mi pregunta es la sgte.: tengo la misma inquietud que el amigo charlyfoxtros, tambien tengo la placa terminada para trabajar con anodo comun (creo que con catodo comun son los que mas se usan), y quiero sacar los datos en un display de led que ya termine con de 4 leds por segmentos, o sea 28 leds por segmento y 168 leds en total, pude solucionar utilizando 2 transistores par invertir la salida, bueno un bolonqui que salio pero no quede muy satisfecho. Quisiera saber como lo harias tu las conexiones a los leds, voltaje y transistores a utilizar para pulicar la hora en los displays de leds.
    Un abrazo
    Hugo

    ResponderEliminar
  20. Hola, en estos momentos estoy en mis clases de CISCO ^^, tan pronto llegue a casa les responderé a los dos. Saludos.

    ResponderEliminar
  21. hola saludos para todos muy bueno ese proyecto, quiero hacer una pregunta quiza rolando me dice que hacer, quiero hacer un proyecto paresido a ese mismo pero que lo numero se queden fijo o sea que pueda cambiar cada numero del display y se quede fijo o sea como una pizarra no se si me entienden gracias por adelantado

    ResponderEliminar
  22. Hola amigo, pues si no quieres que se cambien los números... lo único que se me ocurre es que no invoques a la subrutina de incremento.
    Saludos.

    ResponderEliminar
  23. ok gracias pues creo ese es el perfecto para lo que quiero gracias de nuevo

    ResponderEliminar
  24. que tal muy buena aplicacion.. solo tengo una pregunta en la conexion de los display para A,B,C,D,E,F,G son 6 cables para cada una? para A 6 cables uno para cada display?
    De antemano gracias.

    ResponderEliminar
  25. Si amigo, son 6 cables de cada letra (A,B,C,...), uno para cada display.

    ResponderEliminar
  26. Rolando tengo un problema, arme el circuito en proteus pero al ejecutarlo me dice que el circuito no esta corriendo en tiempo real, me podrias ayudar.

    muy bueno tu proyecto

    ResponderEliminar
  27. No hay problema amigo, el proteus dice que no está corriendo en tiempo real, pero eso es debido a la cantidad de instrucciones. Cuando lo armes en circuito real no habrá problemas.

    ResponderEliminar
  28. Hola Rolando, excelente tu proyecto. Necesito construir algo similar para tomar tiempos de competencias deportivas, con seteo de regresiva a progresiva, puesta a cero y start y stop. Me darías una mano para lograrlo? Desde yá, mil gracias.
    Washington Rojas
    lu3ei@yahoo.com.ar
    Pd: Te buscaré por el Facebook.

    ResponderEliminar
  29. los transistores creo q se pueden usar los bc337(npn) o bc327(pnp) no?

    ResponderEliminar
  30. 2N3906 son PNP, aun que estan bien puestos perdonalmente podria ocupar mejor los BDXXX por si posteriormente quieres modificar el circuito.

    Nota1:
    bien podrias diseñar todo lo de los displays aparte junto con los transistores y solamenet dejar las lineas de entradas de datos (A,B,C,D,E,F,G), las polarizaciones de los transistores y el voltaje de alimentacion VCC, todo esto en un solo modulo y lo demas en una plquita extra; asi puedes ocupar de nuevo este modulo para posteriores proyectos..

    Saludos cordiales
    ..::3D5F ::..
    http://rhernandezg.blogspot.es/

    ResponderEliminar
  31. Hola Rolando, excelente tu proyecto queria saber si exite una manera de conectar los display directamente al pic sin necesidad de usar los demas integrados

    ResponderEliminar
  32. Exelentisimo maestro pues aprobechas tus conocimeintos al maximo lo felicito.

    ResponderEliminar
  33. quillo tu ere una maquina

    ResponderEliminar
  34. como se le agregaria para que tambien diga si es am y pm, es decir dos led q indique si es am o pm y poder modificarlo gracias; daguve@gmail.com

    ResponderEliminar
  35. hola men esta bien tu proyecto eso de la programacion y simulacion , lo arme el circuito tal y como esta en la imagen compile el programa en MPLAB 7.21 y grabe el pic ,pero al momento de de probarlo los segundos corren sin parar, es decir no son exactos el conteo de segundos solo corren que podria estar pasando ..solo ese es el problema el resto esta ok...

    ResponderEliminar
  36. h0la men esta de lujo tu proyecto pero al ensamblarlo los segundos corren sin parar que estaria pasando lo compile en MPLAB7 ...pero no hay solucion..ayuda

    ResponderEliminar
  37. mmm tambien funciona para el 16F877A??????

    ResponderEliminar
  38. Si amigo, la lógica es la misma, solo cambian los registros.

    ResponderEliminar
  39. hla men ya solucione el problema porque los segundos avanzan rapido solo modifique esta seccion:
    ************************************************************************************************
    ;Verificar barrido
    movfw BARR ; carga W con el número de barridos
    sublw D'500' ; Resta 500 para comparar si es igual a 500 ** aca estaba 50 puse 500
    btfsc STATUS, Z ; Verifica si el resultado fué 0, o sea si BARR=50?
    return ; Se completó el número de barridos
    goto Barrido
    ************************************************************************************************
    el 500 supongo es medio segundo en lenguaje basic intente y salio en la etapa de registro, muy buen proyecto tienes futuro men..

    ResponderEliminar
  40. Excelente, he estado un poco retirado de mi blog por cuestiones de trabajo pero me he dado cuenta que el trabajo de oficina no es para mí así que he regresado a trabajar en mis proyectos mejor. Espero la información de este blog les sea de utilidad.

    Saludos a todos!

    ResponderEliminar
  41. Hola rolando....excelente proyecto!me he metido en bascom pero quiero aprender mpbl! se puede trabajar piktic-3?segun dije que es un problema.
    Un cordial saludo!

    ResponderEliminar
  42. Hola :) ya arme tu reloj en proteus y ya compile el asm en mplab ;) creo que todo esta bien a ecepcion que es demaciado lento u_U y para que cambie un segundo pasa como medio minuto jeje... alguna solucion sobre esto?

    ResponderEliminar
  43. BARR equ H'1B' ; Registro para almacenar el número de barridos. Modifica el número de barridos para que sea más lento o más rápido. Saludos.

    ResponderEliminar
  44. ok, gracias por la respuesta hermano :) intentare armar el circuito fisicamente porque lei en los comentarios que alguien menciono que el proteus decia que no estaba corriendo en velocidad real, y tu dijiste que al armarlo fisicamente funcionaba a full :P... cuando lo arme aviso si me salio jeje

    ResponderEliminar
  45. Amigo, sería genial que si lo armas, puedas hacerle un video pues yo he perdido el video del proyecto y me gustaría volverlo a subir a mi canal de youtube. http://wwww.youtube.com/user/rolandopalermo

    ResponderEliminar
  46. Claro jeje... si me sale yo lo subo al igual que mis demas proyectos :) aqui esta mi canal, yo ya me suscribi al tuyo ;). x cierto, ya compre el material, ahora si a armar se a dicho =D .. salu2

    mi canal :P : http://www.youtube.com/user/Alhayn21

    ResponderEliminar
  47. ya arme el circuito tal cual pero me topo con 2 problemas :S 1: el7447 recibe pero no sale nada :S
    2: los transistores no funcionan como switch :S
    y como datos extras: el pic manda señales pobres, lo estoy alimentando con 5v. alguna idea ? puedes ayudarme? juju

    ResponderEliminar
  48. Anonimo 48

    Desconecta los displays y verifica las salidas con osciloscopio antes de las resistencias en el 7448. Si pudes, tambien haz la simulacion para que no le metas tantas veces mano al circuito.

    Desconecta el 7447 del pic y mide las salidas del pic

    ¿Checaste que los Display que sean del mismo tipo que los que se usan en este ejemplo?.

    Los que se usan son 'Anodo comun' es decir el "positivo comun de los LEDs". Verifica los tuyos con un multimetro en la opcion para checar diodos. El pin comun normalmente es el de en medio de cualquier hilera de "arriba" o "abajo" dependiendo del tipo del empaque. Pones ahi la punta roja y la punta negra la colocas sobre alguno de los otros pines. Si no enciende un led, intercambia las puntas del multimetro. Si ahi enciende un led y eso significara que tus displays son de Catodo comun.

    Tendras que cambiar el diseño. Voltea el transistor de forma que quede el emisor conectando al comun del display y tendras que poner el colector a tierra. El problema sera el Driver de los displays(7447), tendiras que cambiarlo por el 7448.

    ¿Checaste que las salidas del pic hacia 74LS138?

    Por ultimo, ¿que tan usado esta el PIC?, entre mas se haya usado (no necesariamente) y con los "maltratos" (por ejemplo, conectar directo un led al pin). Los pines del pic dejan de funcionar adecuadamente mandando menor voltaje, incluso deja de funcionar un o varios pines dependiendo del programa que se le grabe. Intenta probar con otro pic.

    Y ahora si, ya lo ultimo. Puedes hacer un programa sencillo que solo mande un numero y que solo swithee un solo display para ver el funcionamiento. con esto veras si es por el programa o por hardware, es lo primero que recomendaria antes de meter un programa mas "pesado".

    ResponderEliminar
  49. Hola me arme el circuito en el isis proteus de igual manera lo compile en el mplab y cargo el .hex en el pic en el isis pero me dice q no esta corriendo en tiempo real, porfavor si alguien me puede ayudar porfavor espero sus respuestas ya que lo presentare como proyecto final.....

    ResponderEliminar
  50. R1, R2 y R3 donde van conectados, al pic? en que pines??

    ayuda porfavor

    ResponderEliminar
  51. En proteus no va a funcionar por ke son muchas instrucciones para el programa, solo se debe armar en protoboards o en placa , yo lo estoy haciendo espero ternario listo de aquí al miérc. 13 de julio

    ResponderEliminar
  52. LOS BOTONES VAN CONECTADOS A RA0 RA1 RA2 NO ENTIENDO BIEN YA QUE EN EL DIAGRAMA ESTAN UNIDAS ESTAS PATAS VAN SEPARADAS VERDAD?

    ResponderEliminar
  53. sabes, arme el cto, pero no funciona, no prende para nada, esta todo bien conectado, llevo 3 dias revisandolo pero no encuentro la falla. lo he armado mas de 4 veces

    ResponderEliminar
  54. Hola rolando me podrías mandar por favor la simulación que hiciste en proteus te lo agradecería mucho

    ResponderEliminar
  55. hola rolando mepodrias ayudar, tengo que hacer un reloj como este tuyo y que cada 24 horas mande un pulso a un contador descendente, yo tengo conocimientos en electronica pero no se nada de pics. espero me puedas apoyar saludos

    ResponderEliminar
  56. ola amigo, oyes te paso mi email, ya que tuve problemas con el codigo, hacer si me ayudas

    mundo_toxico@hotmail.com

    ResponderEliminar
  57. PORFAVOR AMIGO PARA QUE SIRVEN LOS PULSADORES.
    LO SIMULE EN EL PROTEUS Y LA VERDAD ES KE SALE UN CERO Y SE BARRE,PERO NO CUENTA.NECESITO TU AYUDA.GRACIAS

    ResponderEliminar
  58. Hola como estas ? Espero que estés muy bien, lo felicito por diseñar este circuito tan espectacular, pero ya que eres muy buena persona me gustaría que me hicieras el gran favor de responderme una pequeña pregunta acerca de este circuito de reloj ¿con que formato de hora trabaja este reloj ? es decir, con 12 horas o con 24 horas

    ResponderEliminar
  59. AL INTRODUCIRLE LA SEÑAL DE ENTRADA A LOS DISPLAY NO APARECE EL CONTEO DE LA HORA, LO QUE DESCRIBE EL CIRCUITO ES UNA ESPECIE DE SALTO DE UN DISPLAY A OTRO QUE CONSEJO ME PUEDES DAR PARA SOLVENTAR ESTE PROBLEMA HERMANO

    ResponderEliminar
  60. excelente proyecto, alguien me puede indicar como poner una pausa en el conteo.

    ResponderEliminar
  61. gracias lo voy probar ,en el mplab salio bien ohora lo voy a hacer en proteus

    ResponderEliminar
  62. una pregunta para hacer un reloj digital tambien puedo utilizar el integrado 4026B

    ResponderEliminar
  63. Nunca he usado ese circuito amigo pero por lo que he podido observar, si es factible.

    ResponderEliminar
  64. Saludos Rloando. Te felicito por tu Proyecto y gracias por compartirlo.

    Te pido de favor, si es posible que nos pudieras compartir tambien el PCB, los archivos .ASM y .HEX ya compilados, de antemano te agradezco tu fina atencion.

    ResponderEliminar
  65. Gracias amigo por tu comentario. Te comento que no realicé el diseño para PCB del circuito. Si alguien lo hubiese desarrollado sería bueno que lo compartan.
    Saludos.

    ResponderEliminar
  66. Saludos Rolando, gracias por tu respuesta. Seria posible que los archivos .ASM y .HEX ya compilados los poddrias postear o mandar via mail? me urge porfa, te lo agradeceria mucho, josefcore@gmail.com

    ResponderEliminar
  67. Gracias Rolando por tu respuesta. Seria posible que los archivos .ASM y .HEX ya compilados, los pudieras postar o mandarmelos a mi mail? me urge porfa, josefcore@gmail.com de antemano te agradezco tu fina atencion.

    ResponderEliminar
  68. hola amigo donde tienes el archivo adjuntado porque no vi nada

    ResponderEliminar
  69. podrias postear el esquematico de isis, de ante mano gracias

    ResponderEliminar
  70. genial amigo esta muy interesante esto. Lo realizare.mañana comprare los materiales y si todo sale bien grabare el funcionamiento para que pongas el video

    ResponderEliminar
  71. muy bien amigo!! para que sirve los pushbotons?? para modificar los diplays y manipular la hora??

    ResponderEliminar
  72. que bien amigo! los push botons para que sirven? para cambiar los números en el display y manipular la hora??

    ResponderEliminar