Sie sind auf Seite 1von 4

Programacin del LaunchPad (robot velocista, parte II) | ::: SeveroBot ...

http://iesseveroochoa.edu.gva.es/severobot/?p=94

Home (http://iesseveroochoa.edu.gva.es/severobot/) Contacta (http://iesseveroochoa.edu.gva.es/severobot/?page_id=4) Acerca de (http://iesseveroochoa.edu.gva.es/severobot/?page_id=8)


(http://iesseveroochoa.edu.gva.es/severobot/?feed=rss2)

(http://iesseveroochoa.edu.gva.es/severobot/?p=94)

(http://iesseveroochoa.edu.gva.es/severobot/?p=94&lang=en)(http://iesseveroochoa.edu.gva.es/severobot)

Home (http://iesseveroochoa.edu.gva.es/severobot) Concursos (http://iesseveroochoa.edu.gva.es/severobot/?cat=8) Descargas (http://iesseveroochoa.edu.gva.es/severobot/?cat=10) Fotos (http://iesseveroochoa.edu.gva.es/severobot/?cat=6) Hardware (http://iesseveroochoa.edu.gva.es/severobot/?cat=3) Mecnica (http://iesseveroochoa.edu.gva.es/severobot/?cat=5) Sev eroBot (http://iesseveroochoa.edu.gva.es/severobot/?cat=9) Software (http://iesseveroochoa.edu.gva.es/severobot/?cat=4) Videos (http://iesseveroochoa.edu.gva.es/severobot/?cat=7)

Programacin del LaunchPad (robot velocista, parte II)


febrero 7th, 2011 javi m En este artculo explicaremos cmo utilizar el conversor ADC del MSP430 para leer los sensores de luminosidad del robot, y el timer para generar la seal PWM que controla los motores. Qu necesitamos? La documentacin relevante para poder programar este MCU es: SLAU144 MSP430x2xx userguide.pdf (http://www.ti.com/lit/pdf/slau144) Es el ms importante, describe las generalidades de la familia MSP430. SLAS694 msp430g2231.pdf (http://focus.ti.com/lit/ds/symlink/msp430g2131.pdf) Tambin es til, describe las particularidades del modelo G2231. MSP430 Microcontroller Basics (http://www.amazon.co.uk/MSP430-Microcontroller-Basics-John-Davies/dp/0750682760/), de John Davies (ed. Newnes). Entre tanto datasheet, a veces se agradece algo de texto legible. La explicacin del funcionamiento del ADC en los MSP430 es muy buena. Una vez tengamos la documentacin, necesitamos un compilador. Hay 3 opciones: IAR Embedded Workbench Kickstart (http://www.ti.com/iarkickstart). La mejor opcin. Se instala y en 5 minutos estamos programando. Es un IDE + compilador + debugger para Windows. La versin gratuita es una demo limitada a 4 KB de cdigo, pero como el LaunchPad tiene 2 KB, nos sobra. Code Composer Studio (http://processors.wiki.ti.com/index.php/Code_Composer_Studio_v4). Tambin es un IDE + compilador + debugger. Igual que la anterior, versin demo-ilimitada. Est basada en Eclipse, as que necesita Java y mucha memoria. msp430-gcc (http://mspgcc4.sourceforge.net/) (compilador) y mspdebug (http://mspdebug.sourceforge.net/) (debugger). Es el GCC para la arquitectura MSP430. El mspdebug hace de puente entre el Launchpad y el GDB. Empezamos a programar En principio el MSP430G2231 del LaunchPad lleva todo lo que necesitamos: un ADC de 8 entradas para leer los 8 sensores, y un temporizador para generar el PWM. A la hora de elegir qu pines usamos, no hay mucho que pensar ya que los vamos a usar todos. El conversor analgico-digital slo funciona con las patas P1.0 a P1.7, as que el puerto P1 estar dedicado por completo a leer los 8 sensores de la placa QTR-8A. Para el control de los motores nos queda XIN y XOUT, que por defecto estn pensadas para conectar un reloj externo, pero se pueden convertir en GPIOs fcilmente. El primer obstculo lo encontramos cuando intentamos generar la seal PWM, ya que los pines especficos para PWM estn siendo utilizados para leer los sensores. La solucin es hacer PWM por software, pero vamos paso a paso: La funcin main() de nuestro robot velocista es algo as: 1 2 3 4 5 6 7 8 9 10 #include "msp430g2231.h" #include "intrinsics.h" void main (void) { inicializa(); prepara_adc(); __bis_SR_register(CPUOFF); }
?
(#)

El primer include importa todas las constantes y funciones especficas del MSP430G2231. En el main() simplemente inicializamos el chip, configuramos el mdulo conversor analgico-digital, y mandamos la CPU a dormir, ya que el resto del cdigo va a estar sincronizado con las interrupciones del temporizador. Veamos cmo se inicializa el MSP: Lo primero de todo es detener el watchdog, que nos reseteara el micro cada cierto tiempo si no reiniciamos su contador: 1 2 3 4 void inicializa() { // Detiene el watchdog para evitar que reinicie el micro WDTCTL = WDTPW + WDTHOLD;
?
(#)

Lo siguiente es poner el MCU a 16 MHz, su velocidad mxima. Es importante haber calibrado antes el reloj para 16 MHz, ya que de fbrica slo vienen los valores para 1 MHz! 1 2 3 // Pone el micro a 16 MHz BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ;
?
(#)

Las siguientes lneas convierten los pines P2.6 y P2.7 (XIN/XOUT) en salidas, ya que por defecto estn configuradas para conectarles un reloj externo. 1 2 3 4 // Convierte P2.6 y P2.7 en salidas P2DIR |= BIT6 | BIT7; P2SEL &= ~(BIT6 | BIT7); P2OUT &= ~(BIT6 | BIT7);
?
(#)

Configuramos el timer A en modo contnuo (MC_2), utilizando como fuente el reloj principal de 16 MHz (TASSEL_2), y activamos las interrupciones cuando el timer se desborde (TAIE). Todo esto est

1 de 4

25/02/2011 09:49 p.m.

Programacin del LaunchPad (robot velocista, parte II) | ::: SeveroBot ...

http://iesseveroochoa.edu.gva.es/severobot/?p=94

explicado en la pgina 12-20 del documento SLAU144E. El timer 2 es un temporizador de 16 bits, as que se desborda cada 65536 pasos. Como estamos usando el reloj de 16 MHz como fuente, los desbordamientos ocurrirn con una frecuencia de 16 MHz / 65536 = 244 Hz (aproximadamente). sta ser la frecuencia que usaremos para el PWM de los motores. Si quisiramos usar una frecuencia menor, podramos aadir algn flag divisor, por ejemplo con ID_1 tendramos 122 Hz. 1 2 3 // Timer A en modo continuo, reloj = 16 MHz, activa interrupciones // en desbordamiento (0xFFFF -> 0x0000), TACCR0 y TACCR1. TACTL = TASSEL_2 | MC_2 | TAIE;
?
(#)

El Timer A cuenta con 2 registros captura y compara: TACCR0 y TACCR1. Se puede configurar el micro para que haga PWM usando estos registros en unos pines determinados y sus valores determinarn el ciclo de trabajo, pero ya hemos visto que esos pines coinciden con los del conversor ADC, as que nuestra solucin es implementar el PWM por software. Es un poco farragoso, pero no imposible. Simplemente activaremos las interrupciones cada vez que el contador del timer (TAR) llegue a TACCR0/1 y encenderemos nosotros las patas de los motores a mano desde el manejador de la interrupcin: 1 2 TACCTL0 = CCIE; TACCTL1 = CCIE;
?
(#)

Ahora falta encender el bit GIE, que activa las interrupciones globalmente: 1 2 // Activa interrupciones __bis_SR_register(GIE);
?
(#)

Recapitulando, hemos configurado el Timer A para que nos despierte cuando ocurra alguna de estas 3 cosas: que el contador del timer se desborde (pase de 0xFFFF a 00000), cuando llegue a TACCR0 y cuando llegue a TACCR1. Con esto, hacer el PWM es muy sencillo: cada vez que el timer se desborda, encendemos los dos motores. Cuando llegamos a TACCR0 paramos el motor izquierdo, y cuando llegamos a TACCR1 paramos el derecho. As, variando TACCR0 y TACCR1 variamos el ciclo de trabajo de los dos motores independientemente. Cuanto ms altos sean los valores de TACCR0/1, ms rpido irn los motores. Sera algo as:
(http://iesseveroochoa.edu.gva.es/severobot/wp-content/uploads/2011/02/pwm_msp430_es.png)

La funcin prepara_adc() es tambin bastante fcil. Lo primero es decirle al MSP qu pines vamos a usar como entrada analgica activando los bits correspondientes en el registro ADC10AE0, en nuestro caso todos. Para la configuracin del ADC nos hemos basado en la explicacin del libro de John Davies (pgina 434). En la pgina 20-7 de SLAU144 tambin est explicado, pero en idioma datasheet. En pocas palabras, hay una frmula para calcular el tiempo necesario para leer una muestra, que depende de la impedancia de entrada al conversor. Como el QTR-8A tiene una resistencia de 47K en cada sensor, simplemente sustituimos ese valor en la frmula, redondeamos por exceso a una potencia de 2, y eso nos da el valor para SHT, en nuestro caso 64. El resto de flags sirven para seleccionar Vcc/Vss como referencia de muestreo (SREF_0) y encender el mdulo ADC (ADC10ON). Estn explicados en SLAU144, p. 20-24: 1 2 3 4 5 6 7 8 9 10 11 12 13 void prepara_adc() { // Desactivar los buffers I/O de los pines P1.0-7 (p.20.5) ADC10AE0 = BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5 | BIT6 | BIT7; // Davies p.434 y SLAU144E p.20-8: // Tiempo de muestreo (T) = (Rs + 2K) * ln(2048) * 27 pF. // Para Rs=47K (QTR-8A), T=10.1 us // En ciclos del reloj ADC10OSC: C = 6.3 MHz * 10.1 us = 63.6. // Redondeando por exceso hasta la siguiente opcion de SHT: 64 // Configura ADC10 para referencias Vcc/Vss, 64 ciclos, ADC on, sin ints ADC10CTL0 = SREF_0 | ADC10SHT_3 | ADC10ON; }

La configuracin del ADC se hace una sola vez al inicio del programa. Despus, cada vez que queramos leer de un sensor, hacemos: 1 2 3 4 5 6 7 8 9 10 11 int lee_adc(int canal) { // Selecciona el canal ADC10CTL1 = INCH_1 * canal; // Empieza el muestreo ADC10CTL0 |= ENC | ADC10SC; while (ADC10CTL1 & ADC10BUSY) ; ADC10CTL0 &= ~ENC; return ADC10MEM; }
?
(#)

Para entender lo que estamos haciendo, lo mejor es leerse el captulo 20 de SLAU144. Pero en resumidas cuentas, esta funcin lo que hace es: primero selecciona el canal que queremos muestrear (slo tenemos un ADC para los 8 pines, as que hay que multiplexar las lecturas). Despus, activa la conversin, y se espera en un while hasta que acabe. Este cdigo se podra mejorar bastante. Para empezar, el ADC del MSP430 tiene un modo secuencia que nos permitira leer los 8 canales uno a uno. Tambin podemos configurarlo para que nos deje los resultados en la RAM y dispare una interrupcin para avisarnos cuando ha terminado. Mientras tanto, nuestro programa principal podra seguir con sus cosas. Lo ltimo que nos queda es el cdigo de las interrupciones. Vamos a ver el manejador de la interrupcin que salta cuando el timer llega a TACCR0. Habamos dicho que cuando esto ocurre, hay que apagar el motor izquierdo, no? Pues nada ms fcil: 1 2 3 4 5 #pragma vector=TIMERA0_VECTOR __interrupt void TIMER_A0 (void) { // Este codigo se llama cuando TAR llega a TACCR0 P2OUT &= ~PIN_IZDO; };
?
(#)

La cosa se complica con la interrupcin del registro TACCR1 (CCIFG) y la interrupcin de desbordamiento (TAIFG), porque comparten el mismo vector de interrupcin. Para saber cul de las dos ha sucedido, hay que consultar el registro TAIV con ese switch tan peculiar, que aparece explicado en SLAU144, p. 12-18 y en el manual del IAR. Con esa salvedad, el cdigo es bastante obvio. Cuando salta la interrupcin de TACCR1 apagamos el motor derecho, y cuando el timer se desborda, los encendemos los 2.

2 de 4

25/02/2011 09:49 p.m.

Programacin del LaunchPad (robot velocista, parte II) | ::: SeveroBot ...

http://iesseveroochoa.edu.gva.es/severobot/?p=94

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

#pragma vector=TIMERA1_VECTOR __interrupt void TIMER_A1 (void) { switch (__even_in_range(TAIV, 10)) { // Acknowledges interrupt // CCIFG1 (cuando TAR llega a TACCR1) case TAIV_TACCR1: P2OUT &= ~PIN_DCHO; break; // TAIFG (cuando TAR se desborda 0xFFFF -> 0x0000) case TAIV_TAIFG: P2OUT |= PIN_IZDO | PIN_DCHO; break; // Activa interrupciones __bis_SR_register(GIE); // Codigo de control codigo_de_control(); } }

?
(#)

El control del robot lo haramos en la funcin codigo_de_control(). ste es el cdigo que se encargara de leer los sensores e ir variando las velocidades de los motores. Al producirse cualquier interrupcin, el MSP430 desactiva el bit GIE automticamente para evitar que se llame a un manejador recursivamente y se desborde la pila (con solo 128 bytes de RAM, no sera difcil). En nuestro caso, el cdigo de control es bastante largo y si no las activamos, las otras dos interrupciones que regulan el PWM, dejaran de funcionar correctamente. Lo importante aqu es asegurarnos que la funcin codigo_de_control() se ejecuta en menos de 65536 ciclos de reloj, porque si no desbordaremos la pila, machacaremos la RAM y colgaremos el programa. Si no nos gusta meter cdigo de control en la interrupcin, siempre podemos sacarlo al main(), pero la ventaja de hacerlo as es que tenemos sincronizacin con el ciclo de PWM gratis, y adems, cuando el micro no est haciendo nada, se pone a dormir consumiendo menos. Posted in SeveroBot (http://iesseveroochoa.edu.gva.es/severobot/?cat=9), Software (http://iesseveroochoa.edu.gva.es/severobot/?cat=4) Robot velocista basado en un MSP430 (LaunchPad). Parte I (http://iesseveroochoa.edu.gva.es/severobot/?p=85) Tutorial: cmo programar el LaunchPad con el compilador IAR (http://iesseveroochoa.edu.gva.es/severobot/?p=114) You can leave a response (#respond), or trackback (http://iesseveroochoa.edu.gva.es/severobot/wp-trackback.php?p=94) from your own site.

Leave a Reply
Name (required) Mail (will not be published) (required) Website

(http://www.addthis.com /bookmark.php?v=250&winname=addthis&pub=xa-4a65e1d93cd75e94&source=tbx-250&lng=es-ES&s=delicious&url=http%3A%2F %2Fiesseveroochoa.edu.gva.es%2Fseverobot%2F%3Fp%3D94&title=Programaci%C3%B3n%20del% 20LaunchPad%20(robot%20velocista%2C%20parte%20II)%20%7C%20%E2%80%A6 %3A%3A%3A%20SeveroBot%20%3A%3A%3A%E2%80%A6%20I.E.S.%20Severo%20Ochoa%2C%20Elche&ate=AT-xa-4a65e1d93cd75e94/-/fs-0/4d68755ef4de5715 /1&CXNID=2000001.5215456080540439074NXC&pre=http% 3A%2F %2Fwww.google.com%2Furl%3Fsa%3Dt%26source%3Dweb%26cd%3D1%26sqi%3D2%26ved%3D0CBUQFjAA%26url%3Dhttp%253A%252F%252Fiesseveroochoa.edu.gva.es%252Fseverobot%252F% 253Fp%253D9 wW0sMzZn0Gzae9fFSaQ%26cad%3Drja&tt=0) (http://www.addthis.com/bookmark.php?v=250&winname=addthis&pub=xa-4a65e1d93cd75e94&source=tbx-250&lng=es-ES&s=facebook&url=http %3A%2F%2Fiesseveroochoa.edu.gva.es%2Fseverobot%2F%3Fp%3D94&title=Programaci%C3%B3n%20del% 20LaunchPad%20(robot%20velocista%2C%20parte%20II)%20%7C%20%E2%80%A6 %3A%3A%3A%20SeveroBot% 20%3A%3A% 3A%E2%80%A6%20I.E.S.%20Severo%20Ochoa%2C%20Elche&ate=AT-xa-4a65e1d93cd75e94/-/fs-0/4d68755ef4de5715 /2&CXNID=2000001.5215456080540439074NXC&pre=http%3A%2F %2Fwww.google.com%2Furl%3Fsa%3Dt%26source%3Dweb%26cd%3D1%26sqi%3D2%26ved%3D0CBUQFjAA%26url%3Dhttp%253A%252F%252Fiesseveroochoa.edu.gva.es%252Fseverobot%252F% 253Fp%253D9 wW0sMzZn0Gzae9fFSaQ%26cad%3Drja&tt=0) (http://www.addthis.com/bookmark.php?v=250&winname=addthis&pub=xa-4a65e1d93cd75e94&source=tbx-250&lng=es-ES&s=digg&url=http%3A%2F %2Fiesseveroochoa.edu.gva.es%2Fseverobot%2F%3Fp%3D94&title=Programaci%C3%B3n% 20del%20LaunchPad%20(robot%20velocista%2C%20parte%20II)%20%7C%20%E2%80% A6%3A%3A %3A%20SeveroBot%20%3A%3A%3A%E2%80%A6%20I.E.S.%20Severo%20Ochoa%2C%20Elche&ate=AT-xa-4a65e1d93cd75e94/-/fs-0/4d68755ef4de5715 /3&CXNID=2000001.5215456080540439074NXC&pre=http%3A%2F %2Fwww.google.com%2Furl%3Fsa%3Dt%26source%3Dweb%26cd%3D1%26sqi%3D2%26ved%3D0CBUQFjAA%26url%3Dhttp%253A%252F%252Fiesseveroochoa.edu.gva.es%252Fseverobot%252F% 253Fp%253D9 wW0sMzZn0Gzae9fFSaQ%26cad%3Drja&tt=0) (http://www.addthis.com/bookmark.php?v=250&winname=addthis&pub=xa-4a65e1d93cd75e94&source=tbx-250&lng=es-ES&s=stumbleupon&url=http %3A%2F%2Fiesseveroochoa.edu.gva.es%2Fseverobot%2F%3Fp%3D94&title=Programaci%C3%B3n%20del% 20LaunchPad%20(robot%20velocista%2C%20parte%20II)%20%7C%20%E2%80%A6 %3A%3A%3A%20SeveroBot% 20%3A%3A% 3A%E2%80%A6%20I.E.S.%20Severo%20Ochoa%2C%20Elche&ate=AT-xa-4a65e1d93cd75e94/-/fs-0/4d68755ef4de5715 /4&CXNID=2000001.5215456080540439074NXC&pre=http%3A%2F %2Fwww.google.com%2Furl%3Fsa%3Dt%26source%3Dweb%26cd%3D1%26sqi%3D2%26ved%3D0CBUQFjAA%26url%3Dhttp%253A%252F%252Fiesseveroochoa.edu.gva.es%252Fseverobot%252F% 253Fp%253D9 wW0sMzZn0Gzae9fFSaQ%26cad%3Drja&tt=0)

(http://www.electan.com/catalog/index.php)

Video

3 de 4

25/02/2011 09:49 p.m.

Programacin del LaunchPad (robot velocista, parte II) | ::: SeveroBot ...

http://iesseveroochoa.edu.gva.es/severobot/?p=94

idioma

Entradas recientes
Tutorial: cmo programar el LaunchPad con el compilador IAR (http://iesseveroochoa.edu.gva.es/severobot/?p=114) Programacin del LaunchPad (robot velocista, parte II) (http://iesseveroochoa.edu.gva.es/severobot/?p=94) Robot velocista basado en un MSP430 (LaunchPad). Parte I (http://iesseveroochoa.edu.gva.es/severobot/?p=85) La licencia educativ a de Perforce (http://iesseveroochoa.edu.gva.es/severobot/?p=73) Control de versiones con Perforce. TUTORIAL (http://iesseveroochoa.edu.gva.es/severobot/?p=57)

Archivos
febrero 2011 (http://iesseveroochoa.edu.gva.es/severobot/?m=201102) enero 2011 (http://iesseveroochoa.edu.gva.es/severobot/?m=201101) Copyright ::: SeveroBot ::: I.E.S. Sev ero Ochoa, Elche (http://iesseveroochoa.edu.gva.es/severobot) - Robtica, investigacin y desarrollo. Powered by WordPress (http://wordpress.org/) | Designed by: Wordpress Themes (http://wpcorner.com) | Thanks to Wicked Buffalo (http://wickedtour.net/wicked-buffalo), David Gray Tour
(http://concerttour.org/david-gray-tour) and Chicago Bears Schedule (http://footballschedule.org/chicago-bears-schedule.php)

4 de 4

25/02/2011 09:49 p.m.