displays y matriz

Upload: rodrigo-torres

Post on 28-Oct-2015

26 views

Category:

Documents


0 download

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