Laboratorio 7. Uso de Interrupciones y Comunicación Serial en microcontrolador MSP430. Objetivos. Estudiar y comprender el proceso de interrupciones implementado en el microcontrolador MSP430. Aprender a usar el periférico USART en modo UART, conociendo la configuración básica para transmitir y recibir datos a través de la puerta serial del microcontrolador. Monitorear a través del osciloscopio la comunicación serial. Comunicar 2 ó más microcontroladores en forma robusta utilizando la USART. Preparación previa. 1.- Interrupciones en MSP430. Existen tres tipos de interrupciones: Reset del Sistema, No enmascarables y Enmascarables. Estas últimas pueden ser habilitadas en forma general por el bit GIE del registro de estado general (SR), además de utilizar su propia habilitación dependiendo del periférico. En la tabla 1, extractada de la hoja de especificaciones del uc, con las posibles fuentes de interrupción, su tipo y su prioridad. El proceso de interrupción consiste en los siguientes pasos: Cuando una interrupción es requerida desde un periférico, y el bit de habilitación de interrupción del periférico y el bit GIE están habilitados, la rutina de servicio de interrupción es requerida. Existe una latencia de 6 ciclos de reloj, desde que se acepta un requerimiento de interrupción, hasta que la primera instrucción de la rutina de servicio es ejecutada. La lógica de la interrupción se ejecuta siguiendo los pasos descritos a continuación: 1. Cualquier instrucción que se esté ejecutando, se termina de ejecutar completamente. 2. El registro contador de programa (PC), el cuál apunta a la próxima instrucción a ejecutar, es empujado al stack. 3. El registro de estado (SR) es empujado al stack. 4. La interrupción con la más alta prioridad es seleccionada si han ocurrido múltiples interrupciones durante la última instrucción y tienen su servicio pendiente. 5. El flag de interrupción correspondiente se resetea automáticamente, cuando se trata de un solo flag. Si son múltiples flags, se mantienen seteados para ser atendidos. 6. El registro de estado (SR) es limpiado con excepción del bit SCG0, el cuál se mantiene inalterable. Esto termina cualquier modo de bajo consumo en que el uc pudiera encontrarse. 7. El contenido del vector de interrupciones correspondiente es cargado en el registro PC: el programa continua con la rutina de servicio de interrupción en dicha dirección. L. Silva B. / W. Freund G. / R. Aguilera R. Lab. 07 15-09-2004 1
El vector de interrupciones es una zona de memoria que se graba en el momento de bajar un programa al uc. Contiene las direcciones de memoria donde se encuentran almacenadas las rutinas de servicio de interrupción para cada periférico y/ó fuente de interrupción en particular. Tabla 1. Fuentes de interrupción, tipo y prioridad. 2.- Comunicación Serial Asincrónica. Se emplea para comunicar dos sistemas digitales empleando un mínimo de cables. No se transmite un reloj entre las unidades que se comunican. Esta forma de intercambio de información ha sido muy empleada y su uso está normalizado. La configuración mínima usa tres cables. Usando la norma RS-232, los nombres lógicos de las señales y su ubicación en conectores de 9 y 25 pines se ilustran en el siguiente diagrama: L. Silva B. / W. Freund G. / R. Aguilera R. Lab. 07 15-09-2004 2
DB9 3 2 5 DB25 2 3 7 DTE Tx Rx Gnd DCE Rx Tx 1 Conector Macho Cable Conector Hembra 1 Los conectores se muestran mirados de frente. El cable que conecta los dos equipos que tengan interfaz serial tiene sus propios conectores que deben sintonizar con las salidas existentes. Un uno lógico en transmisión debe ser mayor de +5 volts y menor que +15; en recepción debe estar entre +3 y +25. Un cero lógico en transmisión debe ser mayor de -15 volts y menor que -5; en recepción debe estar entre -25 y -3. A pesar que está normalizado el tipo de conector si se trata de un equipo terminal(data Terminal Equipment) o un equipo de comunicación(data Communication Equipment) es preferible efectuar pruebas para determinar cuál es el transmisor y cuál es el receptor antes de efectuar una conexión entre los dispositivos, ya que significa un riesgo eléctrico conectar dos transmisores, que suelen ser dispositivos activos. Ubicando un tester entre tierra y el pin 2 ó 3 en cada dispositivo antes de que estén conectados, puede determinarse la señal Tx, ya que ésta es una salida activa; y normalmente está en uno lógico. 3.- Comunicación Serial en el MSP430 En el MSP430 existe por lo menos un módulo USART. En el caso específico de los modelos MSP430F149 y MSP430F1612, se cuenta con dos módulos. Este módulo se puede utilizar en dos tipos de comunicación serial: como UART (comunicación asincrónica) y como SPI (comunicación sincrónica). Toda la documentación necesaria para su utilización se encuentra en el manual del usuario. Es imprescindible su lectura. En la sección de material de apoyo existe un documento donde se explica una aplicación que utiliza comunicación serial. Es recomendable su lectura para facilitar la preparación de la experiencia. Un frame de datos comienza cuando ocurre un canto de bajada, luego se envía un bit de start, con nivel bajo. Luego los 8 bits de datos, con el menos significativo(lsb) primero; y el más significativo (msb) al final. Luego termina el frame un pulso de stop en nivel alto. L. Silva B. / W. Freund G. / R. Aguilera R. Lab. 07 15-09-2004 3
lsb 1 msb 8 start stop Puede programarse un frame con uno, 1,5 ó 2 bits de stop. La paridad de la comunicación también puede ser programada. Las velocidades de transmisión se miden en baudios, que está definido como el número de bits por segundo. Las velocidades usuales son: 300, 1200, 2400, 4800, 9600, 19.200, 38.400 hasta 115.200 en algunas puertas seriales. En el Laboratorio. a) Considere el siguiente programa para realizar una transmisión de datos por la puerta serial: #include <msp430x16x.h> //Depende del uc que Ud. esté ocupando. char mensaje[10]="hola Mundo"; int i=0,j=0; void main(void) WDTCTL = WDTPW + WDTHOLD; P5SEL = 0x70; //Se dispone de los 3 relojes del sistema P5DIR = 0x70; //en los bits 4, 5 y 6 de la puerta 5 (MCLK, SMCLK y ACLK) P3SEL = 0x30; ME1 = UTXE0 + URXE0; UCTL0 = CHAR; //UTCTL0 = SSEL1; UTCTL0 = 0x10; UBR00 = 0x03; UBR10 = 0x00; UMCTL0 = 0x4A; UCTL0 &= ~SWRST; while(1) while (!(IFG1 & UTXIFG0)); TXBUF0 = mensaje[i++]; while(j<1000) j++; j=0; if (i>=10) i=0; L. Silva B. / W. Freund G. / R. Aguilera R. Lab. 07 15-09-2004 4
Mida con osciloscopio la velocidad de transferencia obtenida con el programa. Cambie el programa de manera de poder transmitir a 2400 y a 4800 bps. Mida con osciloscopio. Cambie el programa de manera de utilizar dos bits de stop. Cambie el programa para transmitir caracteres de 7 bits sin paridad a 2400 bps. Mida con osciloscopio. b) Considere el siguiente programa: #include <msp430x16x.h> #include <stdio.h> char t = 0x0; void main(void) WDTCTL = WDTPW + WDTHOLD; _EINT(); P1DIR = 0x01; P2DIR = 0x01; P3SEL = 0x30; ME1 = UTXE0 + URXE0; UCTL0 = CHAR; UTCTL0 = SSEL0; UBR00 = 0x0D; UBR10 = 0x00; UMCTL0 = 0x6B; UCTL0 &= ~SWRST; IE1 = URXIE0; while (!(IFG1 & UTXIFG0)); TXBUF0 = t; for (;;) t = getchar(); while (!(IFG1 & UTXIFG0)); TXBUF0 = t; #pragma vector=uart0rx_vector interrupt void usart0_rx (void) /*Completar*/ L. Silva B. / W. Freund G. / R. Aguilera R. Lab. 07 15-09-2004 5
Complete la rutina de servicio de interrupción serial de tal modo de imprimir en consola el carácter que se recibe y retransmitir lo que se recibe, considerando: i) Un loopback vía software. ii) Un loopback físico. c) A partir del programa disponible en la sección laboratorios, realice las siguientes actividades: Coloque la velocidad de transmisión en 4800 bps. Júntese con otro grupo de laboratorio y conecte ambos uc (Rx con Tx de cada uc). Modifique el identificador (define ID) de manera de tener identificadores distintos. Setee ID_MAX como el identificador mayor de los participantes. Coloque en los pines de la puerta 1 correspondientes 3 leds, uno para cada función (Error, Data, Control). Utilice resistencias de 1 [Kohm]. No es necesaria ninguna fuente. Asegúrese de conectar correctamente los leds. (Se dispone de Vcc en el pin 1 y de de GND en el pin 63 para probar la polaridad del led). En el diseño del programa falta completar un mecanismo de timeout. De tal manera que si la comunicación falla, se produzca una retransmisión después de aprox. 1 [s]. Utilice el timer B para estos efectos. Averigue la manera de resetear dicho timer. L. Silva B. / W. Freund G. / R. Aguilera R. Lab. 07 15-09-2004 6