You are on page 1of 7

UNIVERSIDAD DE MÁLAGA E.T.S.I.

DE TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 1 DE FEBRERO DE 2010
EXAMEN DE SISTEMAS DIGITALES TIEMPO: 2 HORAS y 45 MINUTOS

APELLIDOS NOMBRE
DNI

RESPONDA A LAS PREGUNTAS EN EL ESPACIO RESERVADO PARA ELLO. LOS CÁLCULOS


INTERMEDIOS SE REALIZARÁN EN EL REVERSO DE LA HOJA. JUSTIFIQUE
RAZONADAMENTE TODAS SUS RESPUESTAS. LAS RESPUESTAS QUE NO SEAN
EXPLICADAS NO SE PUNTUARÁN.

Se desea desarrollar un sistema de control para botes neumáticos de salvamento marítimo mediante un
MSP430. El sistema funciona de la siguiente forma. Cuando se lanza el paquete del bote al agua, un
sensor de humedad detecta el evento y activa un compresor conectado a la válvula de aire del bote hasta
que un sensor de presión determina que se encuentra inflado por completo. En ese momento, si es de
noche se activa una baliza luminosa que parpadea para que se localice el bote desde cierta
distancia. Se sabe que el microcontrolador tiene conectado al oscilador LFXT1 un cristal de reloj de
32768Hz.

El sensor de humedad SHT11 se alimenta a 2.4 V y se conecta de la siguiente forma:

Fig.1. Conexión al SHT11


Los pines DATA y SCK son pines en colector/drenador abierto. DATA corresponde a la salida/entrada de
datos (BIDIRECCIONAL) para comandar y leer el sensor. Los terminales DATA y SCK del sensor se
conectan respectivamente a los terminales GPIO P1.0 y P1.1. Además, se conectan sendas resistencias de
pull-up de 10K, para fijar un nivel alto (débil) en las líneas.

La comunicación entre el microcontrolador y el SHT11 debe seguir el protocolo de la Fig.2. Primero el


microcontrolador inicializa la transmisión. A continuación, para lectura de humedad envía el byte
00000101, que componen la dirección y el comando de operación de lectura de humedad. Tras reconocer
la operación, el sensor transmite la humedad con resolución de 8 ó 12 bits, tardando aproximadamente en
la medición de la humedad unos 11mS para la resolución de 8 bits y 55ms para la de 12 bits. A
continuación, el microcontrolador recibe el dato, que puede constar de 3 bytes (2 bytes con el resultado y
un último byte de CRC). El microntrolador puede decidir no utilizar el byte de CRC, para ello, durante el
ciclo de reconocimiento del último byte de resultado mantendrá la línea DATA a nivel alto. Finalmente,
el microcontrolador dará por concluida la transferencia dejando libre el bus, poniendo para ello en estado
de reposo ( nivel alto) las líneas SCK y DATA .

Fig.2 Cronograma de comunicación con SHT11(Fuente: hoja de características de SHT11)

1
Para inicializar la comunicación entre el micro y el sensor, el proceso es el siguiente: 1) se pone a cero
lógico la línea de datos mientras SCK está a uno; 2) seguidamente se genera un pulso bajo en SCK
mientras la línea DATA sigue a cero y; 3) para finalizar se pone a 1 DATA mientras SCK esta a 1.
DATA

SCK

Fig. 3. Inicio de transmisión

A continuación se muestra el programa principal, así como las variables y las definiciones de etiquetas.

#include "msp430x16x.h" ; Definición de etiquetas


#define PROGRAMA_PRINCIPAL 0x1200
#define VARIABLES 0x220
#define H_W L_H_B
#define ERROR 0
------------------------------------------------------------------------------
; VARIABLES
; ------------------------------------------------------------------------------
ORG VARIABLES
L_H_B DB 0
H_H_B DB 0
; ------------------------------------------------------------------------------
; PROGRAMA PRINCIPAL
; ------------------------------------------------------------------------------
ORG PROGRAMA_PRINCIPAL
Inicio mov #0x0A00,SP ; Inicializa base pila
mov #WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL,&WDTCTL
bis.b #WDTIE,&IE1
bis.b #TASSEL_1+ID_0+MC_2+TACLR,&TACTL
mov #9,R6
call #CONFIG_PUERTOS
bucle1 bis #LPM3+GIE,SR
call #MEDIR_HUMEDAD
jmp bucle1
bucle2 mov #0xFFFF,&CCR1
mov #OUTMOD_4,&TACCTL1
bis #LPM3,SR
nop
1. La rutina de atención a la interrupción del watchdog es la siguiente:

RTI_WDT inc R10


cmp.b #60,R10
jlo FIN_RTI_WDT
clr R10
bic #LPM3,0(SP)
FIN_RTI_WDT RETI
¿Cada cuánto se leerá la humedad?

El watchdog está configurado en modo temporizador y produce una interrupción cada 1 segundo. Cada 60
segundos se ejecuta la línea bic #LMP3,0(SP) en la RTI del watchdog. Esta instrucción saca a la CPU del
estado de bajo consumo en el que se encuentra, ejecutando la subrutina MEDIR_HUMEDAD.

2
2. A la vista del protocolo de comunicación entre el micro y el sensor, ¿el sensor sigue las
especificaciones del interfaz I2C? ¿es compatible I2C?

No sigue las condiciones de arranque y parada indicadas en las especificaciones del I2C, por lo tanto no
es compatible I2C. A la vista del cronograma, si se cumplen el resto de las especificaciones: un byte de
dirección (7 bits de dirección y el octavo bit que indica la operación), envío de los bits del más
significativo al menos significativo, validación de los datos con el flanco de subida, control de flujo,
etc…

A continuación se van a completar y a analizar algunas de las subrutinas que son llamadas dentro de la
subrutina MEDIR_HUMEDAD. Sabiendo que la subrutina de configuración del puerto 1,
CONFIG_PUERTOS, es la siguiente y que deja las líneas DATA Y SCK en estado de reposo por parte
del microcontrolador, conteste a las siguientes preguntas.

CONFIG_PUERTOS bic.b #BIT0+BIT1,&P1DIR


bic.b #BIT0+BIT1,&P1OUT
bic.b #BIT1,&P1DIR ; SCK
bic.b #BIT0,&P1DIR ; DATA
RET

3. Complete las siguientes subrutinas que realizan, por parte del microcontrolador, la inicialización del
sensor INI_SENSOR, la transmisión de un bit TX_BIT y la recepción de un bit RX_BIT. Recuerde que
las líneas SCK y DATA trabajan en régimen pull-up.
________________________________________
INI_SENSOR bit.b #BIT1,&P1IN ; SCK?
jz INI_SENSOR
bis.b #BIT0,&P1DIR ; Elegir entre bis.b o bic.b DATA=0
nop
nop
bis.b #BIT1,&P1DIR ; Elegir entre bis.b o bic.b SCK=0
nop
nop
bic.b #BIT1,&P1DIR ; Elegir entre bis.b o bic.b SCK=1
nop
nop
bic.b #BIT0,&P1DIR ; Elegir entre bis.b o bic.b DATA=Z
nop
nop
bis.b #BIT1,&P1DIR ; Elegir entre bis.b o bic.b SCK=0
RET
___________________________________________
TX_BIT bic.b #BIT1,&P1DIR ; SCK=Z
espera_tx bit.b #BIT1,&P1IN ; SCK?
jz espera_tx ;completar
bis.b #BIT1,&P1DIR ;Elegir entre bis.b o bic.b SCK=0
RET
____________________________________________
RX_BIT bic.b #BIT0,&P1DIR; DATA=Z
nop
nop
bic.b #BIT1,&P1DIR ; SCK=Z
espera_rx bit.b #BIT1,&P1IN ; SCK?
jz espera_rx ; completar
bit.b #BIT0,&P1IN ; DATA?
rlc.b R8 ; Elegir entre rla, rlc, rra ó rrc. Justifique su respuesta
bis.b #BIT1,&P1DIR ;SCK=0
RET

3
La instrucción bit.b #BIT0,&P1IN testea la línea DATA. Si DATA=0 Æz=1 y c=0 (c=NOT z). El bit que
primero se recibe es el más significativo. Por estos motivos, la instrucción que hay que incluir es el
desplazamiento hacia la izquierda, teniendo en cuenta en este desplazamiento el bit de carry.

4. Explique en base al protocolo, qué hace la rutina TX_BYTE en función de los valores de los registros
R6 y R5. Indique, si los tiene, los parámetros de entrada y salida de esta subrutina.

call #TX_BIT
TX_BYTE dec.b R6 jmp TX_BYTE
cmp.b #0,R6 TX_UNO bic.b #BIT0,&P1DIR ; DATA=1
jz FIN_TX_BYTE call #TX_BIT
rla.b R5 jmp TX_BYTE
jc TX_UNO FIN_TX_BYTE mov #9,R6
TX_CERO bis.b #BIT0,&P1DIR ; DATA=0 RET

La función TX_BYTE transmite, del más significativo al menos, 8 bits almacenados en el registro R5. El
número de bits trasmitidos se realiza en un bucle de transmisión, controlado por el valor del registro R6.
Los bits que quiere transmitir la subrutina están almacenados en el registro R5. En cada paso del bucle se
desplaza hacia la izquierda un bit del registro R5, operando con tamaño byte. El bit desplazado se
almacena en el bit c del SR. En función de si el bit almacenado en el flag c del SR es uno o es un cero se
salta respectivamente a la etiqueta TX_UNO o TX_CERO. En ambos casos, se llama a la función
TX_BIT, pero poniendo de manera previa la señal DATA al alta impedancia bic.b #BIT0,&P1DIR
(TX_UNO) o a nivel cero bis.b #BIT0,&P1DIR (TX_CERO). La función TX _BIT mantiene el dato
mientras el reloj a está a 1 y libera el bus bajando el reloj.

Esta función tiene un parámetro de entrada que se pasa a través de registro R5 y es el byte a transmitir.

No posee parámetros de salida.

5. Explique en base al protocolo, qué hace la rutina RX_BYTE en función de los valores de los registros
R6 y R8. Indique, si los tiene, los parámetros de entrada y salida de esta subrutina.

RX_BYTE dec.b R6
cmp.b #0,R6
jz FIN_RX_BYTE
call #RX_BIT
jmp RX_BYTE
FIN_RX_BYTE mov #9,R6
RET

La función RX_BYTE recibe 8 bits del más significativo al menos significativo y los va almacenado en el
registro de datos R8. La recepción de los 8bits se realiza mediante la llamada en bucle de la función
RX_BYTE. Las veces que se ejecuta el bucle se controlan mediante el registro R6. La función RX_BIT
pone DATA a alta impedancia, dejando el maestro (microcontrolador) la línea libre para que el esclavo
(sensor SHT11) imponga el bit que quiere transmitir, mientras el reloj SCK está a nivel bajo. Tras un
tiempo, implementado por los 2 nop, el maestro pone el reloj a alta impedancia y comprueba que dicha
línea de reloj está a nivel alto y no sujeto al nivel bajo impuesto por el esclavo en un posible control de
flujo. Tras comprobar que la línea de reloj está a nivel alto testea la línea de datos y almacena el dato en el
registro R8 y pone el reloj a nivel bajo indicando que el dato ya ha sido recibido. La recepción y el
almacenamiento se hace con la instrucción rlc.b R8, tal y como se ha indicado en la pregunta 3.

La función no tiene parámetros de entrada.


La función tiene un parámetro de salida dado a través del byte menos significativo registro R8 y que es el
byte recibido.

A continuación se muestra la implementación del protocolo de comunicación entre el microcontrolador y


el sensor para medir la humedad. En esta implementación se hace uso de las subrutinas que se han
analizado en las preguntas 3,4 y 5.

4
espera_medida bit.b #BIT1,&P1IN ; SCK?
MEDIR_HUMEDAD jz espera_medida
call #INI_SENSOR call #RX_BYTE
mov #0x05,R5 mov.b R8,H_H_B
call #TX_BYTE bis.b #BIT0,P1DIR ;
mov #0,R8 DATA=0
call #RX_BIT call #TX_BIT
cmp #0,R8 call #RX_BYTE
jz ACK mov.b R8,L_H_B
NACK mov #Inicio,0(SP) bic.b #BIT0,&P1DIR ;
jmp F_MEDIR_HUM DATA=1
ACK bic.b #BIT1,&P1DIR ; call #TX_BIT
SCK=Z bic.b #BIT0,&P1DIR bic.b #BIT1,P1DIR ;SCK=z
ETIQUETA1 call #COMP_HUMEDAD
; F_MEDIR_HUM RET

6. ¿Qué ocurre cuando el sensor no reconoce el byte de dirección y comando? ¿En la implementación del
protocolo se decide utilizar el CRC?¿Qué se almacena en H_H_B y en L_H_B?

Cuando el sensor no reconoce la dirección y/o el comando, se reinicializa el sistema. Al no reconocer el


primer byte transmitido por el maestro, el esclavo no manda el ACK (deja la línea DATA en alta
impedancia), lo que provoca que al llamar a la función RX_BIT se reciba un 0x01. Con la recepción de
un dato distinto de cero se ejecuta la instrucción mov #Inicio,0(SP), que modifica el PC almacenado en
la PILA con el valor de la etiqueta Inicio.

En la implementación que se realiza del protocolo no se espera la recepción del byte de CRC, sino que se
da por finalizada la operación de lectura con el envío de un nivel alto en la línea de DATA (instrucciones
bic.b #BIT0,&P1DIR y call #TX_BIT)

El dato de humedad que se recibe es de 12 bits. En H_H_B se almacena el byte más significativo del dato
de humedad, mientras que en el L_H_B se almacena el byte menos significativo.

A continuación se muestra el código de COMP_HUMEDAD.

COMP_HUMEDAD cmp #3400,H_W


jlo FIN_COMP_HUMEDAD
call #INFLAR_BOTE ; Esta subrutina infla el bote
mov #bucle2,2(SP)
bic.b #WDTIE,&IE1
FIN_COMP_HUMEDAD RET

7. ¿Qué hace la subrutina COMP_HUMEDAD? ¿Qué contiene la dirección etiquetada por H_W? ¿A
dónde retorna esta subrutina? Tenga en cuenta la gráfica de la figura 4.

Fig.4. Relación entre la medida dada por el sensor y


la humedad (Fuente: hoja de características de SHT11)

COMP_HUMEDAD comprueba el dato de humedad transmitido por el sensor, con una resolución de 2
bytes, con el valor de referencia 3400. El valor 3400 corresponde según la figura 4 a un valor de humedad
de aproximadamente el 100%. De esta forma, si el valor de humedad medido es menor que el de

5
referencia no hace nada, devolviendo el control a MEDIR_HUMEDAD. MEDIR_HUMEDAD, a su vez
devuelve el control al programa principal, en concreto a la instrucción jmp bucle1, que pone al micro en
bajo consumo a la espera de una nueva interrupción del watchdog que provoque una nueva medida.
Si por el contrario, el valor es mayor o igual, se llama a la subrutina INFLAR_BOTE y se modifica la
dirección de retorno que va a utilizar la subrutina MEDIR_HUMEDAD con la instrucción
mov#bucle2,2(SP). De esta forma el retorno de MEDIR_HUMEDAD se realizará a la instrucción
etiquetada por bucle2.

Tal y como se ha definido: H_W=L_H_B=0x220 y H_H_B=0x221. Pero es necesario identificar el tipo


de dato, para poder indicar el contenido de la dirección 0x220. Así, por la instrucción cmp#3400,H_W,
que realiza una comparación entre datos de tamaño palabra, donde el operando destino tiene modo de
direccionamiento simbólico, sabemos que la dirección destino hace referencia a una palabra almacenada
en formato little-endian (byte bajo en una dirección par y el byte alto en la dirección impar siguiente). Por
lo anterior, el contenido de la dirección establecida por H_W es el contenido de L_H_B como byte bajo y
el contenido H_H_B como byte alto. En el ejemplo de la figura 2 que el sensor devuelve 0x0931 el
contenido de H_W sería 0x0931(L_H_B= 0x09 y H_H_B=0x31).

La rutina retorna a MEDIR_HUMEDAD.

Queremos medir experimentalmente el número de lecturas que se puede realizar por segundo con este
sensor. Para ello, incluimos las siguientes instrucciones en los puntos del código que se indican:
bis.b #TASSEL_1+ID_0+MC_2+TACLR,&TACTL
bic.b #TAIFG,&TACTL como primeras dos líneas de la subrutina MEDIR_HUMEDAD

Antes de la penúltima instrucción de MEDIR_HUMEDAD, que es:


ETIQUETA1 call #COMP_HUMEDAD
Se pone el siguiente código:
bit #TAIFG,&TACTL
jz TOMAR_DATOS
mov #ERROR,@R7+ ; ERROR se ha definido como el valor 0
jmp ETIQUETA1
TOMAR_DATOS mov &TAR,@R7+
Instrucciones que controlan el buffer donde se acumulan las medidas

8. Indique en qué consiste el método. Calcule el número de lecturas que se puede realizar sobre el sensor
si en la tabla apuntada por R7 se han almacenado los siguientes resultados: 0x3E84, 0x3F90, 0x3EFE,
0x4002, 0x3E76

Asumiendo que el modo indirecto con autoincremento es válido para el operando destino, el código lo
que hace es medir el tiempo que se tarda en obtener una medida de humedad desde que ésta es
demandada por el micro hasta que la entrega el sensor.
Para realizar las medidas se inicia el contador del TA al principio de la subrutina MEDIR_HUMEDAD y
se programa a dicho contador en modo continuo con fuente de reloj ACLK y división por 1 (instrucción
bis.b#TASSEL_1+ID_0+MC_2+TACLR,&TACTL). A continuación, se borra el flag TAIFG, para
detectar si éste llega a ponerse a 1 durante el proceso de lectura del sensor, lo que indicaría que se ha
producido un desbordamiento del contador y que la medida tomada mediante la lectura del registro del
contador TAR es errónea. Tras estas dos instrucciones, se encuentra el código original de
MEDIR_HUMEDAD. Cuando se ha terminado de tomar la medida se incluyen las instrucciones que se
indican en el enunciado. Estas instrucciones comprueban en primer lugar si el flag TAIFG se ha activado,
lo que ocurrirá si el sensor tarda en entregar la medida de humedad más de 2segundos. En este caso, se
considera que la medida ha sido errónea y se introduce la etiqueta ERROR en la tabla gestionada por R7.

6
Si el flag TAIFG no se ha activado la medida ha sido correcta y en la tabla gestionada por R7 se almacena
el valor leído del registro del contador,TAR.
Con las medidas realizadas se observa que los valores obtenidos del TAR son muy parecidos y
corresponden a los siguientes valores temporales:
0x3E84Æ 0.488 s
0x3F90Æ 0,496 s
0x3EFEÆ 0.492 s
0x 4002Æ 0.5 s
0x3E76Æ 0.487s
A la vista de los resultados podemos hablar de que el número de lecturas que se pueden realizar por
segundo es de 2.

9. Para atender a la baliza luminosa, una Naps SPOL que consume en media 140 mA y está conectada al
OUT1 del bloque CCR1, se sabe que en el programa principal las instrucciones que van justo detrás de
bucle1 (bucle2) son:

bucle2 mov.w #0xFFFF,&CCR1


mov.w #OUTMOD_4,&CCTL1 ; CCR1 toggle
finalloop bis.w #LPM3,SR ; Enter LPM3

¿Qué hace este código? ¿Cual es el consumo en media del sistema de baliza?

Genera una onda cuadrada que enciende y apaga la baliza (parpadeo) (2 segundos apagada/2 segundos
encendida)
El consumo medio de la baliza dentro del sistema es 70 mA

Los sistemas Naps SPOL disponen de un regulador que conmuta su indicador LED en el momento de
comenzar la penumbra / oscuridad y nuevamente se apaga automáticamente durante las horas diurnas con
suficiente luminosidad. Para alimentarlo todo, se emplea una batería de 6 celdas de 2200mAH con los
reguladores necesarios.

10. Calcule cuánto tiempo duraría la baliza activa suponiendo que las horas de luz del día son un mínimo
de 8 y que la batería que incorpora el dispositivo es nueva.

En media la baliza consume 70mA Æ 2200mAH/70mA=31.43 horas, como solo está encendida 16 horas
al día, la batería se gasta en 1.96 días.

You might also like