You are on page 1of 5

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

DE TELECOMUNICACIÓN
DPTO. DE TECNOLOGÍA ELECTRÓNICA 26 DE ENERO DE 2009
EXAMEN DE SISTEMAS DIGITALES TIEMPO: 2 HORAS y 30 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 disponer de una red de sensores de temperatura en alta montaña implementados cada uno de
ellos sobre un MSP430 con el valor por defecto del DCO, conectando además un cristal de 32768 Hz en
la fuente LFXT1. Cada sensor deberá medir la temperatura 12 veces por hora y almacenarla en su
memoria RAM (la memoria flash sólo almacenará programa).
A continuación se muestra el código principal del sistema y la definición de variables y vectores de
interrupción.

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


; DEFINICIÓN DE VARIABLES
; ---------------------------------------------------------------- ; ----------------------------------------------------------------
; PROGRAMA PRINCIPAL ORG 0240h
; ---------------------------------------------------------------- SENSOR DS ?? 1
ORG 1500h ContadorSW DS16 1
MAIN mov #0A00h,SP cntUART DS16 1
mov #WDTPW+WDTHOLD, &WDTCTL ; TIC DS16 1
; Inicialización de modos de funcionamiento, ;periféricos TAC DS16 1
y variables . BLOQUES DS16 1
call #CONF_DISPOSITIVOS TABLA DS8 1024
call #INICIA_VBLES ; ------------------------------------------------------------------
; VECTORES DE INTERRUPCIÓN
; Modo de espera de interrupción en bajo consumo ; ------------------------------------------------------------------
ORG 0FFE0h+RESET_VECTOR
espera bis #LPM3+GIE,SR DW MAIN
nop ORG 0FFE0h+USART0TX_VECTOR
DW INT_TXUART
ORG 0FFE0h+TIMERA0_VECTOR
DW INT_TIMERA0
ORG 0FFE0h+WDT_VECTOR
DW INT_WDT

El sensor de temperatura digital posee una resolución lineal de 0.1 grados y es capaz de medir
temperaturas entre -40 y 50 grados centígrados.

1. Indique a) cuántos terminales necesita para conectar en sensor al microcontrolador y a qué terminales
podría conectarlo; b) qué valor digital correspondería a 0 grados.

10 terminales a P1 y P2, por ejemplo


0 grados = 0190h

- 1 / 5-
Finalmente, se opta por mapear en memoria el sensor en la posición SENSOR para evitar usar
puertos.

2. Indique en qué formato almacenaría un dato de temperatura en memoria y la capacidad necesaria para
almacenar los datos correspondientes a todo el invierno, que se considera de 80 días. ¿Es posible
almacenar todos estos datos en un MSP430169? Justifique su respuesta.

Como necesitamos 10 bits para codificar la temperatura el formato empleado es el formato Word.
Así, 12 muestras por hora Æ 24 bytes/h * 24 horas/dia * 80 días = 46080 bytes recogidos en todo el
invierno (45 Kbytes).
La RAM solo tiene 2Kbytes y ademas, existen posiciones ocupadas por la pila y las variables. Por lo
tanto, no cabe. Existe la posibilidad de almacenar los datos en la memoria flash, pero explícitamente en
el enunciado del examen se recoge que ésta sólo almacenará el programa.

3. Se decide emplear finalmente sólo 1 Kb de RAM para almacenar datos. Para evitar problemas, se
conecta la UART del micro a un radio-modem, que se activará lo menos posible y transmitirá todos los
datos que el sensor haya capturado desde la última transmisión a la estación base. ¿Cada cuánto tiempo
necesitaría transmitir el radio-modem para que no se perdieran datos?

12 muestras por hora Æ24 bytes/hora*x horas = 1024 bytes


x=42,6 horas

4. Configure el temporizador A y rellene su rutina de interrupción para que la temperatura se mida cada 5
minutos usando ACLK. Los datos se almacenarán en RAM a partir de la posición TABLA y asuma que
R5 se usa únicamente para desplazarse por esta tabla.

ConfTIMERA mov.w #TASSEL_?+ID_?+MC_?+TACLR, &TACTL ;Configurar TA


mov.w #TASSEL_1+ID_3+MC_1+TACLR, &TACTL
mov.w #0?h, &TACCR0 ;cuenta a 15 segundos
mov.w #0EFFFh, &TACCR0
bis ?, ? ;Habilitar interrupción CCIE0
bis #CCIE, &TACCTL0
ret

INT_TIMERA0 bic #CCIFG, &TACCTL0


inc contadorSW
cmp #0?h, contadorSW
cmp #014h, contadorSW
jnz finTIMERA0
clr contadorSW
PREGUNTA10 call #TESTEOTEMP ; Esta línea sólo es necesaria para la pregunta 10
mov.? SENSOR, 0(R5)
mov.w SENSOR,0(R5)
add.? #?, R5
add.w #2,R5
finTIMERA0 reti

- 2 / 5-
Se decide finalmente enviar los datos cada 40 horas usando el radio-modem. Su velocidad efectiva de
transmisión (quitando los bytes de carga de la trama) es de 128 bytes cada 400 ms y su consumo medio es
de 35 mA, con un consumo de pico de 50 mA. La UART funciona a la misma velocidad que el radio-
modem con una trama 8N1 (8 bits por carácter, no paridad, 1 bit de parada).

5. Configure la USART0 en modo UART para que funcione con los parámetros establecidos a partir del
reloj ACLK. Preste especial atención al generador de baudios de la UART, recordando que este SÍ que
incluye la carga de protocolo.

320 bytes segundo son 400 bytes/seg con carga y 3200 baudios para UART. Eso son BR a 10 y
modulacion.

Conf_UART0 bis.b #SWRST,&UCTL0


bis.b #BIT4+BIT5,&P3SEL
bis.b #?, &UCTL0
bis.b #CHAR, &UCTL0
mov.b #?,&UTCTL0
mov.b #SSEL0,&UTCTL0
mov.b #0?h, &UBR00
mov.b #00Ah, &UBR00
mov.b #0?h,&UBR10
mov.b #000h,&UBR10
mov.b #0?h,&UMCTL0
mov.b #088h,&UMCTL0
bis.b #?,&ME1
bis.b #UTXE0,&ME1
bic.b #?,&UCTL0
bic.b #SWRST,&UCTL0
ret

6. La rutina de inicialización del Watchdog es la que aparece a continuación ¿Cómo está configurado?
¿Qué intervalo de cuenta tiene?

Conf_WDT mov.w #WDTPW+WDTCNTCL+WDTTMSEL+WDTSSEL,&WDTCTL


bis.b #WDTIE, IE1
ret

El circuito watchdog está configurado en modo temporizador con la fuente de reloj ACK y un periodo de
cuenta de 1 segundo. La rutina de inicialización del watchdog habilita su interrupción en modo
temporizador, con lo que dicha rutina se ejecutará cada segundo.

Se sabe que la batería que alimenta todo el sistema tiene una capacidad nominal de 10 Ah y una
capacidad de pico de 60 mAh, que sólo puede mantener durante 1 segundo.

7. Para enviar la información correspondiente a 40 horas de muestras, ¿cuántos bytes tendría que
transmitir el sistema? ¿Cuántos segundos tardaría en hacerlo? Sabiendo que la batería no garantiza su
corriente de pico más de un segundo, ¿pueden enviarse todos los datos de una vez?

En 40 horas se acumulan 960 bytes que enviados a 3200 baudios nos dan 3 segundos de transmisión.
Como sólo podemos mantener la corriente de pico 1 segundo, hay que enviar en 3 veces.

- 3 / 5-
A continuación se muestra la rutina de tratamiento de la interrupción de transmisión de la UART, así
como la rutina de tratamiento del circuito Watchdog.

INT_TXUART mov.w #0141h, cntUART

bucleCNT dec cntUART


jz finUART
bucleUART bit #U0TXIFG0, IFG1
jz bucleUART
mov @R5+, TXBUF0
jmp bucleCNT
finUART bic #U0TXIE0, IE1
bis.b #WDTPW+WDTCNTCL,&WDTCTL
bic.b #WDTIFG, IFG1
reti

Rutina de tratamiento del watchdog:

INT_WDT cmp #0, BLOQUES ;variable que se inicializa a 0 al principio del programa
jnz TxBloques
inc TIC ;variable que se inicializa a 0 al principio del programa
cmp #03Ch, TIC
jnz finWDT

mov #00h, TIC


inc TAC ; variable que se inicializa a 0 al principio del programa
cmp #0960h, TAC
jnz finWDT

mov #03h, BLOQUES


bis #U0TXIE0, IE1
mov #TABLA, R5
jmp finWDT

TxBloques incd TIC


bis #U0TXIE0, IE1
dec BLOQUES
jnz finWDT
mov #00h, TAC
bic #U0TXIE0, IE1
finWDT reti

8. Indique para qué sirven la variables cntUART, TIC, TAC y BLOQUES.

cntUART indica el número de bytes que se transmiten en una ejecución de la RTI de Tx de la UART, que
corresponde con un BLOQUE. Como no se puede tener encendido radio-modem más de 1segundo los
960 bytes que se acumulan es necesario transmitirlos en 3 veces, dejando al radio-modem sin transmitir
entre bloque y bloque un determinado tiempo, que se fija a 1 segundo.

TIC es una variable auxiliar que cuenta los 60 segundos que dura un minuto, sirviendo como base para
la variable TAC.
TAC es la variable que cuenta las 40 horas tras las cuales se transmiten todas las muestras tomadas por
el sensor. Esta variable se incrementa cada vez que se cumple un minuto y se resetea cuando alcanza los
2400 minutos.
BLOQUES es la variable que permite realizar el envío de las muestras en tres bloques para que la
batería, que no es capaz de dar una corriente de pico durante más de 1 segundo, no se descargue.

9. ¿Cuándo se ejecuta la RTI de transmisión de la UART y cómo realiza el envío de los datos? ¿Para qué
sirve la RTI del watchdog y que interacción tiene con RTI de transmisión de la UART? ¿Cómo se realiza
el envío de las muestras?

- 4 / 5-
La RTI de transmisión de la UART se pone en marcha cuando la variable TAC alcanza el valor 2400 que
coincide con el periodo de 40 horas de envío de muestras. Cuando se cumplen las 40 horas después de la
última transmisión, dentro de la RTI del Watchdog se activa el flag de habilitación de interrupción de la
UART. Como el transmisor está listo para aceptar un nuevo dato, tras salir de la RTI del Watchdog se
ejecuta la RTI de la UART transmitiendo 320 bytes (0141h) por sondeo del flag que indica que el
transmisor está listo. Al salir de la RTI de la UART se deshabilita la interrupción del TX UART.
La RTI del watchdog funciona como reloj de tiempo real para medir el periodo envío de muestras hacia
la estación base de 40 horas.
Para realizar el periodo de reposo del radio-modem de 1 segundo entre bloque y bloque, la RTI de la
UART, tras la transmisión de los datos que dura 1 segundo a la velocidad de 3200 baudios, pone a 0
tanto el flag de interrupción del Watchdog, como el contador del Watchdog. Para compensar esta falta
de 1 segundo en la medida del tiempo que se está realizando, cada vez que se transmite un bloque la
variable TIC se incrementa en 2( 1 segundo de envío + 1 segundo de reposo)

10. Se incluye en el sistema una subrutina de alarma que responde al siguiente código y que se invoca
desde la línea marcada como PREGUNTA10 en el apartado 5:

TESTEOTEMP cmp #064h, SENSOR


jhs FINTESTT
mov.w R5, R4
sub.w #TABLA, R4

mov.w R4, cntUART


mov.w #MAIN,0(SP)
push SR
jmp #INT_TXUART+6
FINTESTT ret

¿Bajo qué circunstancias se activa la ALARMA? ¿Qué hace? ¿Qué problema relacionado con la batería
puede tener?

La alarma se activa si la Temperatura es menor que -30º. En este caso se determina el número de bytes
que hay almacenados en TABLA. Para ello, se realiza la resta entre la dirección a la que apunta R5,
previamente almacenada en R4, y la dirección inicio de TABLA. Este valor se introduce en la variable
cntUART, que lo que hace es determinar el número de bytes a transmitir por la UART. A continuación, se
machaca el PC, almacenado de forma automática por la subrutina TESTEOTEMP, con la dirección
inicio del programa principal y se almacena en la PILA el registro de estado actual (que está en modo
activo). Por último, se ejecuta un salto incondicional a la RTI INT_TXUART + 6, lo que hace que se salte
a la instrucción etiquetada por bucleCNT de dicha RTI, ya que la primera instrucción ocupa 6 bytes
(Código de operación + palabra operando inmediato fuente+ palabra de la dirección efectiva destino).
Con la ejecución de este código se transmiten todos los bytes que hay indicados en la variable cntUART,
que eran los recibidos hasta el momento de la alarma. El problema que existe es, que cuando se
produzca la alarma haya almacenados en TABLA un número de bytes superior a un bloque (320 bytes
que tardan en trasmitirse 1 segundo), ya que por las características de la batería no se puede garantizar
que ésta fuera capaz de dar la corriente suficiente para su transmisión completa. Tras la transmisión, se
ejecuta la instrucción RETI que hace que se salte al inicio del programa principal

- 5 / 5-