displays y matriz
TRANSCRIPT
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -1-
Ejemplo: Gestin de displays de 7 segmentos y matriz de leds
Se trata de realizar el diseo del programa encargado de gestionar dosdisplays de siete segmentos y una matriz de led por barrido.
Se aade a la tarjeta de prcticas PICDEM2, una placa de circuito impresoque dispone de 2 displays de 7 segmentos y una matriz de diodos led deacuerdo con el esquema adjunto.
Desde el momento del arranque del programa (reset), se ejecutan dosacciones independientes:
En los displays de 7 segmentos aparece el nmero de veces que se actusobre el pulsador conectado al pin 2 del puerto C (RC2) de la PICDEM2.Si el pulsador est accionado, el nivel de tensin es nulo y si est libre esde 5V
En la matriz de led van apareciendo los nmeros del 0 al 9 de modosecuencial y cclico, mantenindose cada dgito estable durante unsegundo
En la PICDEM2 se emplea un oscilador RC que proporciona una frecuencia de2,8 MHz y el diseo se basa en el empleo de un microcontroladorPIC16C65B.
A continuacin se adjunta el esquema de la placa adicional
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -2-
RB6
RB5
RB4
RB3
RB2
RB1
RB0
RB7
a b
c d
e f g
a b
c d
e f g
fa
eg
7 6
4 2
1 9
107
6 4
2 1
9 10
b cd
dpdp
55
3 8
3 8
c1 c
2 c3
c4
c513
34
106
Con
trol c
ol.1
(c1)
c2 c3 c4 c5 D.d
ec.
D.u
n.
gnd
Con
ecto
r Ver
tical
en la
Pla
ca
ULN
2003
A
8
F1 F2 F3 F4 F5 F6 F7
dpg/F7
f/F6e/F5
d/F4
c/F3
b/F2
a/F1
Con
ecto
r Hor
izon
tal
en la
Pla
ca
9 14 8 5 1 7 2
39
10
11=4
12=5
DIS
PLAY
S:K
INB
RIG
HT
SC08
-11H
WA
MAT
RIZ
DE
LED
:K
INB
RIG
HT
TC12
1615
1413
1211
10
76
54
32
1
RD
0
RD
1
RD
2
RD
3
RD
4
RD
5
RD
6
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -3-
Planteamiento:
Se efectuar un barrido continuo de los displays de 7 segmentos y de lascolumnas de la matriz de led. Se dispondr de sendas posiciones donde serecogen los dgitos a representar en los displays (unidades y decenas) y enla matriz de led. A dichas posiciones se aceder para conocer qu es lo quehay que representar en cada secuencia de barrido.
Para realizar las temporizaciones correspondientes al barrido, se emplearel temporizador TMR0
La modificacin de los displays de 7 segmentos se realizar a medida que sedetecten las nuevas pulsaciones realizadas sobre RC2. La modificacin deldgito presente en la matriz de led se realizar por incrementos cadasegundo que sern detectados por las interrupciones que genere eltemporizador TMR1 (si es que son posibles)
Temporizacin mxima con TMR1:
Tmax = (4/2,8MHz) * 8 * 65536 = 0,7489 s
A la vista de que no es posible alcanzar 1s, se realizarn temporizacionesparciales de 0,5s y se contabilizarn, cada 2 interrupciones, un total de 1s.
0,5s = (4/2,8MHz) * 8 * (65536-Precarga)
Despejando:
Precarga = 21786 = 0x551A
Diagrama de Bloques a Implementar:
INICIALIZACIN
BARRIDO DE DISPLAYS
BARRIDO DE MATRIZ DE LED
EXPLORACIN DE RC2
INTERRUPCIN TMR1(CADA 0,5S)
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -4-
INICIALIZACIN
PORTB y PORTD como salidas, resto entradas TMR0: como temporizador, asignacin del prescaler con valor 256
para temporizar posteriormente milisegundos en el barrido TMR1: como temporizador, prescaler de 8 y parado al principio Activacin de Interrupciones de TMR1, mscaras: TMR1IE, PEIE,
GIE Carga inicial de las variables de usuario globales:
TIEMPO (dgito a sacar en la matris de leds)DISPLAYS (dgitos a sacar en los displays de 7 segmentos)MEDIOS (contador de medios segundos)
Precarga de TMR1H y TMR1L y puesta en marcha
BARRIDO DE DISPLAYS
Se activa slo el display de unidades (RD0=1 y resto PORTD a 0) Se extraen las unidades a representar Se llama al subprograma CONTROL DE LED con W con el valor de
las unidades Espera de 5 ms cargando en W la precarga necesaria y llamando al
subprograma ESPERA Se activa slo el display de las unidades Se extrae de DISPLAYS las decenas a representar y se cargan en
W, si es cero, se carga 0x0A en W Se llama al subprograma CONTROL DE LED con W con el valor de
decenas Espera de 5 ms cargando en W la precarga necesaria y llamando al
subprograma ESPERA
SUBPROGRAMA CONTROL DE LED: Se encarga de representar en 7segmentos, el dgito BCD que se encuentra en los 4 bits ms bajos delregistro W. Si se quiere sacar un blanco se cargar en W 0x0A
Se suma W con el PCL para obtener de una tabla la representacinde los nmeros 0 a 9 en 7 segmentos
Salimos de la tabla llevando en W el cdigo y lo sacamos al PORTB Retorno de subprograma
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -5-
BARRIDO DE MATRIZ DE LED
Se inicializa el contador de la columna de barrido (COL=0) y elcontador de rotaciones para barrer toda la matriz (ROTAR=5)
Se activa slo la columna de la izquierda Se llama al subprograma TABLA DE LED POR COLUMNAS Se sacan al PORTB los leds a iluminar en esa columna Espera de 1 ms cargando en W la precarga necesaria y llamando al
subprograma ESPERA Incrementamos contador de columnas Activamos siguiente columna haciendo una rotacin a la derecha en
PORTD Decrementamos el contador de rotaciones y si es cero se acab el
barrido de la matriz y retornamos del subprograma Si no es cero volvemos arriba
SUBPROGRAMA TABLA DE LED POR COLUMNAS: Este subprograma tomados variables como entradas: TIEMPO (dgito a representar en la matriz deled) y COL (columna que est activa en ese momento en el barrido) 7ygenera la activacin de los led de esa columna y para ese nmero
Se dispone de una tabla por columnas y nmeros del 0 al 9, demodo que cada nmero ocupa 5 posiciones asociadas a sus columnas
Se toma la variable almacenada en TIEMPO, se la multiplica por 5y se le suma la columna activa para calcular el desplazamiento en latabla y obtener la salida al PORTB
EXPLORACIN DE TECLA RC2
Si RC2==0 (tecla pulsada) entoncesSi en la anterior exploracin estaba libre (LIBRE=1) entonces
Se marca como pulsada (LIBRE=0)Se llama a subprograma SUMA
si noSe marca la tecla como libre para la siguiente exploracin(LIBRE=1)
SUBPROGRAMA DE SUMA: se encarga de incrementar la variableDISPLAYS realizando el ajuste a una representacin en BCD
Incrementamos DISPLAYS en una unidad Se extraen los 4 bits ms bajos de DISPLAYS
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -6-
Si stos han alcanzado el valor 0x0A entoncescorregimos a BCD sumando 0x06 al total
Realizamos la misma verificacin sobre las decenas, si llegaron a0xA, las ponemos a cero
Retornamos de subprograma
SUBPROGRAMA DE ESPERA: en el barrido de displays y de la matriz deled, se emplean dos temporizaciones distintas debido a la diferentepersistencia visual que presentan los led de los segmentos y los de la matrizde led. Para los displays, se retiene la activacin durante 5ms y para lascolumnas de la matriz de led durante 1ms. Para tener un subprogramacomn, se llama a ESPERA con distintos valores de precarga para TMR0, quese transfiere mediante el registro W.
Para 1ms: 1ms = (4/2,8MHz)*256*(256-PR1) -> PR1=253 (0xFD)Para 5ms: 5ms = (4/2,8MHz)*256*(256-PR5) -> PR5=242 (0xF6)
Se pone a 0 el flag de desbordamiento de TMR0 (T0IF) Se precarga TMR0 con el valor actual de W Se espera a que T0IF=1 para retornar
PROGRAMA DE TRATAMIENTO DE LA INTERRUPCIN DE TMR1
Se verifica el motivo TMR1IF=1, si no retorno de interrupcin Se salva el contexto del programa principal (W y STATUS) Precargamos TMR1H y TMR1L Se incrementa el contador de medios segundos (MEDIOS) Si MEDIOS == 20 entonces (han pasado 10s) MEDIOS=0 Obtenemos el contador de segundos dividiendo por 2 el de medios
segundos (desplazando a la derecha MEDIOS en binario) y locargamos en la posicin TIEMPO
Ponemos el flag TMR1IF a cero Recuperamos el contexto (W y STATUS) Retorno de subprograma de tratamiento
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -7-
Cdigo Fuente del Ejercicio
;*************************************************************************; Ejemplo de manejo de dos displays de siete segmentos por barrido; y de una matriz de led que representa los nmeros del 0 al 9;; Inicialmente en el fichero dsp&mtz.asm; Autor: Fernando Nuo Garca;;*************************************************************************;; En los displays aparecer el nmero de veces que se actu sobre el; pulsador conectado a RC2 desde el momento que se hace RESET,; mientras que en la matriz de led aparecen los nmeros del 0 al 9; permaneciendo 1 seg cada uno de ellos;; Se emplea una placa auxiliar que se conecta a la PICDEM2 y que tiene; displays y matriz conectados en paralelo al puerto B y con control; de la habilitacion por medio del CI ULN2003 y el puerto D;
list p=16C65B ;Microcontrolador PIC16C65B include "p16c65b.inc"
DISPLAYS EQU 0x20 ;Posicin de almacenamiento de displaysLIBRE EQU 0X21 ;Indicar si se liber el pulsador una vez tocadoAUX EQU 0x22 ;Posicin auxiliar
TIEMPO EQU 0x23 ;Contabiliza segundos transcurridosCOL EQU 0x24 ;Columna a representarROTAR EQU 0x25 ;Posicin a rotarW_temp EQU 0x26 ;Salvaguarda de W en interrupcinST_temp EQU 0x27 ;Salvaguarda de STATUS en interrupcin
MEDIOS EQU 0x28 ;Variable de acumulacin de medios segundos que;es lo mximo que se puede temporizar con TMR1 y con el oscilador que tenemos
org 0 ;Vector de RESET goto INICIO
org 4 ;Vector de interrupcin para las generadas goto TEMPO ;por TMR1
;*****************************************************************************;Subprograma que, a partir del dato (en posicin TIEMPO) y de la columna que;toca representar, saca los led a iluminar;;Lo situamos al principio porque maneja una tabla grande y as aseguramos;que no hay problemas con el manejo del PCLATH;LEDMTZ movf TIEMPO,W ;Se toma el nmero a representar movwf AUX ;y se le pasa a posicin AUX bcf STATUS,C ;Puesto a cero del carry rlf AUX ;Nos desplazamos en la tabla multiplicando rlf AUX ;por 5 el dato y sumamos el nmero de la addwf AUX,W ;columna a representar addwf COL,W ;a continuacin addwf PCL,f ;Sumamos a PC y volvemos con W conteniendo ;la informacin sobre los displays a iluminar
;Tabla para que la fila superior se controle con RB0 y as sucesivamente;hasta que la fila inferior se controle con RB6
ELCERO retlw b'00111110' retlw b'01000001' retlw b'01000001' retlw b'01000001' retlw b'00111110'ELUNO retlw b'01000100' retlw b'01000010' retlw b'01111111' retlw b'01000000' retlw b'01000000'ELDOS retlw b'01100010'
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -8-
retlw b'01010001' retlw b'01001001' retlw b'01000101' retlw b'01000010'ELTRES retlw b'00100010' retlw b'01000001' retlw b'01001001' retlw b'01001001' retlw b'00110110'ELCUATRO retlw b'00011000' retlw b'00010100' retlw b'00010010' retlw b'01111111' retlw b'00010000'ELCINCO retlw b'00100111' retlw b'01000101' retlw b'01000101' retlw b'01000101' retlw b'00111001'ELSEIS retlw b'00111100 retlw b'01001010 retlw b'01001001 retlw b'01001001 retlw b'00110010ELSIETE retlw b'00000001' retlw b'00000001' retlw b'01111001' retlw b'00000101' retlw b'00000011'ELOCHO retlw b'00110110' retlw b'01001001' retlw b'01001001' retlw b'01001001' retlw b'00110110'ELNUEVE retlw b'00000110' retlw b'01001001' retlw b'01001001' retlw b'00101001' retlw b'00011110';Final de la tabla de nmeros por columnas
;Inicio del programa principal con la Inicializacin
INICIO bsf STATUS,5 ;Pasamos al banco 1 de datos clrf TRISB ;Puerto B se programa como salida clrf TRISD ;Puerto D como salidas
movlw b'11000111' ;TMR0 como temporizador y prescaler de 256 movwf OPTION_REG ;asignado a TMR0 para esperas de 5ms ;el oscilador es RC y de 2.8MHz
movlw 0x01 movwf PIE1 ;Activamos interrupciones de TMR1
bcf STATUS,5 ;Volvemos al banco 0 de datos
clrf PORTB ;Puesta a cero inicial de la salida
clrf TIEMPO ;Puesta a cero del contador de tiempo clrf MEDIOS ;Puesta a cero de contador de medios segundos ;Inicializacion de la representacin en clrf DISPLAYS ;los dos displays
movlw 0x01 ;Inicializacin del estado previo del movwf LIBRE ;pulsador (estar libre inicialmente)
;Interrupciones desactivadas tras el RESET, debemos programar interrupciones;del TMR1
movlw 0x30 ;Inicialmente parado TMR1 movwf T1CON ;Programacin de TMR1, con prescaler a 8 movlw 0xC0 movwf INTCON ;Mscara global de interrupciones y la de ;los perifricos habilitadas movlw 0x55 movwf TMR1H ;Precarga del TMR1 para que "tarde" 0.5 seg movlw 0x1A ;en generar una interrupcin
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -9-
movwf TMR1L ;con oscilador de 2.8MHz bcf PIR1,TMR1IF ;Ponemos a cero el flag de overflow de TMR1
bsf T1CON,0 ;Ponemos en marcha el TMR1
BARR_DSP movlw 0x01 ;Activamos el display de unidades con movwf PORTD ;el bit RD0
movlw 0x0F ;Extraemos las unidades a representar andwf DISPLAYS,W ;se cargan en W y se llama al subprograma call SACALED ;que controla los 7 diodos led
movlw 0xF6 ;Precarga en W para 5 mseg call ESPERA ;Esperaremos durante 5 mseg
movlw 0x02 ;Activamos el display de decenas movwf PORTD ;con RD1
movlw 0xF0 ;Extraemos las decenas a representar andwf DISPLAYS,W ;y se cargan en W, pero si las decenas
btfsc STATUS,2 ;son cero se representa un blanco (codigo A) movlw 0xA0 ;en todos los led movwf AUX ;se lo pasamos a traves de la swapf AUX,W ;variable AUX
call SACALED ;llamada al programa de control de los led
movlw 0xF6 ;Precarga en W para 5 mseg call ESPERA ;Retenemos durante otros 5 mseg
;Barrido de la matriz de diodos emisores de luz (LED)
CALL MATRIZ ;Se llama al subprograma encargado del barrido
;Exploracin de tecla RC2
btfsc PORTC,2 ;si est a cero RC2, est pulsada goto SIGUE ;si est a uno est suelta y seguimos btfss LIBRE,0 ;si LIBRE est a cero es que no se ;liber desde la ltima pulsacin goto BARR_DSP ;y volvemos al barrido de los displays
bcf LIBRE,0 ;En caso contrario, es la primera vez que se ;detecta la tecla pulsada, se marca la ;retencin poniendo un 0 en LIBRE call SUMA ;Incrementamos el contador goto BARR_DSP ;y volvemos al barrido de los displays
SIGUE bsf LIBRE,0 ;Si se liber la tecla, lo marcamos goto BARR_DSP ;y volvemos al barrido
;Final de la exploracin de tecla
;******************************************************************************;Subprograma de suma con ajuste a dgitos decimales
SUMA incf DISPLAYS ;Incrementamos el contador movlw 0x0F ;Extraemos los 4 bits mas bajos
andwf DISPLAYS,W ;de los DISPLAYS movwf AUX
movlw 0x0A ;Vemos si nos hemos salido del rango decimal xorwf AUX,W ;para las unidades btfss STATUS,Z ;Si z=1, coincide con 1010 en binario returnAJUSTE movlw 0x06 ;y debemos de realizar un ajuste decimal addwf DISPLAYS,1 ;sumando 6 movlw 0xF0 ;Extraemos los 4 bits ms altos
andwf DISPLAYS,W ;de los DISPLAYS movwf AUX movlw 0xA0 ;Hacemos lo mismo con las decenas
xorwf AUX,W ;Si hemos llegado a 1010 (A) btfss STATUS,Z return clrf DISPLAYS ;debemos de poner a cero los displays return;Final del subprograma de suma;******************************************************************************
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -10-
;Subprograma para el control de los diodos led;Recibe en los cuatro ultimos bits de W el digito a representar: del 0 al 9;tambin puede ser un "blanco" (cdigo A en hexadecimal)
SACALED call TABLA ;Vamos a la tabla para volver en W con movwf PORTB ;lo que hay que sacar por el Puerto B return
TABLA addwf PCL,f ;Suma del PC con el dgito a representar (en W) retlw 0x3F ;Para el cero retlw 0x06 ;el uno retlw 0x5B ;el dos retlw 0x4F ;el tres retlw 0x66 ;el cuatro retlw 0x6D ;el cinco retlw 0x7D ;el seis retlw 0x07 ;el siete retlw 0x7F ;el ocho retlw 0x6F ;el nueve retlw 0x00 ;en blanco;Final del subprograma de sacar los led;******************************************************************************;Subprograma de Espera que genera una pausa que depende del valor cargado;en W, se emplea para retener la informacin en los displays (5mseg);y para hacer el barrido de las columnas de la matriz de led (1mseg)
;Emplea el TMRO que tiene asignado el prescaler de 256;se emplea un oscilador de 2.8MHz, luego para que haya overflow al cabo de;5mseg necesitamos contar 5ms*2.8MHz/(4*256)=14 pulsos (aprox), luego la;precarga ser de 256-14=242 que corresponde a F6 en hexadecimal
;Para que la espera sea de 1mseg, se deben contar aprox.3 pulsos, luego la;precarga ser de 256-3=253 que corresponde a FD
ESPERA bcf INTCON,T0IF ;Ponemos a cero el flag de overflow movwf TMR0 ;Realizamos la precargaNOLLEGO btfss INTCON,T0IF ;Si se activo el flag volvemos del subprograma goto NOLLEGO ;si no, seguimos esperando return;Final del subprograma de espera;******************************************************************************;SUBPROGRAMA DEDICADO AL BARRIDO DE LA MATRIZ DE LED
MATRIZ movlw 0x00 ;Inicializacin de la columna movwf COL ;de barrido
movlw 0x05 ;Inicializacin del contador movwf ROTAR ;de rotaciones
movlw 0x40 ;La primera columna, empezando por la izquierdacorresponde a RD6 movwf PORTD ;y la sacamos al puerto D
BARRMTZ call LEDMTZ ;Llamamos a la tabla de sacar los led, se ;retorna con el contenido en W y luego movwf PORTB ;lo sacamos por el PORTB movlw 0xFD ;Cargamos W para llamar a ESPERA de 1mseg call ESPERA incf COL ;Aumentamos el nmero de la columna a barrer rrf PORTD ;Activamos la siguiente columna decfsz ROTAR ;Decrementamos el contador de rotaciones goto BARRMTZ ;Si no lo hemos hecho 5 veces repetimos return ;si lo hemos hecho 5 veces salimos;Salimos del subprograma de barrido de la matriz de led
;******************************************************************************;Programa de tratamiento de la interrupcin generada por TMR1,;se producir cada 0.5 segundos (MEDIOS)
TEMPO btfss PIR1,0 ;Si entramos aqu por otro motivo retfie ;distinto a TMR1IF=1 salimos de inmediato
movwf W_temp ;Salvamos el registro W swapf STATUS,W ;y el registro STATUS por movwf ST_temp ;si acaso se manipulan para el principal
-
E.P.S. de Ingeniera de Gijn Ejemplos de Programas con Microcontroladores PIC
Pag. -11-
movlw 0x55 ;Volvemos a realizar la precarga de TMR1 movwf TMR1H ;Precarga del TMR1 para que "tarde" 0.5 seg movlw 0x1A ;en generar una interrupcin movwf TMR1L ;con oscilador de 2.8MHz
bcf PIR1,0 ;Ponemos a cero el flag TMR1IF incf MEDIOS ;Incrementamos el contador de medios segundos movlw 0x14 ;y vemos si ha llegado a 20 (0x14) xorwf MEDIOS,W btfsc STATUS,2 ;Comprobamos el estado de Z clrf MEDIOS ;Si lleg a 20, lo ponemos a cero rrf MEDIOS,W ;Si no, en TIEMPO ir el contador de segundos movwf TIEMPO ;dividiendo por 2 el de medios segundos
swapf ST_temp,W ;Recuperamos el contexto movwf STATUS ;STATUS antiguo y swapf W_temp,f ;W antiguo swapf W_temp,W
retfie ;Retorno del programa de tratamiento de;la interrupcin
;****************************************************************************** END ;del fichero