Beruflich Dokumente
Kultur Dokumente
La informacin que hay en el bus llegara a todos los displays por lo que todos ellos
mostraran el mismo nmero. Para evitar que esto sea as lo que se hace es que en un
instante dado solo se enciende un display y el resto est apagado. A continuacin se rota
apagndose el display actual y encendindose el siguiente. Si el tiempo que pasa desde
que un display se apaga hasta que se vuelve a encender no supera los 32ms el ojo humano
se cree que est encendido aunque en la realidad est apagado las 3/4 partes del tiempo.
Serie 74HCxx
Por tanto, el objetivo de esta librera sera el diseo de una rutina de interrupcin peridica
que rotara el display iluminado cada 8ms segn se aprecia en la siguiente figura.
D3
D0
D1
D2
D0
D3
D1
8 ms
32 ms
R=
2.4.2. Programacin del TMR0 para generar interrupcin peridica cada 8ms
;
;
;
;
;
;
;
*
*
*
*
*
*
*
*************************************** *
Interr. Temporizacin cada 8ms (Fosc=4Mhz)
Tiempo= 4.Tosc.(256-TMR0).Preecalador
Si Tosc=0.25us (Fosc=4Mhz), TMR0=131
Tiempo= 4.(0.25us).(256-131).64= 8ms
*************************************** *
Se utilizar la variable DisplaysDigitos para que almacene los dgitos de los displays.
La variable DisplaysEstado controlar qu display est actualmente iluminado as como el
nmero de ellos que estn habilitados para iluminarse. En la siguiente figura se muestra el
contenido que se les dar a estas variables para que muestren el nmero 527.
DisplaysDigitos[3]
DisplaysDigitos[2]
DisplaysDigitos[1]
DisplaysDigitos[0]
n+5
n+4
n+3
n+2
0
5
2
7
- display 3
- display 2
- display 1
- display 0
No se puede
iluminar
Posiciones
de memoria
DisplaysEstado[1]
DisplaysEstado[0]
n+1
n
0 5 2 7
Display iluminado
Problema 16
rotar4Displays
T0IF = 0
TMR0= 131
Apaga todos
los displays
call rotar4Displays
RB7-RB4= 0000
DisplaysEstado[0]<< 1
retfie
DisplaysEstado[0]=
00000000?
No
Si
DisplaysEstado[0]=0001 0000
El display a iluminar
est habilitado?
(DisplaysEstado[0]
No
&
DisplaysEstado[1])
00000000
?
Todos los displays
Si
apagados al principio
de este diagrama:
RB7-RB4= 0000
RB3-RB0= aaaa
RB7-RB4= bbbb
return
2.4.4. Aplicacin para mostrar el nmero 6750 con 4 displays compartiendo lneas
; * *************************************** *
; * Encabezados
*
; * *************************************** *
LIST
P=16F84A
INCLUDE
<P16F84A.INC>
__CONFIG
_CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
;
;
;
;
;
;
;
*
*
*
*
*
*
*
*************************************** *
Interr. Temporizacin cada 8ms (Fosc=4Mhz)
Tiempo= 4.Tosc.(256-TMR0).Preecalador
Si Tosc=0.25us (Fosc=4Mhz), TMR0=131
Tiempo= 4.(0.25us).(256-131).64= 8ms
*************************************** *
; * *************************************** *
; * Constantes
*
; * *************************************** *
#define TMR0_carga d'131'
Serie 74HCxx
4
; * *************************************** *
; * Variables globales
*
; * *************************************** *
CBLOCK 0x0C
DisplaysEstado:2
DisplaysDigitos:4
W_TEMP, STATUS_TEMP, FSR_TEMP, PCLATH_TEMP
ENDC
; * *************************************** *
; * Macros
*
; * *************************************** *
; PUSH: guarda temporalmente W, STATUS y PCLATH
PUSH MACRO
MOVWF
W_TEMP
;Guarda el valor de W
SWAPF
STATUS,W
MOVWF
STATUS_TEMP
;guardo el registro STATUS
MOVF
PCLATH,W
MOVWF
PCLATH_TEMP
;GUARDA PCLATH
CLRF
PCLATH
;APUNTA A PAGINA 0
MOVF
FSR,W
MOVWF
FSR_TEMP
;Guarda registro FSR
ENDM
; PULL: restaura W, STATUS y PCLATH
PULL MACRO
MOVF
FSR_TEMP,W
;Copia en W el registro FSR
MOVWF
FSR
;Lo restaura
MOVF
PCLATH_TEMP,W
;RECUPERA PCLATH
MOVWF
PCLATH
SWAPF
STATUS_TEMP,W
;restauro el registro STATUS
MOVWF
STATUS
SWAPF
W_TEMP,F
;restauro el registro W
SWAPF
W_TEMP,W
ENDM
; * *************************************** *
; * Vector de interrupcin: RESET
*
; * *************************************** *
ORG
0
; El programa comienza en la direccin 0.
goto inicio
; * *************************************** *
; * Vector de interrupcin: INTERRUPCION
*
; * *************************************** *
ORG
4
PUSH
; Macro que guarda W, STATUS y PCLATH
call INTERRUPCION
PULL
; Macro que restaura W, STATUS y PCLATH
retfie
; * *************************************** *
; * Mdulo inicial
*
; * *************************************** *
inicio
clrw
; w=0
movwf
PORTA
; PORTA= b'00000000' before we enable it.
movwf
PORTB
; PORTB= b'00000000' before we enable it.
;-------------------bsf
STATUS,RP0
; Acceso Banco 1. RP0='1'
;-------------------clrf
TRISB
bcf
bcf
bsf
bcf
bsf
OPTION_REG,PSA
OPTION_REG,T0CS
OPTION_REG,PS2
OPTION_REG,PS1
OPTION_REG,PS0
bcf
movlw
movwf
STATUS,RP0
TMR0_carga
TMR0
;-------------------bcf
STATUS,RP0
;--------------------
; Back to bank 0
; Acceso Banco 0.
RP0='0'
Problema 16
bsf
bsf
INTCON,T0IE
INTCON,GIE
clrf
clrf
DisplaysEstado+0
DisplaysEstado+1
; DisplaysEstado[0]= b'00000000'
; DisplaysEstado[1]= b'00000000'
bsf
DisplaysEstado+0,4
movlw
movwf
b'11110000'
DisplaysEstado+1
; Bandera INTF='0'
; Bandera RBIF='0'
; =======================================================
; INTERRUPCION_T0I
;
- Ocurre cada vez que desborda TMR0 (pasa de 255 a 0)
;
- Tiempo= 4.(0.25us).(256-131).64= 8ms
;
- Baja la bandera que origin esta interrupcin (T0IF)
; =======================================================
INTERRUPCION_T0I
;--------------------call
rotar4Displays
;--------------------movlw
TMR0_carga
movwf
TMR0
; TMR0=131
bcf
INTCON,T0IF
; T0IF=0 (bandera)
return
; ===========================================
; rotar4Displays
;
; ===========================================
rotar4Displays
movlw
b'00001111'
andwf
PORTB,F
; RB4-RB7=0000 -> apaga los 4 displays
bcf
STATUS,C
; Este bit se introduce por la derecha. A '0'
rlf
DisplaysEstado+0,F
; rota el bit de la variable DisplaysEstado[0]
btfss
STATUS,C
goto
rotar4Displays1
bsf
DisplaysEstado+0,4
; displaysEstado[0](bit 4)=1
rotar4Displays1
movf
DisplaysEstado+0,W
andwf
DisplaysEstado+1,W
; DisplaysEstado[0] & DisplaysEstado[1]
Serie 74HCxx
6
btfsc
goto
STATUS,Z
rotar4Displays9
btfsc
DisplaysEstado+0,4
movf
DisplaysDigitos+0,W
btfsc
DisplaysEstado+0,5
movf
DisplaysDigitos+1,W
btfsc
DisplaysEstado+0,6
movf
DisplaysDigitos+2,W
btfsc
DisplaysEstado+0,7
movf
DisplaysDigitos+3,W
iorwf
DisplaysEstado+0,W
movwf
PORTB
rotar4Displays9
return
END
; (W)=(W) OR DisplaysEstado[0]
; PORTB= (W)