Mostrando entradas con la etiqueta Code Composer Studio. Mostrar todas las entradas
Mostrando entradas con la etiqueta Code Composer Studio. Mostrar todas las entradas

domingo, 13 de julio de 2014

F28377D, Módulo IPC (II)

Como ya os dije en la entrada anterior, una vez os expliqué por encima como funciona el sistema de mensajería entre los dos núcleos del F28377D, toca ponerlo a prueba.
He diseñado dos programas, uno para cada CPU, sencillos en los que se puede ver de forma clara como utilizar este sistema de mensajería. El programa, como he dicho es muy sencillo, la CPU1 envia un mensaje compuesto por 3 bytes, uno de comando, otro de dirección y otro de dato, una vez enviados, hace saltar la interrupción del canal 1 del IPC en la CPU2. Esta, una vez ha almacenado los datos e las variables correspondientes, le devuelve un valor, y hace que en la CPU1 salte la interrupción del canal 0 del IPC, que lee el valor devuelto. Los códigos son los siguientes:

Lo primero que hacemos en los dos núcleos es inicializarlos mediante la función InitSysCtrl(), que se encuentra en el archivo F2837xD_SysCtrl.c. En esta función se inicializa el PLL y el oscilador para obtener una velocidad de 190MHz. Después, en la CPU1 se inicializan los GPIO. Aquí, en el caso que lo necesitaramos, seria donde la CPU1 cedería el control de los GPIO correspondientes a la CPU2. En este caso no se ha hecho. Una vez hecho esto, todo lo relacionado con la inicialización del PIE i las interrupciones se hace del mimo modo que en cualquier C28. Lo siguiente es en la CPU1 preparar el mensaje que queremos mandar, escribirlo en los registros correspondientes y activar la interrupción del IPC1 en la CPU2. Mientras en esta vamos a bucle principal a esperar a que salte la interrupción. Una vez han llegado los datos, los pasamos a la variables correspondientes, y devolvemos un valor de respuesta. Para avisar a la CPU1 que hemos recibido correctamente los datos, activamos la interrupción del IPC0 en la CPU1, y este lee la respuesta.
A partir de este programa se pueden hacer otros más complejos y utilizando mas periféricos. Espero que os resulte interesante y probéis estos potentes microcontroladores.

lunes, 7 de julio de 2014

F28377D, Módulo IPC (I)

Cuando tenemos un sistema multiprocesador, en el que los núcleos tienen que compartir información, esto puede ser una desventaja, ya que, por muy potentes y rápidos que sean los procesadores, la velocidad de la comunicación siempre suele ser menor, por lo que ahí se produce lo que se llama, un cuello de botella.
Lo ideal si queremos grandes velocidades de comunicación es utilizar interfaces en paralelo, de forma que si tenemos un reloj a 10MHz, sabemos que en cada pulso de reloj, tenemos un dato completo. La desventaja de este sistema es evidente, necesitamos un bus de datos, cuyo tamaño de palabra sea lo mas parecido al de los datos que queremos enviar, ya que si es menor, necesitaremos más de un ciclo de reloj para enviar un dato. Esta comunicación, si tenemos dos procesadores independientes, debemos ocupar un buen puñado de GPIO, por lo que puede ser una gran desventaja. Para los casos en los que no disponemos de GPIO de sobra, existen las comunicaciones serie, que aunque cada vez las velocidades a las que funcionan los periféricos, nunca llegarán a la velocidad de un puerto paralelo.
Todo esto cambia cuando los dos procesadores se encuentran dentro de la misma pastilla de silicio, como es el caso de el TMS320F28377D. En este caso, Texas Instruments podía haber optado sin ningún problema por una comunicación paralelo, y el sistema hubiera funcionado bien, pero no tan bien como funciona con lo que ellos han llamado Inter Processor Communication, o periférico IPC.
Este modulo incluye un conjunto de periféricos para comunicarnos de formas diferentes entre las dos CPU. Lo primero que vemos es una memoria RAM de doble puerto. Esta memoria, en principio está controlada por la CPU1, siendo esta la unica que puede leer en ella, escribir en ella, o incluso ejecutar código desde ella, mientras que la CPU2 tan solo puede leerla. Si queremos ceder el control a la CPU2 lo podemos hacer desde el código. Esta memoria compartida, si bien esta dentro del periferico IPC, yo no la consideraría un sistema de comunicación, ya que no está destinada a mandar mensajes, sino a compartir el valor de ciertas variables. Lo que si que es indudablemente un sistema de comunicación es la memoria RAM destinada al paso de mensajes, y es esta la que voy a explicaros un poco más en profundidad en esta entrada.


Este módulo dispone de 2 bloques reservados de memoria de 2kB, a través de los cuales, mediante una seria de registros podemos intercambiar mensajes directamente. Estos 2kB si que vienen asignados a cada una de las CPU, de hecho aparecen como tal en el mapa de memoria.


El nombre de cada uno de los bloques nos dice la dirección en la que fluye la comunicación. El acceso a estos bloques de memoria se hace a través de un conjunto de registros, 8 en totoal para cada procesador, 4 para enviar datos, y 4 para recibirlos.
Los 3 primeros registros los podemos utilizar como más nos convenga, lo ideal es que nos creemos un protocolo propio de comunicaciones en el que tengamos una serie de comandos, y una serie de daros que podemos utilizar como queramos.
Por ultimo decir que desde cada una de las CPU podemos activar hasta 32 flags en la CPU remota. La mayoría de estos hemos de revisarlos periódicamente mediante polling, y solamente 4 de estos generan interrupción en la CPU remota, suficientes para poder realizar una perfecta comunicación entre los dos núcleos.
En la siguiente entrada os pondré un ejemplo de la utilización de este módulo.

sábado, 28 de junio de 2014

F28377D, programando un doble núcleo.

Hola a todos!! Hace unos meses envié un correo electrónico a Texas Instruments preguntándoles si sería posible que me mandaran uno de sus nuevos microcontroladores de la familia C2000 de doble núcleo, de forma que los pudiera probar y escribir entradas sobre ellos, sin casi ninguna esperanza ni siquiera de recibir respuesta. Para mi sorpresa, después de un par de correos más contándoles mi experiencia con microcontroladores de la familia C2000 se pusieron en contacto conmigo para darme la genial noticia de que me iban a mandar uno de esos microcontroladores, y hace una semana lo recibí calentito desde Texas Instruments!.


Estos nuevos microcontroladores son, sin duda, lo más potente que hay ahora mismo en el mercado. Internamente cuenta con dos microcontroladores de la serie delfino, cada uno con su propia unidad en punto flotante, además de 2 coprocesadores matemáticos (Control Law Acelerators), funcionando en paralelo a los principales, con lo que en total, este integrado cuenta con 4 procesadores independientes. Los dos procesadores principales pueden funcionar hasta 200MHz, por lo que haciendo funcionar los dos en paralelo alcanzamos una velocidad de 400MHz, aunque desde Texas Instruments dicen que podemos llegar hasta 880MIPS equivalentes.
Toda esta velocidad que encontramos dentro del procesador, no valdría de mucho si no somos capaces de adquirir señales del exterior también a una ata velocidad, para eso, el F28377D cuenta con 4 conversores analógico - digital que tienen dos modos de funcionamiento. Podemos hacerlos funcionar con una resolución de 16 bits, y a una velocidad de 1MSPS, lo que se traduce en 4MSPS haciendo funcionar los 4 en paralelo, o bien si necesitamos mayor velocidad, podemos sacrificar un poco la resolución bajándola a 12 bits y tendremos 3.5MSPS en cada conversor, o 14MSPS en total.
A parte de estas características, cuenta con todas las de los microcontroladores de la serie Delfino, 24 canales PWM, conversor digital - analógico de 12 bits, 4 buses SCI, 2 buses I2C, PWM de alta resolución...


Para poder gestionar los dos núcleos internos, el f28377D tiene una configuración Maestro - Esclavo, de forma que tenemos la CPU1 que es la que tiene el control, y la CPU2 está a sus ordenes. Desde la CPU1 tenemos el control de todos sus periféricos propios, como son sus temporizadores, su FPU, además del control de todos los GPIO. La CPU2, también controla todos sus periféricos propios, pero no puede controlar ningún GPIO , ni ponerse en marcha por si misma. Lo que debemos hacer es desde la CPU1, arrancar la CPU2, y de esta forma ya tenemos los dos núcleos corriendo sus propios programas. Para poder controlar los GPIO desde la CPU2, es la CPU1 la que debe ceder el control de estos, una vez hecho esto, la CPU2 tiene acceso a los pines cedidos, como si de los suyos propios se tratara.
Para que los dos Delfino puedan comunicarse entre ellos, existen un módulo IPC de comunicación. El módulo IPC (Inter Processor Communication), consta de un sistema de mensajería entre los dos procesadores, y mediante interrupciones, y una memoria SARAM compartida, de forma que cuando queramos compartir algún dato entre las CPUs, guardamos el dato en la memoria SARAM compartida, y mediante el sistema de mensajería le decimos a la otra CPU que tiene el dato disponible. Además de estos mensajes, para evitar el acceso simultaneo a una misma dirección de memoria, el sistema cuenta con un sistema de semáforos.



En cuanto a la programación, cada proyecto para el F28377D cuenta con dos proyectos independientes, uno para cada CPU. Y a la hora de programarlo, debemos programar cada uno d elos núcleos por separado, y luego arrancarlos de forma separada, en primer lugar la CPU1, y luego la CPU2. Esta secuencia de arranque es lógica si tenemos en cuenta que hasta que la CPU1 no arranque la CPU2, esta no va a hacer nada, pero sin embargo si que podemos arrancar solo la CPU1 sin utilizar la segunda. Además de las dos CPUs, también tenemos las dos CLA, las cuales cuentan con sus propio código también, que arrancamos y ejecutamos desde su CPU correspondiente.
En resumen, existen muchísimas posibilidades con este microcontrolador. En las próximas entradas os iré explicando más sobre este microcontrolador, y me gustaría hacer un par de vídeos.

lunes, 16 de junio de 2014

Primer programa con la Connected Launchpad.

En la entrada anterior os presente la nueva placa de la serie Launchpad de Texas Instruments. Esta placa monta un microcontrolador Tiva TM4C129, lo que se traduce en un ARM Cortex M4 a 120Mhz. Como ya comenté, Texas Instruments, ha facilitado mucho la programación de estas placas, lo que en principio parece una ventaja, pero no lo es tanto, ya que utilizando ese método nos abstraemos mucho del hardware con el que trabajamos, pero sin duda, la utilización de APIs hace mucho más sencilla la programación, y como dije, estas APIs son muy eficientes en cuanto a código.
Lo primero que debemos hacer para aprender a programar estas placas y familiarizarnos con las APIs, lo mejor es empezar a ver algunos ejemplos que encontramos en la colección TivaWare que podéis descargar aquí. Una vez instalado, en la carpeta de instalación tenemos muchos ejemplos para los diferentes periféricos que dispone, pero los ejemplos no son infinitos.
Por algunas razones, uno de los ejemplos que he echado en falta es el de la lectura de varios canales analógicos a una frecuencia determinada. Esto que puede parecer trivial para algunos es muy útil cuando queremos, por ejemplo realizar un control, o cuando queremos hacer un procesado de la señal.
En este ejemplo, como en todos, lo primero que debemos hacer es habilitar los periféricos que vamos a utilizar, que en nuestro caso serán los puertos digitales N y E, el Timer0, y el propio conversor analógico - digital. Esto es lo primero que debíamos hacer también cuando programábamos los STM32 de ST, y es que recordad que internamente, muy internamente, son lo mismo. Lo siguiente es empezar a configurar los perifericos, empezando por los GPIO, configurándolos como salida los que vayamos a utilizar. En segundo lugar debemos configurar el Timer0. Texas Instruments, en la serie Tiva, divide los timers en 2, TIMER_A y TIMER_B, cada uno de ellos de 16 bits. En el ejemplo solo utilizo el TIMER_A. Por último configuramos el conversor AD. Añadimos los canales 0 y 1 al secuenciador, a la cola de conversión , y le decimos que al llegar al canal 1 ha acabado y genere una interrupción.
El conversor ADC de los microcontroladores Tiva permite bastantes opciones de disparo, incluso podemos decirle que una vez ha finalizado, el mismo se genere el disparo para que lea los canales continuamente.
El código del ejemplo que he desarrollado lo teneis a continuación.


He estado buscando ejemplos un poco menos genericos y no he encontrado muchos, solo en los propios foros de TI, así que espero que este ejemplo os ayude y anime a probar con estas placas low cost.

miércoles, 4 de junio de 2014

Connected Launchpad

Hola a todos, en esta entrada os voy a presentar la ultima de las herramientas de desarrollo que ha sacado Texas Instruments para su serie Launchpad, la Connected Launchpad.
A pesar de este nuevo nombre, que abarca 2 placas de desarrollo, una de estas no es mas que la Tiva Launchpad, antes Stellaris Launchpad, a la que ahora le ha salido una hermana mayor.


Esta nueva placa monta un microcontrolador de la serie Tiva, el TM4C1294, el cual lleva un núcleo ARM Cortex M4, con todo lo que eso conlleva, es decir, 120MHz, 1MB de memoria de programa, 256KB de SRAM, 6KB de memoria E2PROM, FPU.... Además de los periféricos propios del núcleo ARM, este microcontrolador cuenta también con 2 ADC independientes de 1MSPS cada uno, a los cuales podemos asignar cualquiera de los 20 canales analógicos de los que dispone, 3 comparadores analógicos, módulo EMAC con PHY incorporado, lo cual reduce el número de componentes externos para poder utilizar la comunicación Ethernet, y un sin fin de periféricos más que harán que podamos controlar casi cualquier cosa.
La placa de desarrollo tiene el mismo color rojo de toda la serie, y lleva incorporado el programador y el depurador. A diferencia de otros Launchpad, y gracias a su tamaño, en esta herramienta es posible "pinchar" hasta 2 BoosterPack, y por si con esos 80 pines no podemos acceder a todas las entradas y salidas del microcontrolador, además disponemos de un conector en el lateral en el cual si que encontramos todos los pines.
Una de las cosas que me ha hecho decantarme por empezar con esta herramienta, y no seguir con las placas discovery de ST es que lleva un puerto RJ45, con lo que sin añadir nada más podemos crear un servidor web o cualquier otro dispositivo que se conecte a la red. Aunque no todo van a ser ventajas...


Una de las cosas que mas me gustaba de la serie discovery, y de los microcontroladores STM32 en general, es que se pueden programar como si de un PIC se tratara, es decir, miro en el datasheet el registro que quiero modificar,  gracias a las librerías que proporciona ST, puedo asignar de una forma fácil un valor concreto a un registro, incluso el compilador, gracias a la declaración de estructuras dadas por el fabricante, me sugiere los registros disponibles para modificar. Esto parece que no es del agrado de texas instruments, ya que esas estructuras y esos registros no están declaradas en ninguna librería de las que he probado, con lo que tienes que "conformarte", con utilizar las funciones o APIs que ellos te dan. Si bien, la utilización de esas APIs te hace la vida más sencilla, pero te obliga a conocerlas, mientras que los registros se encuentran en el datasheet. Ojo! que nadie se piense que esas funciones son como las de Arduino, esas APIS pueden incluso ser más optimas que la configuración directa del registro, pero si tengo que sacar un defecto a esta placa, o a TI, es ese. Por lo demás es una placa de desarrollo muy buena, bonita y barata (14 euros), ¿que mas se puede pedir?

domingo, 25 de mayo de 2014

Puente en H. Control (III)

Una vez hemos visto y entendido el hardware que forma el puente en H o puente completo llega la hora de preparar un programa para poder controlar todo lo bien que podamos la respuesta del puente completo.
Lo primero es elegir el microcontrolador que vamos a utilizar, y en esta ocasion he elegido uno de Texas Instruments, el TMS320f28027. El uso de este microcontrolador va a tener muchas ventajas, la primera de ellas es su potencia, ya que funciona a 60MIPS. La segunda de las ventajas es que, utilizando el Launchpad  C2000 tenemos este microcontrolador integrado en una placa de desarrollo, junto con un depurador por un precio de 14 euros.

Otra de las opciones que tuve en mente es utilizar un PIC de 8 bits. En concreto podría haber utilizado alguno de los que tienen módulos ECCP como el 18f2550 o el 18f14k50. El problema de estos es que no hay posibilidad de realizar una modulación como necesito, ya que estos módulos conmutan solo uno de los transistores de la rama, mientras que lo ideal es conmutar los dos de forma inversa. Esta posibilidad si que la tienen los DSPIC o los PIC24, pero no tengo ninguna placa de desarrollo que me facilite su montaje.
El programa que he escrito es algo más complicado de lo que acostumbro a poner en el blog habitualmente, pero aún así no creo que tengáis problema en entenderlo. Una novedad importante que hay en el código es que he utilizado el formato numérico en coma fija que proporciona Texas Instruments a través de la librería IQmath. Utilizando este formato numérico es mucho más sencillo agregar filtros o reguladores, ya que estos funcionan todos con la librería IQmath, de forma que no habría que hacer cambios de formato numérico a la hora de agregar estos al proyecto, directamente la salida del regulador la podríamos llevar a la variable que ajusta el ciclo de trabajo del puente. La función que establece el ciclo de trabajo está preparada para aceptar ciclos de trabajo entre -1 y 1, con una resolución de 1/2^24.
A continuación tenéis los archivos modpwm.c y modpwm.h para utilizar con estos microcontroladores y para controlar cualquier puente completo.

Espero que os sirva aunque sea de referencia para poder exportarlo a cualquier otro microcontrolador.

domingo, 2 de febrero de 2014

BOOSTXL-DRV8301 y los transistores NEXFET.

Hola a todos!! En esta entrada os quiero hablar de otro de mis regalos de reyes (esta vez no auto-regalo, sino que ha sido cosa de mi novia), y es uno de los últimos Boosterpacks oficiales de Texas Instruments para el Launchpad de la familia C2000, el BOOSTXL-DRV8301.


La placa recibe el nombre del driver que lleva montado, el DRV8301. Mediante este driver podemos atacar a las puertas de 6 transistores MOSFET de forma que podemos controlar 3 semiramas, compuestas por dos transistores cada una,  para alimentar motores BLDC. Aunque este es el propósito principal de la placa, la realidad es que tenemos 3 semipuentes que podemos controlar como nosotros queramos, ya sea para controlar motores de corriente continua, o diseñar un inversor de baja potencia para alimentar una carga en alterna. 
Además de la parte de potencia, la placa también cuenta con una instrumentación muy completa que incluye la medida de la corriente por cada una de las ramas, la tensión del bus de continua y las tensiones en cada una de las fases. 
En cuanto a la potencia que podemos obtener es de hasta 60 vatios, ya que la tensión del bus de continua se regula mediante un conversor tipo BUCK para mantenerla estable a 6 voltios, y la corriente que con capaces de conducir los transistores es de 10 amperios, aunque puede soportar hasta 14 amperios de pico, y esto es mucha corriente si tenemos en cuenta que cada transistor no ocupa mas de 5mm x 6mm.
Para hacer posible, Texas ha utilizado transistores que han sido diseñados con la tecnología NEXFET. Estos transistores viene heredados de los transistores utilizados para radio frecuencia, los cuales reducen al mínimo sus capacidades internas, por lo que las frecuencias de conmutación a las que pueden trabajar son muy elevadas (las recomendadas son de 200kHz hasta 1MHz). Además, al tener también las características de los transistores MOSFET anteriores (flujo vertical de la corriente), estas dos características unidas hacen que estos pequeños puedan soportar corrientes de mas de 100 amperios.

Pero lo que para la corriente es una ventaja, no lo es tanto para la tensión, de ahi que estos MOSFET no puedan soportar grandes tensiones drenador-surtidor.
Podéis encontrar más información sobre la tecnología NexFET aquí y aquí. 
En las próximas entradas iré alternando entre la Intel Galileo, y esta nueva placa.

lunes, 10 de diciembre de 2012

Lectura analógica en TMS320f28027

Como ya comenté en entradas anteriores, compré hace un par de meses una placa de desarrollo de Texas Instruments la cual lleva un DSP (Procesador digital de señal), de la familia c2000, en concreto lleva un f28027. No es uno DSP de los más potentes pero no está nada mal, ya que lleva en su interior un procesador de 32 bits funcionando a 60 MIPS. El punto más fuerte de este tipo de procesadores es la parte del conversor analógico-digital, ya que este DSP, sin ser de gama alta ni mucho menos lleva un CAD de 12 bits que nos permite conversiones en 6 ciclos de reloj, lo que nos da una velocidad de 10Msps, recordemos que los PIC más potentes nos dan 1,3Msps para conversiones de 10 bits, mientras que si queremos conversiones a 12 bits la velocidad baja hasta los 500ksps.
El módulo ADC de los DSP, a parte de la alta velocidad y la gran resolución nos permiten hacer hasta 2 muestras diferentes, aunque solo cuente con un CAD. Esto es posible ya que cuenta con dos circuitos de muestreo y retención, o sample and hold. Esto es muy útil por ejemplo para calcular potencias instantáneas, ya que podemos, en un momento dado medir la corriente y la tensión sin que haya diferencia de tiempo entre ambas.
Otra de las características del CAD de los DSP de texas, es que pueden hacer lecturas de forma secuencial. Esto es, existe una pila en la que nosotros ponemos por orden los canales que vamos a leer, por ejemplo, en primer lugar leeremos el canal 5, después el canal 7, después el canal 4…, cada uno de estos puede tener una señal de disparo diferente, o todos la misma, si por ejemplo los canales 5 y 4 tienen la misma señal de disparo, o trigger, el conversor leerá el canal 5 y después el 4, saltándose el 7. Esto ocurre cuando no hemos seleccionado la lectura simultánea, si está seleccionada esta, las conversiones van siempre en parejas simultáneas, es decir, el que hemos puesto en la posición 1 de la pila, con el que hemos puesto en la 2, el de la 3 con la 4 y así sucesivamente. Para poder realizar lecturas simultáneas, hay que tener en cuenta que los canales que hayamos elegido deben pertenecer a circuitos sample and hold diferentes, esto es por ejemplo que en la posición 1 de la pila esté el canal A1, y en la posición 2, el canal B4, donde A y B son cada uno de los circuitos de sample and hold de nuestro DSP.
He hablado antes de las señales de trigger, en estos DSP, como sucede en los DSPic y PIC32, la señal que inicia la conversión del conversor puede ser bien el módulo PWM, una señal de cualquier temporizador, el seteo manual de un registro, etc, y cuando esta señal se active, el conversor iniciará la conversión para aquellos canales cuyo trigger se haya activado.
El último punto que queda por configurar en el CAD de los DSP, es la ventana de muestreo que queremos para nuestra aplicación. Como he dicho, el conversor de 12 bits necesita al menos 6 ciclos de reloj para realizar la conversión, pero no siempre será suficiente con 6 ciclos, ya que habrá sensores, que por su alta impedáncia de salida, hagan que nuestro conversor con tan solo 6 ciclos no haya podido muestrear correctamente la tensión, por lo que este tiempo es configurable desde 6 ciclos hasta 64 ciclos. Dicho todo este, solo queda empezar con el código.
Para centrarnos solo en la parte que nos interesa, la parte de la inicialización del DSP la he realizado mediante las librerias que ofrece texas, por eso podeis ver en el código una instrucción que es DeviceInit(), la cual inicializa oscilador y PLL para trabajar a una frecuencia de 60MHz, así como los 4 leds y el pulsador de la placa. En cuanto a la  inicialización del módulo CAD es la siguiente:
void InitADC(){

 EALLOW;
 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1;    // ADC
 AdcRegs.ADCCTL1.bit.TEMPCONV = 1;
 EDIS;
 ADC_SOC_CNF(ChSel, TrigSel, ACQPS, 1, 0);

}
Lo primero que hacemos es llevar el reloj al modulo DAC mediante el registro ADCENCLK, después, y solo para probar que todo funciona bien, hemos conectado por software el sensor de temperatura interno del DSP con el canal A5, seteando el registro TEMPCONV. Una vez hecho esto nos queda configurar la adquisición del conversor, para ello he utilizado una instrucción que nos da texas, en la que le tenemos que meter, en primer lugarel parámetro ChSel, el cual le dice el orden de canales que queremos leer, el segundo es TrigSel, mediante el cual, para cada canal seleccionamos la señal de trigger que queremos, siendo 0 para seteo por software, 1 para el temporizador 0, 2 para el temporizador 1… como está descrito en el datasheet, el siguiente parametro es la ventana de muestreo, tambien para cada canal por separado, el siguiente parametro es el nivel de interrupción, es decir, cuantos canales queremos leer antes de que salte la interrupción, y por ultimo, el modo, en el cual podemos elegir entre lectura continua (mode = 0), lectura start – stop (mode = 1) en la cual leemos cuando se dispara el trigger. Los vectores quedarían de la siguiente manera.
// ADC configuration variables
int16 ChSel[16]={5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int16 TrigSel[16]={1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
int16 ACQPS[16]={10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10};
Donde vemos que se va a convertir el canal A5, que tendrá un trigger mediante T0, los demás, tendrán un trigger manual, por lo que si no lo activamos, nunca se leerán. La configuración del temporizador 0 es la que sigue.
void InitT0(){

 asm(" eallow"); //permiso escritura en memoria

 SysCtrlRegs.PCLKCR3.bit.CPUTIMER0ENCLK = 1; // llevamos el reloj al timer0

 CpuTimer0Regs.PRD.all = periodo; //Cargamos el valor del periodo para 100us
 CpuTimer0Regs.TCR.bit.TRB = 1; //cuando el timer llega a 0, se precarga el valor de TPR
 CpuTimer0Regs.TCR.bit.TIF = 1; //borramos el flag del timer.

 asm(" edis");

}
La variable periodo está en principio en 6000, y los preescalers están ambos en 1, nos da un periodo de 100us.
Una vez inicializados los dos módulos solo queda escribir el main, el cual es muy sencillo.
//main
void main()
{

// CONFIGURACIÓN INICIAL.
 DeviceInit();
 InitT0();
 InitADC();
  //loop
 while(1) {

  if(CpuTimer0Regs.TCR.bit.TIF == 1) { //si el temporizador ha llegado a 0...
   sampleTemp = AdcResult.ADCRESULT0;
   CpuTimer0Regs.TCR.bit.TIF = 1;
   CpuTimer0Regs.PRD.all = periodo;
  } //if
  GpioDataRegs.GPADAT.bit.GPIO1 = led;
 }// while
}//main
Con este tendremos nuestro DSP muestrando la señal analógica proveniente del sensor de temperatura interno cada 100us, la cual leemos desde el registro AdcResult.ADCRESULT0, y almacenamos en sampleTemp.

martes, 9 de octubre de 2012

Hola Mundo. TMS320F28023

Como comenté en una entrada anterior, por diversos motivos he de empezar a programar microcontroladores de la serie TMS320 de Texas Instruments. Después de varios días de lecturas e intentos tengo preparado y funcionando un pequeño programa que controla entradas y salidas digitales.
Algo que me ha llamado la atención es la controlabilidad que tiene el micro, es decir, casi todo puedes elegirlo, desde a que periféricos llega la señal de reloj, modos de bajo consumo, establecer áreas de reloj… pero todo esto no es gratis, sino que incrementa la dificultad de la programación, ya que el número de registros es enorme. En este ejemplo, a pesar de solo utilizar entradas y salidas digitales (GPIOs General Pourpose Input Output), debemos seleccionar de una forma correcta el WDOG, el oscilador utilizado, el PLL, incluso la multiplexación de los puertos, ya que, en estos micros debemos seleccionar donde está conectado cada pin entre un máximo de 3 periféricos, es decir, si utilizamos un pin para la salida de PWM debemos decírselo, al contrario que pasaba con PIC que es el micro el que lo conecta. En concreto, cada puerto de 32 bits tiene los siguientes registros:
  • GPxMUX1 y GPxMUX2: Controlan la multiplexación del pin.
  • GPxDIR: En caso de elegir GPIO, selecciona si el puerto es de entrada o salida, como el registro TRIS de los PIC.
  • GPxPUD: Seleccionamos si queremos resistencias de pull-up o no.
  • GPxDAT: Registro de estado del puerto, podemos tanto escribir como leer, aunque no es recomendable escribir desde este registro, ya os explicaré porque.
  • GPxSET, GPxCLEAR, GPxTOGGLE: Registros para poner un pin a 1 (SET), ponerlo a 0 (CLEAR) o voltearlo (TOGGLE).
Con estos registros podemos controlar el puerto por completo. Cada registro de los que he nombrado, al igual que pasaba con los PIC, está formado por estructuras, por lo que podemos controlar cada pin por separado.
Cada registro, forma parte de un gran grupo de registros como son GpioCtrlRegs, donde están los registros de control, y el GpioDataRegs, donde se encuentran los registros de datos.
El programa que he hecho, espera a que se pulse un pulsador situado en el GPIO12, y cuando este se pulsa y se suelta, se voltea el bit GPIO0.
/******************************************************
 * HOLAMUNDO EN C2K LAUNCHPAD
 *     P.TRUJILLO
 * OCTUBRE 2012

 *******************************************************/

//includes

#include "F2802x_Device.h"

//main
void main()
{

// CONFIGURACIÓN INICIAL.

      asm(" eallow");

      SysCtrlRegs.WDCR = 0x68;    //WDOG deshabilitado

      SysCtrlRegs.CLKCTL.bit.INTOSC1OFF = 0;    //activamos el oscilador interno 1
      SysCtrlRegs.CLKCTL.bit.OSCCLKSRCSEL = 0;
 
      SysCtrlRegs.PLLSTS.bit.OSCOFF = 0; //activamos el PLL
      SysCtrlRegs.PLLSTS.bit.PLLOFF = 0;
      SysCtrlRegs.PLLCR.bit.DIV = 10;
      SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;    //FOSC = 10 * 10/2 = 50MHz.

      //LED

      GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0;
      GpioCtrlRegs.GPADIR.bit.GPIO0 = 1;
      GpioDataRegs.GPASET.bit.GPIO0 = 1;

      //PULSADOR

      GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;
      GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;
      GpioCtrlRegs.GPAPUD.bit.GPIO12 = 1;

      asm(" edis");

  //loop
    while(1) {
        if(GpioDataRegs.GPADAT.bit.GPIO12 == 1) {
            while(GpioDataRegs.GPADAT.bit.GPIO12 == 1);
            GpioDataRegs.GPATOGGLE.bit.GPIO0 = 1;
        } //if
 
      }//while
 
    }//main

En las demás entradas os intentaré ir explicando cada parte del código, pero con esto espero que se os despierte la curiosidad sobre estos potentes micros de 32 bits.

miércoles, 19 de septiembre de 2012

Empezando con Texas Instruments.

Hasta ahora, en este blog, tan solo he hablado y programado de microcontroladores de microchip, desde líneas básicas como los PIC18 hasta las más avanzadas como los PIC32, pero por diversos motivos, entre otros que en la industria se encuentran muchísimo, tengo que aprender a utilizar micros de otro gigante de la electrónica como es Texas Instruments.
Hace ya un año os conté que había adquirido un módulo muy barato con un microcontrolador de TI, el MSP430, el cual llevaba el programador y el depurador integrado, esa entrada la podéis leer aquí. La verdad es que desde que lo recibí, y lo trastee un poco durante una semana no le he vuelto a hacer caso, y lo tenia ahí un poco apartado, pero hace ya 2 semanas que lo desempolvé y comencé a aprender a programar este tipo de microcontroladores, que, aunque su programación se basa, al igual que en microchip, en dar valores a los distintos registros, la arquitectura de estos (osciladores, timers, interrupciones…), es bastante diferente, y eso que se trata de un micro de gama baja con pocos periféricos, si nos vamos a micros grandes, como la familia TSM320 la cosa supongo que cambiará un poco más, y es justo esta familia la que “debo” aprender a programar, ya que es la que me piden para realizar un proyecto, y como para aprender a programar se necesita en primer lugar un dispositivo que programar, me enteré de que TI había sacado placas nuevas de bajo precio de la familia LaunchPad (misma familia de placas que la del MSP430), en concreto una que monta un micro TMS320C28027 por un precio mas que razonable, 14 euros. Este micro es de 32 bits y funciona a 60MIPS y no tiene mucho que envidiar a los famosos DSP de texas, ya que la mayor diferencia es que este no lleva FPU, pero un micro de 32 bits funcionando en coma fija sigue siendo un muy buen micro. Como en el caso del MSP430, esta placa viene con depurador y programador USB integrada.
La placa, como la anterior viene muy bien presentada, y se programa con la suite de TI Code Composer Studio en su versión 5 y existen varios Booster Packs como complemento de la placa.
Una vez estaba en a página de TI vi que había otra placa también de la serie LaunchPad en promoción por solo 4,99 dolares que al cambio son unos 3,5 euros por lo que la añadí también a mi pedido. Esta placa viene con un micro de la familia Stellaris con una arquitectura ARM Cortex M4F, como las anteriores con programador y depurador integrado, y me parece una oportunidad muy buena y barata de obtener un sistema basado en ARM, el problema es que ese precio tan solo estaba la semana pasada, y actualmente tiene un precio de 13 dolares, que aun así es muy barato para ser lo que es.
Y por ahora me despido y espero enseñaros pronto mis primeros programar con los micros de TI.