Professional Documents
Culture Documents
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
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.
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
A continuación se muestra el programa principal, así como las variables y las definiciones de etiquetas.
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.
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.
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.
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?
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.
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.
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.
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
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:
¿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.