Está en la página 1de 9

1

Reloj-Visualizador usando tcnica de


visualizacin dinmica con PIC16F877A

ResumenEste documento describe el proyecto para el diseode


un reloj-visualizador usando un arreglo de 4 siete segmentos. El
proyecto se realiza por medio de la construccin de un prototipo
digital basado en microcontrolador PIC16F877A que visualiza
dinmicamente una cifra a una frecuencia mayor a la de persistencia
del ojo humano. El reloj funciona con un cristal independiente del
oscilador principal manteniendo la precisin, ya que este cristal tiene
una frecuencia especfica diseada para funcionar con sistemas
digitales. Se describen el hardware necesario, los requerimientos
solicitados, restricciones impuestas, presentacin de resultados y
recomendaciones sugeridas.[2]

Palabras Clavessiete
controlador, cristal
I.

segmento,

hardware,

micro

INTRODUCCION

El display de 7 segmentos es un dispositivo usado para


presentar informacin de forma visual. Esta informacin es
especficamente un dgito decimal del 0 (cero) al 9 (nueve),
por lo que se intuye que que el cdigo BCD est involucrado.
El caso que nos atae consta de 7 LED's (Light Emisor
Diode), uno por cada segmento, que se encendern o apagarn
dependiendo de la informacin que se les enve (dije que en
este caso ya que existen tambin display 7 segmentos de
cristal lquido, incandescentes, etc.). El display 7 segmentos
tiene una estructura similar a:

los ctodos (-) de los led's comparten la conexin. Estos


display requieren un uno (Vcc) a la entrada de cada segmento
para encenderse. Todas las conexiones deben ser hechas a
travs de una resistencia para regular la cantidad de corriente
que pasa a travs de los led's.[1]
II. O BJETIVOS
A. General
Disear un reloj-visualizador por medio de interrupciones para
mostrar la hora actual junto con los cdigos de los estudiantes.
B. Especficos
Despus de este proyecto el estudiante estar en capacidad de:
1) Configurar interrupciones del micro controlador.
2) Disear un reloj bsico usando el TMR1.
3) Aplicar la tcnica de visualizacin dinmica.
4) Codificar por separado el programa principal y las
interrupciones.
5) Usar en forma simultanea dos cristales en el microcontrolador.

III. P ROYECTO
A. Descripcin del software

Figura.1

Donde los 7 led's vienen indicados por las letras a, b, c, d, e, f


y g. Con stos pueden formarse todos los dgitos decimales.
Por ejemplo, para formar el nmero tres deben activarse los
led's a, b, c, d y g y desactivar los e y f. Para el uno se usan
los led's b y c (ojo, esta es la combinacin correcta no e y f).
De forma anloga se procede para el resto de los casos.
Estos dispositivos pueden ser de tipo nodo Comn o
Ctodo Comn.
En el caso de los display de nodo comn todos los nodos (+)
de los led's comparten la conexin. Estos display requieren un
cero (una tierra) a la entrada de cada segmento para
encenderlo. En el caso de los display de ctodo comn todos

Main
Primero se configuran los puertos para que el puerto D
quede como salidas, al igual que 4 bits del puerto B,
tambin se configuran los bits de habilitacin de la
interrupcin por timer1. En la siguiente instruccin se
pregunta en que estado se lleg por medio de las
interrupciones, ya que van a haber tres estados: 00 = reloj,
01= ajuste, 10 = cdigo, si el bit 1 del registro posicin es
igual a 1 el software saltar a ejecutar el cdigo, si es 0
seguir en visualizacin del reloj. En la siguiente
instruccin se ejecutar la visualizacin dinmica, donde
por medio de una tabla se mandaran los bits que en el
display 7 segmentos representaran las cifras del reloj, se
llamar a un retardo de para lograr una frecuencia de
actualizacin de 80 Hz, y por medio de la interrupcin del
timer1 se prendera o apagara el led de punto cada 500 ms.
Cuando el programa salta a cdigo, se usa una tabla
donde aparecen los dgitos de los cdigos de los
estudiantes.
Interrupcin por timer1
En esta interrupcin primero se pregunta si el pulsador en
el puerto RB0 fue presionado, por medio del registro
habilitar_rbo, si este es uno, en el caso cuando no se

2
presiona, se ir a la subrutina de reloj, donde se
conmutar el punto y se irn aumentando las variables de
segundos, minutos y horas cada que se d la interrupcin,
siguiendo la lgica de que si los segundos llegaron a 60 se
aumentan en una unidad la variable de minutos y si esta
llega a 60 se aumenta la de horas en una unidad, hasta
llegar a 23 donde se reinicia a ceros. Si habilitar_rbo es
cero, donde se presion el pulsador, se pondr un 1 en la
variable rbo, y se ir a verificar si se solt el pulsador, en
el caso contrario se ir sumando la variable rbo y cuando
se suelte se verificar si es mayor a 10, si duro presionado
mas de 5 segundos, o si es menor que 10, si dur menos
de 5 segundos. Si se da el primer caso se salta a la
subrutina menor que, donde si posicin es 01 se ir a la
subrutina donde se da el ajuste del reloj, en esta subrutina
se incrementar la variable de unidades de minuto para
cambiar la hora del reloj. Al salir de esta subrutina se
limpiar la variable rbo, al momento de presionar de
nuevo el pulsador se volver a verificar, si el tiempo que
dur presionado fue de nuevo menor a 10, volver a
ajustar el reloj, de lo contrario ir a reloj. En el caso en
que este en reloj y se presione ms de cinco segundos, a la
variable posicin se le asignar un 2 hexadecimal, 10 en
binario, con lo cual ser ir en el main a mostrar los
cdigos de los estudiantes. Cada verificacin de RB0 se
har cada que se de una interrupcin en el timer1 ya que
al presionar el pulsador de RB0 es poco probable que las
interrupciones se crucen.

Fig. 2. Diagrama elctrico


C.

Materiales

Pulsadores
Display 7 segmentos de nodo comn
PIC16F877A
Transistor PNP 3906

Cristal de 10 Mhz
Cristal de 37,6Khz
Tarjeta de prototipos
Resistencias
Condensadores

Interrupcin en RB0
En esta interrupcin es donde se asigna un 1 a la variable
habilitar_rb0 con el fin de cuando entre la interrupcin del
timer 1 se le diga al programa que se dio una pulsacin a
RB0.

D.

Clculos

Dado que no se configur el


microcontrolador a 10MHz, se tiene:

oscilador

interno

del

Ciclo de reloj:

0.1s
Ciclo de instruccin:
Para limitar la corriente que circula por el LED se propone
una resistencia de 330:

B. Descripcin del hardware


Y para limitar la corriente del pin de Reset y el botn
pulsador a 0.5mA, utilizar una resistencia de 10k.

Para los transistoresse usaron los siguientes clculos:


Como la corriente para que encienda el display 7 segmentos, por led,
es de aproximadamente 15mA se hizo en la malla de salida:

Programa principal

Para la malla de salida, tomando segn la hoja de datos del transistor,


que el a 15 mA es de aproximadamente 150 se tiene que:

Asumiendo que la corriente de fuga del transistor es de 1 y que el


voltaje base-emisor es de 0.8 V se calcula la resistencia de base a
VCC:

Para la resistencia entre el puerto del microcontrolador y la base del


transistor, R2, se usa:

Tomando en cuenta la condicin que:

Entonces:

E.

Diagrama de flujo
Interrupcin por TMR0

Interrupcin por TMR1

6
F.

simulaciones

IV. CONCLUSIN

Esquema de la simulacin

Se dise un reloj-visualizador por medio de


interrupciones para mostrar la hora actual junto con
los cdigos de los estudiantes.
Se aprendi a configurar interrupciones del micro
controlador, disear un reloj bsico usando el TMR1
al igual que se aplic la tcnica de visualizacin
dinmica.
Se codifico por separado el programa principal y las
interrupciones.
Se us en forma simultnea dos cristales en el
microcontrolador.
Se tuvo bastantes problemas en el montaje ya que los
transistores son muy inestables.

APNDICE
Simulacin en progreso

Seales habilitadoras de los cuatro diplays

CODIGO FUENTE
;***** VARIABLE DEFINITIONS
w_temp EQU 0x7D
; variable used for context
saving
status_temp
EQU 0x7E
; variable used for
context saving
pclath_temp
EQU 0x7F
; variable used for
context saving
punto EQU 0x70
segundo EQU 0x71
Unidad_min
EQU 0x72
Decena_min
EQU 0x73
Unidad_hora
EQU 0x74
Decena_hora
EQU 0x75
digi1
EQU 0x76
digi2
EQU 0x77
digi3
EQU 0x78
digi4
EQU 0x79
contador EQU 0x6F
habilitar_rbo
EQU 0x7A
rbo
EQU 0x7B
posicion EQU 0x7C
PDel0 EQU 0x6E
PDel1 EQU 0x6D
;*************************************************
ORG 0x000
; processorreset vector
nop
goto

ORG

main

; nop required for icd


; go to beginning of program

0x004

movwf w_temp
Se observa en la simulacin que hace correctamente la visualizacin
dinmica

; interrupt vector location


; save off current W register

contents
movf
W register

STATUS,w

; move status register into

7
movwf status_temp
STATUS register
movf PCLATH,w
w register
movwf pclath_temp
PCLATH register

; save off contents of

goto reloj
mayorq

; move pclath register into

btfssposicion, .0
gotoma_est
clrfhabilitar_rbo
movlw 0x10
movwfposicion
goto reloj

; save off contents of

; isr code can go here or be located as a call subroutine


elsewhere
bcf STATUS, RP0
bcf STATUS, RP1
bcf T1CON, .0
movlw 0x00
movwf TMR1L
movlw 0xC0
movwf TMR1H
bsf T1CON, .0

ma_est
btfssposicion, .1
goto ma_est1
clrfhabilitar_rbo
goto reloj
ma_est1
movlw 0x01
movwfposicion
clrfhabilitar_rbo
goto reloj
reloj

btfss INTCON, .1
gototimmer
;____ INTERRUPCION RB0
movlw 0x01
movwfhabilitar_rbo
clrfrbo
goto salir
;____ INTERRUPCION TIMMER 1
timmer
btfsshabilitar_rbo, .0
goto reloj
incfrbo, f
btfss PORTB, .0
goto salto
movlw 0x0A
subwfrbo, w
btfss STATUS, C
gotomenorq
gotomayorq
salto
btfssposicion, .0
goto reloj
goto salir
menorq
btfssposicion, .0
gotome_est
clrfhabilitar_rbo
goto aumenta
me_est
btfssposicion, .1
goto cambio
clrfhabilitar_rbo
clrfposicion
goto reloj
cambio
clrfhabilitar_rbo
movlw 0x02
movwfposicion

movlw 0x01
xorwf punto, f
btfsc punto, .0
goto salir

;conmuto el pto

incfseg, f
movlw 0x3b
subwfseg, w
btfss STATUS, C
gotosalir
clrfseg

; conteo de segundos
; real = 3b

aumenta
incf Unidad_min, f;conteo de unidades de minutos
movlw 0x0A
subwfUnidad_min, w
btfss STATUS, C
goto salir
clrf Unidad_min ; conteo de decenas de minutos
incfDecena_min, f
movlw 0x06
subwfDecena_min, w
btfss STATUS, C
goto salir
clrf Decena_min ;conteo de unidades de hora
incf Unidad_hora, f
movlw 0x0A
subwf Unidad_hora, w
btfsc STATUS, C
gotodecimalh
movlw 0x04; Preguntar si han transcurrido 24 horas
xorwf Unidad_hora, w
btfss STATUS, Z
goto salir
movlw 0x02
xorwf Decena_hora, w
btfss STATUS, Z
goto salir
clrf Unidad_hora
clrf Decena_hora
;_____________
salir

8
bcf PIR1, .0
; borrar bandera de
interrupcion TMR1
bcf INTCON, .1 ; borrar bandera de interrupcion RB0
movf pclath_temp,w
; retrieve copy of PCLATH
register
movwf PCLAT ; restore pre-isr PCLATH register contents
movfstatus_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapfw_temp,f
swapfw_temp,w
; restore pre-isr W register contents
retfie
; returnfrominterrupt
;___________
decimalh
clrf Unidad_hora
incf Decena_hora, f
goto salir
TBL_BCD
addwf PCL,F ; se incrementa PCL y se produce un
salto
retlw B'11000000'
;0
retlw B'11111001'
;1
retlw B'10100100'
;2
retlw B'10110000'
;3
retlw B'10011001'
;4
retlw B'10010010'
;5
retlw B'10000010'
;6
retlw B'11111000'
;7
retlw B'10000000'
;8
retlw B'10010000'
;9

main

TBL_COD
addwf PCL,F ; se incrementa PCL y se produce un
salto
retlw B'11111111'
;espacio
retlw B'11111111'
;espacio
retlw B'11111111'
;espacio
retlw B'10100100'
;2
retlw B'11000000'
;0
retlw B'11000000'
;0
retlw B'10000000'
;8
retlw B'10100100'
;2
retlw B'11000000'
;0
retlw B'11000000'
;0
retlw B'10010010'
;5
retlw B'11111001'
;1
retlw B'11000000'
;0
retlw B'11111001'
;1
retlw B'11111111'
;espacio
retlw B'11111111'
;espacio
retlw B'10100100'
;2
retlw B'11000000'
;0
retlw B'11000000'
;0
retlw B'10000000'
;8
retlw B'10100100'
;2
retlw B'11000000'
;0
retlw B'11000000'
;0
retlw B'10010010'
;5
retlw B'11000000'
;0
retlw B'10011001'
;4
retlw B'10000000'
;8

preg

bsf STATUS, RP0


bcf STATUS, RP1
movlw 0x00
;configurar puertos
movwf TRISD
movlw 0xE1
movwf TRISB
;Habilito las interrupcion
movlw 0x01
movwf PIE1
movlw 0X80
movwf OPTION_REG
bcf STATUS, RP0
bcf STATUS, RP1
movlw 0x00
movwf TMR1L ; Cargar valor inicial de TMR1
movlw 0xC0
; vlrsimulaqcion E0 real =C0
movwf TMR1H
movlw 0xD0
movwf INTCON
movlw 0x0F
movwf T1CON
; Habilitar temporizador
movlw 0xFF
movwf PORTB
clrf punto
clrf segundo
clrf Unidad_min
clrf Decena_min
clrf Unidad_hora
clrf Decena_hora
btfssposicion, .1
gotovisualizacion
gotocodigo
visualizacion
movf Unidad_min, w;habilitar 4 y mostrar U_min
call TBL_BCD
movwf PORTD
bcf PORTB, .4
call retardo
bsf PORTB, .4;habilitar display 3 y mostrar D_min
movfDecena_min, w
call TBL_BCD
movwf PORTD
bcf PORTB, .3
call retardo
bsf PORTB, .3;habilitar display 2 y mostrar U_hora
movfUnidad_hora, w
call TBL_BCD
movwf PORTD
btfss punto,.0
; Prende o apaga el punto
cada 500 ms
bcf PORTD, .7
bcf PORTB, .2
call retardo
bsf PORTB, .2;habilitar display 1 y mostrar D_hora
movfDecena_hora, w
call TBL_BCD
movwf PORTD

9
bcf PORTB, .1
call retardo
bsf PORTB, .1
gotopreg
codigo
clrf digi1
movlw 0x01
movwf digi2
movlw 0x02
movwf digi3
movlw 0x03
movwf digi4
bucle
movlw 0x04
movwf contador
visualizar1
movf digi1, w ;habilitar display 4 y mostrar Dig1
call TBL_COD
movwf PORTD
bcf PORTB, .1
call retardo
bsf PORTB, .1 ;habilitar display 3 y mostrar Dig2
movf digi2, w
call TBL_COD
movwf PORTD
bcf PORTB, .2
call retardo
bsf PORTB, .2 ;habilitar display 2 y mostrar Dig3
movf digi3, w
call TBL_COD
movwf PORTD
bcf PORTB, .3
call retardo
bsf PORTB, .3 ;habilitar display 1 y mostrar Dig4
movf digi4, w
call TBL_COD
movwf PORTD
bcf PORTB, .4
call retardo
bsf PORTB, .4
decfsz contador, f
goto visualizar1
incf digi1,f
; incrementar posicion de la tabla
incf digi2,f
incf digi3,f
incf digi4,f
movlw .26; Preguntar si se mostro todo el codigo
xorwf digi4, w
btfsc STATUS, Z
gotopreg
goto bucle
;------------------------------------------------------------; Retardo de 3ms para generar la visualizaciondinamica de f=
80Hz
; Description: Waits 7500 cycles
;------------------------------------------------------------retardomovlw .6
; 1 set number of repetitions (B)

movwf PDel0 ; 1 |
PLoop1 movlw .50
; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt
; 1 clear watchdog
clrwdt
; 1 cycle delay
decfsz PDel1, f ; 1 + (1) is the time over? (A)
goto
PLoop2 ; 2 no, loop
decfsz PDel0, f ; 1 + (1) is the time over? (B)
goto
PLoop1 ; 2 no, loop
clrwdt
; 1 cycle delay
return
; 2+2 Done
;------------------------------------------------------------END
; directive 'end of program'REFERENCIAS
[1]

http://www.slideshare.net/gustavo276/como-usar-displayanodo-comn

[2]

descripcion_proyecto_2

También podría gustarte