Está en la página 1de 8

UNIVERSIDAD DE MÁLAGA I.T.

DE TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 15 DE FEBRERO DE 2010
EXAMEN DE SISTEMAS DIGITALES TIEMPO: 3 HORAS

APELLIDOS NOMBRE
DNI TITULACIÓN
LEA ATENTAMENTE EL ENUNCIADO DEL EXAMEN Y LAS PREGUNTAS. RESPONDA
JUSTIFICADAMENTE LAS PREGUNTAS EN EL ESPACIO RESERVADO PARA ELLO.

Se desea diseñar un sistema de vigilancia con control remoto para una sala (SVCR). En la sala que se quiere
vigilar se cuenta con una cámara de seguridad con soporte motorizado mediante un servo y cuatro sensores de
presencia. En la cabina del vigilante, desde donde se lleva a cabo el control, se tiene un botón, un interruptor,
un joystick, una pantalla y 4 leds. El SVCR puede trabajar en cuatro modos excluyentes, MODO NORMAL,
MODO BARRIDO, MODO PRESENCIA y MODO MANUAL. Cada uno de los modos tiene asociado un
LED. El MODO NORMAL es el modo por defecto, y en él, la pantalla de la cabina del vigilante muestra la
imagen captada por la cámara de la sala cada cierto periodo y durante un tiempo. En MODO BARRIDO, en el
que se entra mediante la pulsación del botón, la cámara se va posicionando automáticamente en distintos
ángulos. En el MODO PRESENCIA se entra de forma automática cuando hay un intruso en la sala. En este
modo se muestra la sala haciendo que la cámara apunte, de forma automática, a donde se encuentra el intruso
en cada momento. Por último, en el MODO MANUAL se entra poniendo en ON el interruptor presente en la
cabina. En este modo se guía a la cámara mediante el joystick. La implementación del sistema de control del
SVCR está basada en el microcontrolador MSP430F169, siguiendo el esquema que aparece en la figura 1.

Figura 1. Esquema de conexión del sistema


A continuación se muestra el código principal de la aplicación, la definición de variables y vectores
de Interrupción:

#include "msp430x16x.h" mov #WDTPW+WDTHOLD,&WDTCTL


PROGRAMA_PRINCIPAL EQU 0x1200 call #INI_VARIABLES
VARIABLES EQU 0x220 call #CONFIG_PUERTOS
; ---------------------------------------------------------------- call #CONFIG_TA
; PROGRAMA PRINCIPAL call #CONFIG_TB
; ---------------------------------------------------------------- call #INI_LED_CAM
ORG PROGRAMA_PRINCIPAL bucle1 bis #LPM3+GIE,SR
INICIO mov #0x0A00,SP nop

1 de 8
; ----------------------------------------------------------------
; DEFINICIÓN DE VARIABLES ; ------------------------------------------------------------------
; ---------------------------------------------------------------- ; VECTORES DE INTERRUPCIÓN
CONT1 DB 0 ; ------------------------------------------------------------------
CONT2 DB 0 ORG 0FFE0h+RESET_VECTOR
SECTORES DB 0x02,0x06,0x04,0x0C DW INICIO
DB 0x08,0x18,0x10,0x12 ORG 0FFE0h+PORT2_VECTOR
ANGULOS DW 0x0007,0x000F,0x0017,0x001F DW RTI_P2
DW 0x0027,0x002F,0x0037,0x003F ORG 0FFE0h+PORT1_VECTOR
; ---------------------------------------------------------------- DW RTI_P1
; INICIALIZACIÓN DE VARIABLES ORG 0FFE0h+TIMERB0_VECTOR
; ---------------------------------------------------------------- DW RTI_TB0
INI_VARIABLES clr.b CONT1
clr.b CONT2
mov #SECTORES,R5
mov #ANGULOS,R6
ret

1. Atendiendo a la subrutina de configuración de los puertos CONFIG_PUERTOS y al esquema de


la figura 1, indique qué elementos del sistema conectados a los puertos pueden provocar una
interrupción. Igualmente, indique para cada caso cuál es el flanco activo. (0.5p)

CONFIG_PUERTOS bic.b #BIT0+BIT1+BIT2+BIT3+BIT4,&P1DIR


bic.b #BIT0+BIT1+BIT2+BIT3+BIT4,&P1IES
bis.b #BIT6+BIT7,&P1DIR
bis.b #BIT6,&P1SEL
bis.b #BIT0+BIT1+BIT2+BIT3+BIT4,&P1IE

bic.b #BIT0,&P2DIR
bic.b #BIT0,&P2IES
bis.b #BIT1+BIT2+BIT3+BIT4,&P2DIR
bis.b #BIT0,&P2IE

bic.b #BIT0+BIT1+BIT2+BIT3+BIT4,&P3DIR
RET

Los elementos que están conectados al puerto 1 y que pueden provocar interrupción son el
interruptor (modo MANUAL) conectado al terminal 0 y los 4 sensores de presencia conectados a los
terminales 1,2,3 y4. Ambas interrupciones son activas por flanco de subida.
Respecto al puerto 2, el único elemento que puede provocar interrupción es el botón conectado al
terminal 0 (botón de barrido) y es activo por flanco de subida

Considere que en todos los aspectos el TIMER B es igual al TIMER A.


2. Complete la subrutina de configuración del TB para que produzca una interrupción cada 2
segundos. Se sabe que tenemos conectado un cristal de 32768Hz al oscilador LFXT1. No olvide
habilitar la interrupción. (0.75p)

CONFIG_TB mov #TBSSEL_1+ID_1MC_1+TBCLR,&TBCTL


mov #0x7FFF,&TBCCR0
mov #CCIE,&TBCCTL0
ret

freloj TB=16384 Hz Int del TBÆ(1/ freloj TB)* CCR0= 2s

2 de 8
El servo actúa haciendo girar la cámara. El servo funciona de forma que el ángulo de giro que
produce es proporcional al ciclo de trabajo del tren de pulsos que le llegan procedentes de la salida
del CCR1 del TA (P1.6). El servo utilizado en el sistema permite ángulos de giro comprendidos entre
0º y 315º. De la hoja de características del servo, se sabe, que para una frecuencia de 64Hz, el servo
se posiciona en los 0º con un ciclo de trabajo del 3,125% y se posiciona en el tope (315º) con un ciclo
de trabajo del 25%. Ciclos de trabajo inferiores al 3,125% o superiores al 25% hacen que el servo no
se mueva.
3. Describa en detalle como se configura el TA y qué efecto tiene en el sistema. Indique qué valor
hay que cargar en el registro de captura comparación 1 del TA (TACCR1) para que el servo no se
mueva. (0.75p)

CONFIG_TA mov #TASSEL_1+ID_1+MC_1+TACLR,&TACTL


mov #0x00FF,&TACCR0
mov #0,&TACCR1 ; Indique un valor para que el servo no se mueva
mov #OUTMOD_6,&TACCTL1
ret

Esta rutina programa al TA en modo up hasta CCR0, utilizando como fuente de reloj a la señal
ACLK y el divisor por 2. Al programar la cuenta del CCR0 a 0xFF=256, el periodo generado por
CCR0 es 0.015625 Æfrecuencia es 64Hz. Tal y como se indica en el enunciado, ciclos de trabajo
inferiores a 3,125% o superiores al 25% hacen que el servo no se mueva. De esta forma, calculando
los valores que indican estos límites sabremos qué valor hay que poner en el registro CCR1.

Tiempo de CCR1/ periodo de TB= (periodo del CCR0*25%) /(1/16384)=64=0x40 Æ si en CCR1 se


carga cualquier valor mayor o igual a 0x40 hace que el servo no se mueva
Tiempo de CCR1/ periodo de TB = (periodo del CCR0*3,125%) /(1/16384)=8=0x8 Æ si en CCR1 se
carga cualquier valor menor que 7 hace que el servo no se mueva

A continuación se muestra la subrutina INI_LED_CAM

INI_LED_CAM bic.b #BIT7,P1OUT


bis.b #BIT1,&P2OUT
bic.b #BIT2+BIT3+BIT4,&P2OUT
ret
4. ¿Cómo quedan los LED y la cámara tras ejecutar la subrutina INI_LED_CAM? (0.5p)

Los LED en modo PRESENCIA, MANUAL y BARRIDO están apagados, mientras que el LED en
modo NORMAl está encendido. La cámara está apagada.

Observando el programa principal, tras ejecutar las subrutinas de configuración de periféricos e


inicialización de variables, el programa se queda en modo de bajo consumo a la espera de
interrupciones. En este estado, si ningún elemento externo interacciona con el sistema, la única
interrupción que se produce es la del TB, tal y como se ha programado en la pregunta 2.

A continuación se muestra el código de la RTI del puerto 2 y del TB

;-------------------------------------------------------------------;
Rutina de tratamiento de la INT del puerto 2
;-------------------------------------------------------------------
RTI_P2 bis.b #BIT7,&P1OUT
bic.b #BIT1,&P2OUT
bis.b #BIT2,&P2OUT
bic.b #BIT0,&P2IFG
clr.b CONT2
FIN_RTI_P2 RETI

3 de 8
;--------------------------------------------------- jnz FIN_RTI_TB0
; Rutina de tratamiento de Int de TB C_AN mov @R6+,&TACCR1
;---------------------------------------------------- cmp #(ANGULOS+16),R6
RTI_TB0 bit.b #BIT1,&P2OUT jnz FIN_RTI_TB0
jz OTRO_M1 mov #ANGULOS,R6
M_N bic.b #BIT7,&P1OUT jmp FIN_RTI_TB0
inc.b CONT1 FIN_M_B clr.b CONT2
cmp.b #3,CONT1 bic.b #BIT7,&P1OUT
jnz FIN_RTI_TB0 bic.b #BIT2,&P2OUT
clr.b CONT1 bis.b #BIT1,&P2OUT
bis.b #BIT7,&P1OUT jmp FIN_RTI_TB0
jmp FIN_RTI_TB0
OTRO_M2 call #LEER_JOYSTICK
OTRO_M1 bit.b #BIT2,&P2OUT mov R10,&TACCR1
jz OTRO_M2 FIN_RTI_TB0 RETI
M_B inc.b CONT2
cmp.b #60,CONT2
jz FIN_M_B
bit.b #BIT0,CONT2

5. Atendiendo a la RTI del TB, indique en qué consiste el MODO NORMAL (1p)

En modo NORMAL la cámara se enciende cada 6 segundos para grabar el recinto durante 2
segundos. El control temporal se realiza mediante el TB y la variable CONT1. La RTI del TB se
ejecuta cada 2 segundos. Cada vez que se ejecuta, se apaga la cámara y sólo cuando la variable
CONT1 llega a alcanzar el valor 3 enciende la cámara y pone a 0 la variable CONT1. Por este
motivo, la cámara permanece encendida 2 segundos de cada 6 segundos, ya que al ejecutarse la RTI
nuevamente se vuelve a apagar.

6. Si se pulsa el botón1 que acciona el MODO_BARRIDO, conteste a las siguientes preguntas sobre
dicho modo:
6.a ¿Qué interrupciones se dan? (0.5p)
Se producen las interrupciones del puerto 2 y del TB. Cuando se pulsa el botón de BARRIDO
se ejecuta la RTI del puerto 2 que enciende la cámara, el LED de modo BARRIDO y apaga el
LED del modo NORMAL. El TB interrumpe cada 2 segundos y testea el valor de la variable
CONT2.

6.b ¿Cuánto dura el MODO BARRIDO? (0.5p)

El modo BARRIDO dura 120 segundos. El control temporal del modo BARRIDO se realiza a
través del TB y de la variable CONT2. La variable CONT2 se incrementa cada vez que se
produce una interrupción del TB( cada 2 segundos). Cuando la variable CONT2 alcanza el
valor 60, dicha variable se pone a 0 y se sale del modo BARRIDO.

6.c ¿Cada cuánto tiempo se cambia la posición de la cámara durante el MODO BARRIDO?
(0.5p)
Cada 4 segundos. La RTI del TB testea el bit menos significativo de la variable CONT2 cada
2 segundos, de manera que si este bit se encuentra a 0 se ejecuta el cambio de ángulo.
1
Considere que el botón/ pulsador no sufre de efecto rebote.

4 de 8
6.d ¿Qué posiciones, dadas en grados, toma la cámara durante el MODO BARRIDO?(0.5p)
Se le va asignando los valores almacenados en la tabla ANGULOS al CCR1, dando lugar a
distintos ciclos de trabajo. Los ciclos de trabajo corresponden a la siguiente razón :
CICLO DE TRABAJO=[(CARGA EN CCR1+1)/(CARGA EN CCR0 +1)]*100%
mientras que los grados en los que se posiciona el servo se corresponde con la siguiente:
GRADOS=45º*[(CICLO DE TRABAJO/3,125)-1]
Como los cambios en el servo se producen cada 4 segundos y el modo BARRIDO tiene una
duración de 120 segundos se producen 30 cambios. La secuencia de cambios es la siguiente:
0º,45º,90º,135º,180º,225º,270º,315º,0º,45º,90º,135º,180º,225º,270º,315º……..
En el MODO MANUAL, la cámara se posiciona con el movimiento del joystick. El joystick está
conectado al puerto 3. El puerto 3 es un puerto sin capacidad de interrupción, por lo tanto su gestión
debe hacerse por sondeo. La lectura del puerto 3 y la interpretación de los valores de entrada
obtenidos se realiza con la función LEER_JOYSTICK.
La función LEER_JOYSTICK devuelve a través del registro R10 el ángulo en el que se posiciona la
cámara.
A continuación se muestra el código de la rutina de tratamiento de interrupción del puerto 1.

;---------------------------------------------------------- bic.b #BIT2,&P1IFG


;Rutina de tratamiento de la INT del puerto1 jmp C_M_M
;---------------------------------------------------------- S3 bit.b #BIT3,&P1IN
RTI_P1 bit.b #BIT0,&P1IFG jz S4
jz sensores xor.b #BIT3,&P1IES
bit.b #BIT0,P1IES bic.b #BIT3,&P1IFG
jnz SAL_M_M jmp C_M_M
ENT_M_M xor.b #BIT0,&P1IES S4 xor.b #BIT4,&P1IES
bic.b #BIT2,&P2OUT bic.b #BIT4,&P1IFG
bic.b #BIT1,&P2OUT
C_M_M bit.b #BIT0,&P1IN
bis.b #BIT7,&P1OUT jnz FIN_RTI_P1
bis.b #BIT4,&P2OUT bit.b #BIT1+BIT2+BIT3+BIT4,&P1IN
bic.b #BIT0,&P2IE jz SAL_M_P
mov #TBSSEL_1+ID_0+MC_1+TBCLR,&TBCTL
mov #0x1FFF,&TBCCR0 ENT_M_P bic.b #BIT1,&P2OUT
mov #CCIE,&TBCCTL0 bic.b #BIT2,&P2OUT
bic.b #BIT0,&P1IFG bis.b #BIT3,&P2OUT
jmp FIN_RTI_P1 bic #CCIE,&TBCCTL0
bic.b #BIT0,&P2IE
SAL_M_M xor.b #BIT0,&P1IES bis.b #BIT7,&P1OUT
bic.b #BIT0,&P1IFG mov #ANGULOS,R6
bic.b #BIT4,&P2OUT mov.b &P1IN,R11
bic.b #BIT7,&P1OUT and.b #0x1E,R11
call #CONFIG_TB BUSCAR cmp.b @R5+,R11
bit.b #BIT1+BIT2+BIT3+BIT4,&P1IN jz C_P_C
jnz ENT_M_P incd R6
jmp BUSCAR
bis.b #BIT1,&P2OUT C_P_C mov @R6,TACCR1
bis.b #BIT0,&P2IE mov #SECTORES,R5
bic.b #BIT0,&P2IFG mov #ANGULOS,R6
jmp FIN_RTI_P1 jmp FIN_RTI_P1

sensores bit.b #BIT1,&P1IFG SAL_M_P bic.b #BIT3,&P2OUT


jz S2 bis.b #BIT1,&P2OUT
S1 xor.b #BIT1,&P1IES bis #CCIE,&TBCCTL0
bic.b #BIT1,&P1IFG bis.b #BIT0,&P2IE
jmp C_M_M bic.b #BIT0,&P2IFG
S2 bit.b #BIT2,&P1IFG bic.b #BIT7,&P1OUT
jz S3 FIN_RTI_P1 RETI
xor.b #BIT2,&P1IES

5 de 8
7. Atendiendo a las RTI de ambos puertos ¿Cada cuánto tiempo se sondea el joystick y se ejecuta la
función LEER_JOYSTICK? (1p)

Cuando se activa el flag de interrupción del terminal 0 del puerto 1, en la RTI de dicho puerto, lo
primero que se hace es comprobar qué flanco ha provocado la interrupción. Si se trata de una
puesta a ON del interruptor, entonces se ejecuta el código etiquetado por ENT_M_M. En este código
se conmuta el flanco, para detectar por interrupción las puestas a OFF del interruptor, se apagan
los LEDs de los modos NORMAL y BARRIDO, y se enciende el LED de modo MANUAL. A
continuación, se enciende la cámara, se desactiva la interrupción del botón de modo BARRIDO, se
programa el TB para que se produzca una interrupción cada 0.25s y se borra el flag de interrupción
correspondiente al interruptor.
Cuando se ejecuta la RTI del TB se comprueba si el modo MANUAL está activo, si lo está, se
produce la llamada a la función LEER_JOYSTICK.

8. ¿Por qué, teniendo en cuenta el código, no se puede activar el MODO BARRIDO estando en
MODO MANUAL o en MODO PRESENCIA? Indique en cada uno de estos dos últimos modos
cómo se implementa en el código. (0.75p)

El modo BARRIDO no se puede activar ni en modo PRESENCIA ni en modo MANUAL, porque en


ambos se desactiva la interrupción del terminal 0 del puerto 2, con la instrucción bic.b
#BIT0,&P2IE. Cuando se sale del modo BARRIDO, sólo se vuelve a habilitar la interrupción si no
hay ningún sensor de presencia activado.
Por otra parte, en modo PRESENCIA, si se habilitará la interrupción del botón de barrido, el modo
tampoco funcionaría por la desactivación del TB que se programa en la RTI del puerto (dentro del
código que programa el modo PRESENCIA)

9. ¿Qué pasa si se activa un sensor de presencia estando en MODO MANUAL? (0.75p)

El modo MANUAL es el modo más prioritario, por lo tanto, si mientras estamos en modo MANUAL
se activa un sensor de presencia el sistema sigue en modo MANUAL y la cámara apunta a donde
indique el joystick.

La RTI del puerto 1 se ejecuta cada vez que en un sensor se da un cambio (paso de presencia a
ausencia o paso de ausencia a presencia). Si durante uno de estos cambios el interruptor está ON,
modo MANUAL, el código lo que hace es cambiar el flanco activo, borrar el flag y retornar de la
RTI. Si por el contrario, el interruptor se encuentra en modo OFF, entonces se comprueba si hay
algún sensor a nivel alto (indicando presencia). Es necesario comprobar este hecho, porque las
interrupciones de los sensores se producen, como se ha dicho anteriormente, por cambios en su
estado. Tras la comprobación, si hay algún sensor activo se ejecuta el código que programa el modo
PRESENCIA, se localiza qué sensor o sensores están activos y se apunta la cámara a dicha
localización. Si no hay sensor activo se retorna de la RTI.

6 de 8
10. Sabiendo que no se pueden activar más de dos sensores a la vez por las regiones de cobertura de
dichos sensores, y que los sensores indican la presencia de un intruso con un nivel alto y la
ausencia con un nivel bajo, conteste a las siguientes preguntas relacionadas con el MODO
PRESENCIA.
10.a ¿Qué pasa si se da la siguiente secuencia: mientras está activo el MODO MANUAL se
activa un sensor (se pone en nivel alto indicando presencia), más tarde se desactiva el MODO
MANUAL pero el sensor sigue estando a nivel alto (es decir el intruso no se ha movido y está en
la región de cobertura)? (1p)
Estando en modo MANUAL, la cámara está grabando la posición indicada por el joystick. Si
durante este modo se activa un sensor, la RTI del puerto 1 programa el flanco contrario (para
gestionar por interrupción la desactivación de dicho sensor), se borra el flag, se comprueba si
estamos en modo MANUAL y si lo estamos se produce el retorno de la RTI.
Cuando se pone el interruptor en OFF ( hecho que se detecta mediante interrupción), se ejecuta
dentro de la RTI del puerto 1 la parte del código etiquetada por SAL_M_M. En este trozo de
código, se conmuta el flanco activo del interruptor, se apaga el LED de modo MANUAL, se borra
el flag, se apaga la cámara, se configura el TB para que interrumpa cada 2 segundos y se testea
si hay algún sensor a nivel alto. Si hay algún sensor a nivel alto nos indica que hay alguien en la
sala y se pasa automáticamente al modo PRESENCIA, produciéndose en el código el salto a las
instrucciones etiquetadas por ENT_M_P. En este modo se desactivan los LED de modo NORMAL
y BARRIDO, por si la entrada en el modo PRESENCIA se ha realizado desde alguno de estos dos
modos (el LED de modo MANUAL no es necesario apagarlo, puesto que no es posible que se dé
el modo PRESENCIA durante el modo MANUAL). A continuación, se enciende el LED que indica
modo PRESENCIA, se deshabilita la interrupción del TB, se desactiva la interrupción del botón
de modo BARRIDO (por si se ha llegado al modo PRESENCIA desde el modo BARRIDO), se
enciende la cámara y se localiza el sensor o sensores que están activos, posicionando la cámara
en el ángulo que permite la visualización de la zona de cobertura del sensor o de los sensores.
Cuando el sensor se desactive, y no se haya activado ningún otro sensor, se produce la salida del
modo ejecutando dentro de la RTI las instrucciones etiquetadas por SAL_M_P. En estas
instrucciones se apaga el LED modo PRESENCIA, se activa el LED de modo NORMAL, se
habilitan las interrupción del TB y del botón de modo BARRIDO (también se borra el flag), y por
último se apaga la cámara.

10.b Indique qué sensor o sensores están activos si el servo se posiciona en los 135º. Tenga en
cuenta los contenidos de las tablas etiquetadas por SECTORES y ANGULOS (1p)

La localización del sensor o sensores que están activos se hace mediante la búsqueda de la tabla
SECTORES.
La tabla SECTORES almacena las combinaciones posibles de sensores activados en el recinto
(sabiendo que sólo 2 pueden activarse simultáneamente y que no todas las combinaciones son
posibles). Cada una de las posiciones de la tabla SECTORES tiene asociada una posición de la tabla
ANGULOS, que indica el ángulo en el que se debe posicionar la cámara en función del sensor o
sensores que estén activos, y así visualizar la zona de cobertura de dichos sensores. Para localizar
qué sensores están activos, se leen los bits del puerto 1 a los que están asociados a los sensores
(instrucciones mov.b &P1IN,R11 y and.b #0x1E,R11) y se compara con el contenido de la tabla
SECTORES hasta encontrar una coincidencia. En la búsqueda anterior no sólo se incrementa el
puntero de la tabla SECTORES (R5), sino que también se incrementa el puntero a la tabla asociada
ANGULOS(R6). Cuando se han localizado el sensor o los sensores activos se carga en el CCR1 del
TA el valor almacenado en la tabla ANGULOS al que apunta R6.
En el caso que se nos indica, la cámara se ha posicionado en el ángulo 135º, que corresponde con
un ciclo de trabajo del 12,5% y por lo tanto con un valor a cargar en el CCR1 de 0x1F, lo que
corresponde a su vez con el valor 0x0C de la tabla sectores y por lo tanto con los sensores de
presencia 2 y 3.

7 de 8
La relación entre los sensores que se encuentran activos y los ángulos en los que se posiciona la
cámara es la siguiente:

Sensores activos Ángulo de posición de la cámara

S1 0º
S1 y S2 45º
S2 90º
S2 y S3 135º
S3 180º
S3 y S4 225º
S4 270º
S4 y S1 315º

8 de 8

También podría gustarte