Displays

6
1 2.4. Gestión directa de 3 o 4 displays de 7 segmentos Cada display de 7 segmentos que se conecta a un micro requiere 7 pines de salida de éste -para los 7 segmentos- y uno adicional si necesita activar el punto decimal. El convertidor de código BCD-7segmentos (7447) permite ahorrar 3 pines. En este apartado se particularizará el diseño para el caso de 4 displays (la librería también puede configurarse para el caso de 3 displays). Al conectar 4 displays, el número de pines de salida necesarios del PIC serían 16 (excluyendo los puntos decimales de los displays). Es un número muy elevado que deja al micro sin apenas pines de salida. En la práctica se comparten pines para crear un bus con ellos, tal y como se muestra en la siguiente figura. El número de pines se reducen a ocho: 4 de ellos (RB 3 -RB 0 ) serían para el bus de datos y los otros cuatro (RB 7 -RB 0 ) actuarían sobre los interruptores (transistores nMOS 2N7000) que le dan tensión a cada display. Introducir un nuevo display en el sistema solo consume un pin más del PIC para el nuevo interruptor. El esquema eléctrico de la figura anterior se representará en lo sucesivo por el siguiente símbolo: La información que hay en el bus llegaría a todos los displays por lo que todos ellos mostrarían el mismo número. 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 continuación se rota apagándose el display actual y encendiéndose 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.

description

displays

Transcript of Displays

1

2.4. Gestión directa de 3 o 4 displays de 7 segmentos Cada display de 7 segmentos que se conecta a un micro requiere 7 pines de salida de

éste -para los 7 segmentos- y uno adicional si necesita activar el punto decimal. El convertidor de código BCD-7segmentos (7447) permite ahorrar 3 pines. En este apartado se particularizará el diseño para el caso de 4 displays (la librería también puede configurarse para el caso de 3 displays). Al conectar 4 displays, el número de pines de salida necesarios del PIC serían 16 (excluyendo los puntos decimales de los displays). Es un número muy elevado que deja al micro sin apenas pines de salida. En la práctica se comparten pines para crear un bus con ellos, tal y como se muestra en la siguiente figura. El número de pines se reducen a ocho: 4 de ellos (RB3-RB0) serían para el bus de datos y los otros cuatro (RB7-RB0) actuarían sobre los interruptores (transistores nMOS 2N7000) que le dan tensión a cada display. Introducir un nuevo display en el sistema solo consume un pin más del PIC para el nuevo interruptor.

El esquema eléctrico de la figura anterior se representará en lo sucesivo por el siguiente símbolo:

La información que hay en el bus llegaría a todos los displays por lo que todos ellos mostrarían el mismo número. 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 continuación se rota apagándose el display actual y encendiéndose 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.

2 Serie 74HCxx

Por tanto, el objetivo de esta librería sería el diseño de una rutina de interrupción periódica que rotara el display iluminado cada 8ms según se aprecia en la siguiente figura.

D1 D2D3 D0 D0

8 ms32 ms

D3 D1

t

2.4.1. Valor de la resistencia R

En principio debería haber una resistencia por cada display pero en el enunciado aparece compartida por los 4 displays. Esto se debe a que en un instante dado solo se ilumina uno de ellos. Para el cálculo de la resistencia hay que tener presente los siguientes datos:

• La intensidad promedio que circula por un led, de uno de los 7 segmentos que tiene un display, debe ser de 5 mA para que se vea iluminado. Los displays se han editado en PROTEUS para que este valor sea de 5mA y no el que traen de 10mA.

• En un led caen 1,5V cuando circula corriente a su través (iluminado). • El caso más desfavorable es que se enciendan los 7 segmentos del display para

mostrar el número 8. • El valor de la resistencia disminuye si el número de displays que la comparten

aumenta. En este caso son 4 y eso implica que un display está encendido la cuarta parte del tiempo. Por tanto, para que la intensidad promedio en un led sea de 5 mA la intensidad que debe atravesarlo es de 20 mA.

Ω=−

= 25)(7*20

)(5.15ledssegmentosmA

ledundeVVR

2.4.2. Programación del TMR0 para generar interrupción periódica cada 8ms

; * *************************************** * ; * Interr. Temporización cada 8ms (Fosc=4Mhz) ; * ; * Tiempo= 4.Tosc.(256-TMR0).Preecalador ; * Si Tosc=0.25us (Fosc=4Mhz), TMR0=131 y Preescalador= 1:64 -> ; * Tiempo= 4.(0.25us).(256-131).64= 8ms ; * *************************************** *

2.4.3. Diseño de la subrutina de servicio de la interrupción periódica

Se utilizará la variable DisplaysDigitos para que almacene los dígitos de los displays. La variable DisplaysEstado controlará qué display está actualmente iluminado así como el número de ellos que están habilitados para iluminarse. En la siguiente figura se muestra el contenido que se les dará a estas variables para que muestren el número 527.

0 - display 3

5 - display 2

2 - display 1

7 - display 0DisplaysDigitos[0] n+2n+3n+4n+5

Codifican que displays se pueden iluminar

DisplaysEstado[0]

0

nn+1

5 2 7

Codifican el display actualmente iluminado0100

- - - -

----

0 1 1 1

0 1 1 1

0 0 1 0

0 1 0 1

0 0 0 0

- - - -

----

- - - -

----

Display iluminado

No se puedeiluminar

Posicionesde memoria

DisplaysDigitos[1]DisplaysDigitos[2]DisplaysDigitos[3]

DisplaysEstado[1]

Problema 16 3

La variable DisplaysEstado contiene toda la información necesaria para los habilitadores. En esta aplicación los habilitadores son los 4 pines más significativos del puerto B (RB7-RB4). Para simplificar la programación conviene utilizar los 4 bits más significativos de la variable DisplaysEstado.

A continuación se van a enumerar los diferentes pasos que debe realizar la rutina de interrupción que refresca periódicamente los displays. Esta rutina lee el contenido tanto de la variable DisplaysDigitos como de la variable DisplaysEstado pero sólo modifica el contenido de los 4 bits más significativos de la variable DisplaysEstado[0] para actualizarlos.

El tiempo correspondiente a un display que no esté habilitado se programará de forma que todos los displays estén apagados en ese turno. El motivo es que la resistencia se ha calculado para que un display esté encendido la cuarta parte del tiempo. No se saltaran turnos cuando un display no esté habilitado.

No

Desplaza una posición ala derecha los bits de lavariableDisplaysEstado[1]

return

¿DisplaysEstado[0]=00000000?

Si

DisplaysEstado[0]<< 1

rotar4Displays

DisplaysEstado[0]=0001 0000

¿(DisplaysEstado[0]

&DisplaysEstado[1])

00000000 ?

¿No hay ningún display ailuminar?

¿El display a iluminarestá habilitado?

retfie

call rotar4Displays

INTERRUPCION

T0IF = 0TMR0= 131

RB7-RB4= 0000

Apaga todoslos displays

Si

Todos los displaysapagados al principiode este diagrama:RB7-RB4= 0000

No

RB3-RB0= aaaaRB7-RB4= bbbb

2.4.4. Aplicación para mostrar el número 6750 con 4 displays compartiendo líneas

; * *************************************** * ; * Encabezados * ; * *************************************** * LIST P=16F84A INCLUDE <P16F84A.INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC ; * *************************************** * ; * Interr. Temporización cada 8ms (Fosc=4Mhz) ; * ; * Tiempo= 4.Tosc.(256-TMR0).Preecalador ; * Si Tosc=0.25us (Fosc=4Mhz), TMR0=131 y Preescalador= 1:64 -> ; * Tiempo= 4.(0.25us).(256-131).64= 8ms ; * *************************************** * ; * *************************************** * ; * Constantes * ; * *************************************** * #define TMR0_carga d'131'

4 Serie 74HCxx ; * *************************************** * ; * 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 interrupción: RESET * ; * *************************************** * ORG 0 ; El programa comienza en la dirección 0. goto inicio ; * *************************************** * ; * Vector de interrupción: INTERRUPCION * ; * *************************************** * ORG 4 PUSH ; Macro que guarda W, STATUS y PCLATH call INTERRUPCION PULL ; Macro que restaura W, STATUS y PCLATH retfie ; * *************************************** * ; * Módulo 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 ; RB0-PB7 serán de salida. bcf OPTION_REG,PSA ; PSA= '0'. El Divisor de frecuencia se asigna al TMR0 bcf OPTION_REG,T0CS ; T0CS='0'. Utiliza Fosc/4 para temporizar bsf OPTION_REG,PS2 ; PS2= '1'. bcf OPTION_REG,PS1 ; PS1= '0'. bsf OPTION_REG,PS0 ; PS0= '1'. Preescalador a 1:256 bcf STATUS,RP0 ; Back to bank 0 movlw TMR0_carga movwf TMR0 ;-------------------- bcf STATUS,RP0 ; Acceso Banco 0. RP0='0' ;--------------------

Problema 16 5 bsf INTCON,T0IE ; T0IE='1'. Activa máscara local de la interrupción T0 bsf INTCON,GIE ; GIE= '1'. Activa máscara global de interrupciones clrf DisplaysEstado+0 ; DisplaysEstado[0]= b'00000000' clrf DisplaysEstado+1 ; DisplaysEstado[1]= b'00000000' bsf DisplaysEstado+0,4 ; Primer bit visible movlw b'11110000' movwf DisplaysEstado+1 ; Los 4 displays pueden verse cuando les toque el turno ; Dígitos que se mostrarán en los displys: 6750 clrf DisplaysDigitos+0 ; DisplaysDigitos[0]= 0 movlw d'5' movwf DisplaysDigitos+1 ; DisplaysDigitos[1]= 5 movlw d'7' movwf DisplaysDigitos+2 ; DisplaysDigitos[2]= 7 movlw d'6' movwf DisplaysDigitos+3 ; DisplaysDigitos[3]= 6 ; * *************************************** * ; * Módulo Principal. Bucle infinito * ; * *************************************** * inf nop goto inf ; * *************************************** * ; * Rutina de atención a la interrupción * ; * *************************************** * ; ======================================================= ; INTERRUPCION ; - Si T0IF='1' llama a la rutina INTERRUPCION_T0I ; ======================================================= INTERRUPCION btfss INTCON,T0IF ; ¿T0IF='1'? goto INTERRUPCION1 ; No. Bajar otras banderas ya que T0IF='0' call INTERRUPCION_T0I ; Si. Ejecutar rutina ya que T0IF='1' goto INTERRUPCION9 ; Salir INTERRUPCION1 bcf INTCON,INTF ; Bandera INTF='0' bcf INTCON,RBIF ; Bandera RBIF='0' INTERRUPCION9 return ; ======================================================= ; 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 interrupción (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]

6 Serie 74HCxx btfsc STATUS,Z goto 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 ; (W)=(W) OR DisplaysEstado[0] movwf PORTB ; PORTB= (W) rotar4Displays9 return END