Autor Tema: Reloj digital con 16f84  (Leído 6417 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Reloj digital con 16f84
« en: 02 de Marzo de 2014, 01:57:59 »
Hola amigos
Navegando por internet encontré un buen proyecto con el pic 16f84, y pues bueno lo arme en la protoboar pero al momento de ver mejor la información del proyecto me di de cuentas que necesita 2 display dobles de cátodo común y pues yo tengo todos de ánodo común, entonces trate de modificar el código (las letras) pero no me funciona.
Aclaro que no se casi nada de assembler  se mas de C++.

Codigo
http://perso.wanadoo.es/pictob/prg/reloj12h/reloj12h.asm

http://www.instructables.com/id/Big-7-segment-Digital-Clock/

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Reloj digital con 16f84
« Respuesta #1 en: 02 de Marzo de 2014, 17:37:19 »
Citar
2 display dobles de cátodo común y pues yo tengo todos de ánodo común, entonces trate de modificar el código (las letras) pero no me funciona.

Prueba a hacer un "comf" antes de enviar a los displays, te deberia funcionar. Tambien si en la tabla cambias los 0 por 1 y viceversa tambien tendria que funcionar.

Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: Reloj digital con 16f84
« Respuesta #2 en: 02 de Marzo de 2014, 19:54:49 »
Hola
Pues lo de cambiar la tabla de 0 al 1 ya lo hice.
CERO      equ      H'7E'   ; 01111110

Y lo cambie a
CERO      equ      B'10000001'   ; 01111110
 
Además tuve que cambiar  una línea de código

DSPOFF      equ      B'11111111'   ; Displays apagados (PORTA)

Por

DSPOFF      equ      B'00000000'   ; Displays apagados (PORTA)

Para que almeno funcionara con un display Ánodo, pero igual sigue teniendo sus fallas de visualización.
En cuanto a utilizar "comf" no sé cómo seria

En la imagen que aparece 1200 funciona con el codigo original y con display catodo.
En la otra imagen fue despues de la modificacion

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Reloj digital con 16f84
« Respuesta #3 en: 03 de Marzo de 2014, 08:09:34 »
Citar
Pues lo de cambiar la tabla de 0 al 1 ya lo hice.

Has cambiado todos? asi:

CERO      equ      H'7E'   ; 01111110 asi 10000001
UNO      equ      H'0C'   ; 00001100     11110011
DOS      equ      H'B6'   ; 10110110     01001001
TRES      equ      H'9E'   ; 10011110     01100001
CUATRO      equ      H'CC'   ; 11001100     00110011
CINCO      equ      H'DA'   ; 11011010     00100101
SEIS      equ      H'FA'   ; 11111010     00000101
SIETE      equ      H'0E'   ; 00001110     11110001
OCHO      equ      H'FE'   ; 11111110     00000001
NUEVE      equ      H'DE'   ; 11011110     00100001
SEGM_OFF   equ      H'00'   ;              11111111Todos los segmentos apagados. Separador entre horas
                     ; y minutos apagado (RB0).

La otra solucion que te decia era esta:

PROX_DIGITO
   movf   INDF,W      ; Obtener el valor de la variable "digito" actual
   call   CODIGO_7S   ; LLamar a la rutina de conversión a código 7 segmentos
   comf   W,0      ; Realiza el complemento, cambia 0 por 1 y viceversa   
                 movwf   INDF      ; Colocar en la variable "digito" el código 7 segmentos devuelto
   incf   FSR,F      ; Incremente INDF para el próximo "digito"
   decfsz   conta1,F   ; Permitir que conta1 de sólo 4 vueltas
   goto   PROX_DIGITO

Creo que aqui es el unico sitio que llama a la tabla. Pero seguramente habra que cambiar alguna cosa mas.

Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: Reloj digital con 16f84
« Respuesta #4 en: 03 de Marzo de 2014, 19:33:18 »
Citar
Pues lo de cambiar la tabla de 0 al 1 ya lo hice.

Has cambiado todos? asi:

CERO      equ      H'7E'   ; 01111110 asi 10000001
UNO      equ      H'0C'   ; 00001100     11110011
DOS      equ      H'B6'   ; 10110110     01001001
TRES      equ      H'9E'   ; 10011110     01100001
CUATRO      equ      H'CC'   ; 11001100     00110011
CINCO      equ      H'DA'   ; 11011010     00100101
SEIS      equ      H'FA'   ; 11111010     00000101
SIETE      equ      H'0E'   ; 00001110     11110001
OCHO      equ      H'FE'   ; 11111110     00000001
NUEVE      equ      H'DE'   ; 11011110     00100001
SEGM_OFF   equ      H'00'   ;              11111111Todos los segmentos apagados. Separador entre horas
                     ; y minutos apagado (RB0).

Eso ya lo hice pero no se entiende queda como loco

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Reloj digital con 16f84
« Respuesta #5 en: 04 de Marzo de 2014, 00:18:15 »
Que tal cmontoya,

El circuito lo tienes montado en real o solamente lo estas simulando?

Si lo estas simulando necesitas agregar un inversor 7404 entre los pines de los anodos comunes y el microcontrolador.
Si el circuito lo tienes montado en real, entonces necesitas cambiar la conexion de los transistores 2N5401. Necesitas conectar el emisor de los 4 transistores a +5V y luego cada colector de cada transistor a su correspondiente pin de los anodos comunes.

y necesitas invertir los valores de CERO, UNO, ... hasta el NUEVE. El SEG_OFF no necesitas cambiarlo. (este cambio es para ambos casos tanto para la simulacion como en real).

Saludos.

Elreypic.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Reloj digital con 16f84
« Respuesta #6 en: 04 de Marzo de 2014, 06:37:34 »
¿Donde esta el circuito? No lo he visto  :lol: :lol:

Si necesitas hacer los cambios que te dice elreypic2 en las conexiones de catodo comun que van a masa, por anodo comun que van al positivo. Incluso puede que necesites cambiar los transistores NPN por PNP???

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Reloj digital con 16f84
« Respuesta #7 en: 04 de Marzo de 2014, 10:49:19 »
Que tal tapi9 y cmontoya,

El circuito es tomado de la nota de aplicacion AN590 de microchip y esta usa transistores PNP para conmutar los digitos, pero estan configurados para catodo comun. Por eso es que se tiene que cambiar su forma de conectarlos para hacerlo funcionar con displays de anodo comun.

Paso 1:
Cambiar el codigo ensamblador de la seccion ya mencionada, debe quedar asi:

CERO      equ      H'81'   ; 10000001
UNO         equ      H'F3'   ; 11110011
DOS         equ      H'49'   ; 01001001
TRES              equ      H'61'   ; 01100001
CUATRO      equ      H'33'   ; 00110011
CINCO      equ      H'25'   ; 00100101
SEIS              equ      H'05'   ; 00000101
SIETE      equ      H'F1'   ; 11110001
OCHO      equ      H'01'   ; 00000001
NUEVE      equ      H'21'   ; 00100001

2. Una vez cambiado el codigo deberas conectar los transistores como te indico en la imagen.

Saludos,

elreypic.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Reloj digital con 16f84
« Respuesta #8 en: 04 de Marzo de 2014, 11:00:18 »
Que tal,

Otra vez yo.

Adjunto imagenes de mi simulacion del reloj con displays de anodo comun. Quiero hacer mencion que el circuito en la simulacion no trabaja en la vida real, ya que los displays usados solo neceistan niveles logicos TTL, de ahi la razon que ven los inversores 74HC04 para poder manejar los displays. Como mencione previamente, en la vida real se tienen que usar los transistores PNP y usar el esquematico colocado en el post anterior.

Saludos,

Elreypic.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Reloj digital con 16f84
« Respuesta #9 en: 04 de Marzo de 2014, 15:05:48 »
Como veo que conoces el circuito aprovecho a preguntarte, solo por curiosidad, ¿Haciendo esto solamente funcionaria o habria que cambiar alguna cosa mas?, como ves esa instruccion en negrita hace la misma funcion que estamos haciendo cambiando la tabla.
De esta manera lo guarda ya con el codigo que trae de la tabla invertido.

PROX_DIGITO
   movf   INDF,W      ; Obtener el valor de la variable "digito" actual
   call   CODIGO_7S   ; LLamar a la rutina de conversión a código 7 segmentos
   comf   W,0      ; Realiza el complemento, cambia 0 por 1 y viceversa   
   movwf   INDF      ; Colocar en la variable "digito" el código 7 segmentos devuelto
   incf   FSR,F      ; Incremente INDF para el próximo "digito"
   decfsz   conta1,F   ; Permitir que conta1 de sólo 4 vueltas
   goto   PROX_DIGITO


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Reloj digital con 16f84
« Respuesta #10 en: 04 de Marzo de 2014, 19:17:32 »
Que tal tapi8,

Si esa es la unica seccion en donde se hace la conversion o uso del codigo de 7 segmentos, deberia funcionar. Pero si no habria que buscar en todo el codigo para ver si hay lagun otro lugar y hacer el cambio correspondiente.

Saludos,

Elreypic.

Desconectado cmontoya

  • PIC10
  • *
  • Mensajes: 29
Re: Reloj digital con 16f84
« Respuesta #11 en: 05 de Marzo de 2014, 00:04:40 »
Hola
Gracias elreypic2 por tu colaboración y pues si lo probé en proteus y en físico y funciono bien el único problema que tiene ahora es que cuando marca  la 1:00  marca es 81:00 y el error está presente tanto en la simulación como en el montaje físico alguna solución??


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Reloj digital con 16f84
« Respuesta #12 en: 05 de Marzo de 2014, 10:09:30 »
Que tal cmontoya,

Yo no tengo ese problema. Podrias subir el codigo que modificaste para darle un vistazo. Es posible que previamente hayas cambiado algo mas.

tapi8,

Cometi el error de no poner atencion en tu comando de comf. Tu idea esta correcta, pero no la forma de usar el comando.

comf  w,0 no se puede usar ya que W no es registro fisico
la coreector es usar el comf en el registro indf, por loq ue el codigo quedaria asi:
PROX_DIGITO
   movf   INDF,W      ; Obtener el valor de la variable "digito" actual
   call   CODIGO_7S   ; LLamar a la rutina de conversión a código 7 segmentos   
   movwf   INDF      ; Colocar en la variable "digito" el código 7 segmentos devuelto
   
   comf    INDF,F    ; Realiza el complemento, cambia 0 por 1 y viceversa 

   incf   FSR,F      ; Incremente INDF para el próximo "digito"
   decfsz   conta1,F   ; Permitir que conta1 de sólo 4 vueltas
   goto   PROX_DIGITO

Ademas de que no es el unico lugar en que hay que hacer cambios. Por lo que la mejor opcion es cambiar los valores de la codificacion de 7 segmentos. Como lo sugiero anteriormente.


Saludos,

Elreypic.

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Reloj digital con 16f84
« Respuesta #13 en: 05 de Marzo de 2014, 10:35:18 »
Citar
tapi8,

Cometi el error de no poner atencion en tu comando de comf. Tu idea esta correcta, pero no la forma de usar el comando.

comf  w,0 no se puede usar ya que W no es registro fisico
la coreector es usar el comf en el registro indf, por loq ue el codigo quedaria asi:
PROX_DIGITO
   movf   INDF,W      ; Obtener el valor de la variable "digito" actual
   call   CODIGO_7S   ; LLamar a la rutina de conversión a código 7 segmentos   
   movwf   INDF      ; Colocar en la variable "digito" el código 7 segmentos devuelto
   
   comf    INDF,F    ; Realiza el complemento, cambia 0 por 1 y viceversa 

   incf   FSR,F      ; Incremente INDF para el próximo "digito"
   decfsz   conta1,F   ; Permitir que conta1 de sólo 4 vueltas
   goto   PROX_DIGITO

Es lo mismo, creo, yo lo hago en W segun viene de la tabla antes de guardar y tu lo haces en INDF una vez que esta ya guardado, no lo he probado en el simulador, pero creo que hacemos lo mismo.

Citar
Ademas de que no es el unico lugar en que hay que hacer cambios. Por lo que la mejor opcion es cambiar los valores de la codificacion de 7 segmentos. Como lo sugiero anteriormente.

Si seguramente haya que hacer algun cambio mas, en la incializacion o algun otro sitio, por eso le puse a cmontoya las dos opciones.


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Reloj digital con 16f84
« Respuesta #14 en: 05 de Marzo de 2014, 10:48:01 »
cmontoya,

Creo que el error es mio, anteriormente mencione que no debias cambiar el SEGM_OFF, pero no es asi. Sí tienes que complementarlo tambien.
Es decir:

SEGM_OFF   equ      H'FF'   ;              11111111Todos los segmentos apagados. Separador entre horas
                     ; y minutos apagado (RB0).

Tapi8,
Lo que yo quiero decirte es que tu idea es valida, pero la instruccion comf W,0 no es valida, al compilar tendras un error ya que comf complementa una variable, comf no puede usarse para el registro W. Por eso es que la tienes que usar con el registro indf.

Saludos,

Elreypic.