Sei sulla pagina 1di 6

UNIVERSIDAD DE MÁLAGA I.

DE TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 17 DE DICIEMBRE DE 2009
EXAMEN DE SISTEMAS DIGITALES TIEMPO: 2 HORAS y 45 MINUTOS

APELLIDOS NOMBRE
DNI GRUPO

RESPONDA A LAS PREGUNTAS EN EL ESPACIO RESERVADO PARA ELLO. JUSTIFIQUE RAZONADAMENTE


TODAS SUS RESPUESTAS. LAS RESPUESTAS QUE NO SEAN EXPLICADAS NO SE PUNTUARÁN.

Se quiere diseñar un sistema de procesamiento de imágenes para una minipantalla LCD, basado en
el MSP430F1611, una versión del F169 con 10K de RAM. Cada imagen tiene 96x96 pixeles con 256
niveles de grises (cada píxel tiene asociado un byte que indica su nivel de gris, siendo 0 el negro y 255
el blanco). Mediante varios botones podemos escoger la operación a aplicar a la imagen y presentar su
efecto en pantalla: los botones “blanco”,”amarillo”, y ”negro” están conectados, respectivamente, a
los pines 24, 26, y 27 del chip, y son activos por flanco de bajada. Además existen dos LEDs , “verde”
y “rojo” asociados a la elección de una u otra operación, que están conectados, respectivamente, a los
pines 12 y 13 del chip; estos LEDs se encienden con un nivel alto.

Se ha capturado la imagen que aparece a continuación. Dicha imagen presenta sólo 4 colores,
incluyendo el blanco y el negro y siendo su fondo completamente blanco.

Sullivan ©Disney 2001

0 214 pixeles

80 2782 pixeles

132 1878 pixeles

255 4342 pixeles

Se dispone del siguiente código en el programa principal:


; ------------------------------- ; -------------------------------
; ETIQUETAS ; PROGRAMA PRINCIPAL
; ------------------------------- ; -------------------------------
#include "msp430x16x.h" ORG 0x4000; La FLASH empieza
#include "hal_lcd.h" aquí en el chip F1611
#define TAM_MATRIZ 96*96 Inicio mov #0x0A00,SP
#define NUM_NIV_GRIS 256 mov #WDTPW+WDTHOLD,&WDTCTL
#define BLANCO 255 call #config_LCD
#define NEGRO 0 call #config_botones
call #config_LEDs
call #dibuja_Imagen_Orig
wait mov.b #CPUOFF+GIE,SR
nop
* config_LCD, dibuja_Imagen_Orig, y dibuja_Imagen_Mod están definidas en hal_lcd.h y no se consideran para
el examen. config_LCD prepara la pantalla para la presentación de imágenes; dibuja_Imagen_Orig y
dibuja_Imagen_Mod dibujan la imagen asociada a las variables matriz y copia en el LCD.

1
Las variables, constantes, y vectores están definidos de la siguiente forma:
; ----------------------------------
; DEFINICIÓN DE CONSTANTES ; ----------------------------------
; ---------------------------------- ; VECTORES INTERRUPCIÓN
ORG 0x5000 ; ----------------------------------
matriz DB 255,255,..;TAM_MATRIZ valores ORG 0FFE0h+RESET_VECTOR
; ---------------------------------- DW Inicio
; DEFINICIÓN DE VARIABLES ORG 0FFE0h+PORT2_VECTOR
; ---------------------------------- DW RTI_PUERTO2
ORG 0x1100 ORG 0FFE0h+TIMERA0_VECTOR
tabla DS16 0x100 ;A 0 inicialm. DW RTI_TIMERA0
n_pix_umbral DC16 0 END Inicio
gris_umbral DC16 0
copia DS8 TAM_MATRIZ * matriz contiene TAM_MATRIZ posiciones tamaño byte
modo DC8 0 representando los píxeles de la imagen.
*Las 256 word de tabla están inicialmente a 0.

A continuación aparece la subrutina config_botones , que permite configurar el micro para


la conexión de los 3 botones descrita en el enunciado.
config_botones
bic.b #BIT4+BIT6+BIT7,&P2DIR; Bits X,Y,Z de Px como entrada
bic.b #BIT4+BIT6+BIT7,&P2SEL; Función E/S bits X,Y,Z de Px
bis.b #BIT4+BIT6+BIT7,&P2IES; Flanco de bajada
mov.b #BIT7,&P2IE
clr.b &P2IFG
ret

1. Escribe una subrutina config_LEDs , que permita configurar el micro para la conexión de
los 2 LEDs descrita en el enunciado. (0.25p)
config_LEDs
bis.b #BIT0+BIT1,&P1DIR; LEDs conectados a BitA y BitB de Pd
bic.b #BIT0+BIT1,&P1OUT; LEDs apagados(se encienden a nivel alto)
ret
ret

2. A continuación podemos ver el código para la RTI del PUERTO2 del micro:
RTI_PUERTO2 bit.b #BIT7,&P2IFG esbit4 cmp.b #1,modo
jz comp_BIT6 jeq sal_modo
bis.b #BIT1,&P1OUT bis.b #BIT1+BIT0,&P1OUT
call #calc_Histo bis.b #BIT6,&P2DIR
mov.b #BIT4+BIT6,&P2IE mov.b #1,modo
bis.b #BIT7,&P2DIR clr R9
bic.b #BIT1,&P1OUT mov #tabla,R10
jmp fin_RTIP2 call #config_Timer
comp_BIT6 bit.b #BIT6,&P2IFG jmp fin_RTIP2
jz esbit4 sal_modo call #stop_Timer
bis.b #BIT0,&P1OUT bic.b #BIT1+BIT0,&P1OUT
push gris_umbral bic.b #BIT6,&P2DIR
call #bin_Img mov.b #0,modo
pop R9 fin_RTIP2 clr.b &P2IFG
call #dibuja_Imgen_Mod reti
bic.b #BIT0,&P1OUT
jmp fin_RTIP2
¿Qué efecto tiene la pulsación de los botones “amarillo” y “negro”? ¿Cómo afecta dicha
pulsación a los LEDs “verde” y “rojo”? (1p)

2
El botón “negro” genera una interrupción del puerto2 con activación del BIT7 de P1IFG.
Se enciende el led “rojo”; se llama a la función “calc_Histo”; se habilitan los botones
“amarillo” y “blanco”; se deshabilita el botón “negro”; y, finalmente, se apaga de nuevo el led
“rojo”.
El botón “amarillo” genera una interrupción del puerto2 con activación del BIT6 de P1IFG.
Se enciende el led “verde”, se llama a la función”bin_Img” tras meter la variable
“gris_umbral” en pila; se saca un elemento de la pila; se dibuja la imagen en “matriz”; y por
último se vuelve a apagar el LED verde.

3. A continuación vemos el código de la subrutina calc_H .


calc_Histo mov #matriz,R11 clr R9
mov #TAM_MATRIZ,R12 busca_max cmp @R10+,n_pix_umbral
rec_matriz mov.b @R11+,R10 jhs sigue_busc
rla R10 decd R10
add #tabla,R10 mov R9,gris_umbral
inc 0(R10) mov @R10+,n_pix_umbral
dec R12 sigue_busc inc R9
jnz rec_matriz cmp #NUM_NIV_GRIS,R9
jne busca_max
fin_rec mov #tabla,R10 ret

¿Qué hace la porción de código que va desde el inicio hasta fin_rec? ¿Y desde aquí hasta el
final? Si la rutina se ejecuta sobre la imagen indicada en el enunciado, ¿qué valor contendrá
la variable n_pix_umbral? ¿Y la variable gris_umbral? (2p)

Hasta “fin_rec”, recorre uno a uno los píxeles de una imagen y cuenta el número de ellos de
cada nivel de gris, almacenando el resultado en las 256 WORDS apuntadas por “tabla”. En
resumen, realiza el histograma de la imagen.
Desde “fin_rec” al final, recorre la tabla donde están depositados el número de píxeles de
cada uno de los 256 niveles de grises, y determina cual es el nivel de gris dominante (con más
pixeles), almacenando el nivel de gris dominante en “gris_umbral”, y el número de pixeles del
mismo en “n_pix_umbral”

3
4. La función bin_Img tiene el siguiente código:
bin_Img mov 2(SP),R9 cambio_uno mov.b #BLANCO,0(R13)
mov #matriz,R11 jmp sigue_camb
mov #TAM_MATRIZ,R12 cambio_dos mov.b #NEGRO,0(R13)
mov #copia,R13 sigue_camb inc R13
bucle_bin mov.b @R11+,0(R13) dec R12
cmp.b R9,0(R13) jnz bucle_bin
jlo cambio_dos ret

¿Qué cometido cumple esta subrutina? Imagina que al hacer la llamada a esta función el dato
en 2(SP) es “0x84” (132 en decimal), ¿cómo aparece la imagen en pantalla al ejecutar call
#dibuja_Imgen_Mod posteriormente? Colorea como se vería en el LCD (1.5)
Realiza, pixel a pixel, una copia de la imagen almacenada en “matriz”, pero poniendo el pixel
a “blanco” o “negro” según si su nivel de gris es mayor-igual o menor que el recibido a través
de la pila. Se trata de una binarización de la imagen donde el umbral lo determina el
parámetro pasado a través de la pila.
Las zonas de nivel de gris “132” y “255” quedan en blanco; las zonas con nivel de gris “0” y
“138” en negro

5. Configura el TIMERA en la subrutina call #config_Timer, para que interrumpa a cada


segundo, utilizando el reloj ACLK a 32768Hz. Configura también la subrutina call
#stop_Timer, que permita detener la acción del TIMERA (1.25p)

config_Timer mov #TASSEL_1+ID_0+MC_1+TACLR,&TACTL


mov #CCIE,&TACCTL0
mov #0x7FFF,&TACCR0
ret

stop_Timer bic #MC0+MC1,&TACTL


ret

4
6. Indica en qué momentos, dentro del funcionamiento de la aplicación, se activan las distintas
interrupciones y cuales son sus causas. (1p)
BIT7 Puerto2: Solo al inicio, tras la configuración del sistema, al pulsar
el botón “negro”. Tras ejecutarse una vez y realizar su función se
deshabilita durante el resto de la ejecución.

BIT6 Puerto2: Se activa al pulsar el botón “amarillo”; pero solo si se ha


pulsado el botón “negro” anteriormente y no se ha activado el botón
“blanco” un número impar de veces (por tanto, solo si no estamos en
modo=1).

BIT4 Puerto2: Se activa al pulsar el botón “blanco”, pero solo si se ha


pulsado el botón “negro” anteriormente. En las activaciones impares pone al
sistema en modo=1, deshabilitando el botón “amarillo” y habilitando el
TIMERA CCR0. En las pares, vuelve al modo=0, volviendo a habilitar el botón
“amarillo” y deteniendo el TIMER

TIMERA CCR0: Se activa tras una pulsación impar del botón “blanco”,
volviendo a deshabilitarse en las pulsaciones pares.

7. Teniendo en cuenta el código de RTI_PUERTO2 y que el código de RTI_TIMERA0 es el que


viene a continuación junto a la subrutina auxiliar inc_y_comp, ¿qué efecto tiene en la
aplicación la pulsación del botón “blanco”? ¿Qué papel cumple la variable modo? (1.5 p)

RTI_TIMERA0 tst 0(R10) inc_y_comp incd R10


jnz proceso inc R9
call #inc_y_comp cmp #NUM_NIV_GRIS,R9
proceso push R9 jne fin_inc_y_comp
call #bin_Img clr R9
pop R9 mov #tabla,R10
call #dibuja_Imagen_Mod fin_inc_y_comp ret
call #inc_y_comp
reti

En cada pulsación impar, se entra en un modo de trabajo “modo=1”, que consiste en lo


siguiente: a cada interrupción de TIMERA (cada segundo), se establece como umbral de
binarización de la imagen uno de los niveles de grises paras los que haya pixeles presentes
(empezando desde el 0 hacia el 255) y se binariza la imagen según ese nivel, dibujandola en el
LCD. Cuando se llegue al último nivel (255, blanco) se vuelve a empezar por el principio (0,
negro). Mientras se esté en este modo, ambos leds están encendidos, y las pulsaciones del
botón “amarillo” no tienen efecto.
Las pulsaciones pares del botón sacan al sistema de este modo, volviendo a “modo=0”.

8. Se decide que el sistema pueda recibir matrices de imágenes desde el PC a través de su


puerto serie. El puerto serie del PC se conecta a la UART del micro con el transceptor
necesario. 8.a Configure la USART0 en modo UART para que pueda recibir por interrupción
la matriz de la imagen a una velocidad de 4800 baudios. 8.b Inicialice el vector de
interrupción sabiendo que la RTI que permite la recepción de los píxeles de la matriz empieza
en la dirección de memoria etiquetada por RTI_RX_MATRIZ.(1p)

5
CONFIG_UART
bis.b #BIT4+BIT5,&P3SEL ; P3.4,5 = USART0 TXD/RXD
bis.b #BIT4,&P3DIR
bic.b #BIT5,&P3DIR

bis.b #SWRST,&UCTL0
bis.b #UTXE0+URXE0,&ME1 ; Habilita USART0 TXD/RXD
bis.b #CHAR,&UCTL0 ; 8-bit por carácter
mov.b #SSEL0,&UTCTL0 ; UCLK = ACLK
mov.b #006h,&UBR00 ; 32768/4800 – 6.82
mov.b #000h,&UBR10
mov.b #06Fh,&UMCTL0 ; Modulación
bic.b #SWRST,&UCTL0 ;Inicialización de la máquina de estados
bis.b #URXIE0,&IE1 ;Habilitación de la
;interrupción de RX de la USART0
ret

ORG 0FFE0h+USART0RX_VECTOR
DW RTI_RX_MATRIZ ; RX USART0

9. ¿Habríamos podido procesar imágenes de las características definidas en el enunciado de


haber utilizado el chip MSP430F169? ¿Por qué? (0.5p)

No. Una imagen de 96x96 pixeles donde cada pixel ocupa un byte, ocupa un total de 9216
bytes, mientras que la memoria RAM del MSP430F169 solo tiene 2058 bytes. En principio
necesitamos la cantidad de memoria RAM que ocupa una imagen porque necesitamos copiarla
para que el proceso de binarización no destruya la imagen original. Una alternativa sería
utilizar la memoria FLASH para el almacenamiento de la copia, pero eso obligaría
instrucciones especiales de modificación de FLASH en tiempo de ejecución, mucho más
lentas en su ejecución.

APENDICE: Mapa de memoria del MSP430F1611 y pin-out del chip MSP430F1611

Potrebbero piacerti anche