sábado, 12 de marzo de 2016

Primer proyecto con Atmel Studio 7


Para iniciar la programación de uC AVR necesitamos instalar la Plataforma Integrada de Desarrollo (IDP) de ATmel, me refiero al Atmel Studio 7.
Aquí el enlace para la descarga : Atmel Studio 7.0.790
Instalado el software, pasaremos a crear nuestro primer proyecto.
Una vez abierto el software, en la parte izquierda veremos la figura 1 donde debemos dar click en “New Project”.


Figura 1.image


Luego debemos seleccionar el tipo de proyecto y el lenguaje (C, C++, ASM). En este ejemplo usaremos el lenguaje C como lo vemos en la figura 2.


Figura 2.image



Una vez seleccionado el lenguaje, debemos darle un nombre al proyecto, en nuestro caso lo llamaremos “First_project” (Figura 3). El software creará una carpeta con el nombre del proyecto en la ruta “C:\Users\user\Documents\Atmel Studio”.

Figura 3.image


Ahora debemos seleccionar el dispositivo que deseamos usar, en este caso seleccionamos el ATmega32.

Figura 4.image



A la derecha de la misma ventana veremos (figura 4) veremos una lista de las herramientas de depuración y programación que se pueden usar en el microcontrolador seleccionado. También un enlace a la hoja de datos del dispositivo (Figura 5).

Figura 5.image


Luego de dar click en en botón aceptar veremos el archivo main.c tal como en la figura 6. Aquí es donde debemos escribir nuestro programa. 

Figura 6.image



En la figura 7 se muestra la aplicación desarrollada. En esta programa se tendrán dos entradas para dos pulsadores en el puerto B, y dos salidas para dos leds en el puerto D.

  • En 11 se declaran dos variables de tipo unsigned char (uint8_t) para guardar en estado actual y el estado pasado de un pin de entrada.
  • En 15 se ponen los el puerto B como entradas.
  • En 16 activamos las resistencias pull up de los pines PB0 y PB1.
  • En 17 se ponen los pines PD7 y PD3 como salidas para los led.
  • En 20 preguntamos sí el pin PB0 fue presionado
  • En 21 se pondrá a 1 el pin PD7 sí PB0 es 0. El código de la linea 22 es igual al de la linea 21.
  • En 24 se pondr’a a 0 el pin PD7 si PB0 es 1. El código de la linea 25 es igual al de la linea 24.
  • En 27 se guarda el valor anterior del pin PB1.
  • En 28 se guarda el valor actual del pin PB1.
  • En 29 se pregunta sí ocurrió un flanco de subida.
  • En 31 se conmuta, usando un xor (^), el pin PD3. El código de la linea 32 es igual al de la linea 31.

Figura 7.image


En C podemos usar el operador :?, y gracias a esto podemos reducir las lineas 20 a 25 por el código de la figura 8.



Figura 8.image



En la figura 9 se muestra la equivalencia entre un if-else y el operador :?.

Figura 9.image



Luego debemos compilar el programa usando el botón de la figura 10.

Figura 10.image


Finalmente, tendremos como salida el archivo .hex (Figura 11) para poder programar nuestro microcontrolador.

Figura 11.image



Link Proyecto




Si queremos ver la numeración de lineas en nuestro ventana de edición tenemos que ir a Tools>Options (Figura 12).
Figura 12.image


Luego en “All Languages” seleccionamos “Line numbers”  (Figura 13).

Figura 13.image

Espero este post sea útil.
Hasta la próxima.

viernes, 11 de marzo de 2016

Bootloader USBasp


Ya muchos conocemos el programador USBasp (gracias a Thomas Fischl) y lo bien que funciona este. El USBasp debe ser uno de los programadores mas conocidos para descargar código a un ATmega, esto gracias a que usa un muy económico ATmega8, que aun no teniendo puerto USB, es capaz de trabajar con una gran cantidad de dispositivos. … y lo mejor de todo: “Es gratis”.
Personalmente lo vengo usando desde el año 2010. Ahora tengo un AVRISPmk2(al parecer ya descontinuado) y un JTAGICE3 (que ya fue remplazado por el Atmel-ICE) y aún en algunas ocasiones uso mi USBasp.

Bueno, es este post mostraré cómo usar el “USBasp“  como bootloader.

Un programador USBasp consta básicamente de un ATmega8 que ha sido programado, en la sección de aplicación de su flash, con un código que permite comunicación USB (low speed 1.5Mbps) con el programador y programar otros uCs. Los anteriormente descrito se muestra en la figura 1, donde la sección de booteo del uC (ATmega8) no es usada.
 
Figura 1.image
 

Pero cuando hablamos de usar el “USBasp” cómo bootloader tendremos un esquema similar a la figura 2. Aquí, el código, “USBasp” , que realizará la comunicación con el programa en la PC (ej. AVRDUDE) es localizado en la sección de booteo de la flash, y es este código el que nos permite poner nuestra aplicación en la sección de aplicación de la flash (usando instrucciones SPM y LPM).
Es decir que no necesitaremos un programador USBasp ya que este lo tendremos integrado en el mismo uC. Lo mejor de todo es que lo podemos poner un diferentes uCs y con diferentes osciladores. Personalmente ya lo he probado con ATmega8 (a 12 y 16MHz), ATmega32(a 12 y 16MHz) y ATmega324P (a 12,16 y 20 MHz).
 
Figura 2.image
 
El hardware necesario los muestro en la figura 3. Aquí se debe tener algunas consideraciones tales como.
  • D+ debe necesariamente ir conectado al pin INT0.
  • D- puede ser cualquier pin del puerto D.
  • El jumper para iniciar el bootloader puede ser cualquier pin.

Figura 3.
image
 

En la figura 4 se muestra el diagrama del flujo del bootloader.
Despues de un reset se inicia en bootloader y este se ejecutara sí:
  • La fuente de reset es externa (MCUCSR & (1 <<  EXTRF)).
  • Si el jumper esta colocado ((PINB & (1 << JUMPER_BIT)) == 0).
En otras palabras, para ejecutar el bootloader hay que colocar el jumper y presionar el boton de reset.
Para salir del bootloader sólo hay que quitar el jumper.
 
    Figura 4.image
     

    Antes de programar el bootoalder debemos debemos modificar los siguientes fuses.
    • En High Fuse debemos seleccionar una de las secciones que tengan como mínimo 1024 words (2048 bytes) ya que el bootloader ocupa más de 1900 bytes. También debemos seleccionar “Boot Reset Enable” para que el programa inicie en la sección de booteo y no en la de aplicación. Para ATmega8 recomiendo 0xC8.
    • En Low Fuses debemos seleccionar alguna de las opciones Ext. Crystal/Resonator High Freq. Para un ATmega8 recomiendo 0xFF.



    Figura 5.
    image
     
    En la figura 6 se muestra el mapa de memoria de la sección de booteo de un ATmega8. Como ya se dijo antes, de esta usaremos mas de 1900 bytes, por ello en los fuses se seleccionará la mayor área.
     
    Figura 6.image

    SOFTWARE


    El código original lo pueden encontrar en el siguiente enlace link.
    Aquí les dejo el proyecto en ATMEL STUDIO 7 USBasp-boot. El proyecto esta configurado para un ATmega8 a 12MHz, pero puede ser cambiado facilmente a otros dispositivos.
    Las modificaciones necesarias para usarlo con otros dispositivos son las siguientes:
    • Sí se quiere usar otras frecuencias de oscilador debemos hacer el cambio en Toolchain>Symbols. Las frecuencia pueden ser de 12,15,16,18 y 20 MHz. En las figuras 7 y 8 se muestran los lugares donde se deben realizar los cambios de frecuencia.



    Figura 7.
    image



    Figura 8.
    image
     
    También debemos decirle al compilador que el código generado debe iniciar en el sección de booteo seleccionada en los High Fuses. En el ejemplo de la figura 5 se selecciono “Boot start address=0x0C00” donde 0xC00 es la dirección, en words, de inicio de la sección de booteo.
    Tenemos dos formas de reasignar el inicio del código:
    En la figura 9 se hace la reasignación usando el inicio de la dirección en words (0x0C00).
    En la figura 10 se hace la reasignación usando el inicio de la dirección en bytes (0x1800).
    Nosotros debemos seleccionar sóla una de las dos formas (Figura 9 o 10).
    Hay que tener en cuenta que 0x0C00 words = 0x1800 bytes.
     
    Figura 9.image
     
    Figura 10.image
     

    En la figura 11 se muestra parte del código generado. Aquí vemos que el inicio es en la dirección 0x1080 (para 2014 bytes). Cuando el código generado es para la sección de aplicación la dirección de inicio es 0x0000.
     
    Figura 11.image
     

    En la figura 12 se indica que el se usará PD3 para conectar D- del USB. Esto lo podemos cambiar a algún otro pin en el mismo puerto.
     
    Figura 12.image
     

    En la figura 13 se indica el pin que se usará para el jumper de inicio del bootloader. Este puede ser cualquier pin que no se esté usando.
     
    Figura 13.image


    En la figura 14 se activa la resistencia pull up correspondiente al pin del jumper.
     
    Figura 14.image
     

    En la figura 15 se evalúa la condición para permanecer o salir del área de booteo.
     
    Figura 15.image


    En los caso de la figura 14 y 15 se pueden usar el pin y el puerto que se deseé.
    Si el ATmega que queremos usar  no se encontrase en la lista de la figura 16 corresponde agregarlo con sus respectivos “SIGNATURE BYTES”.
     
    Figura 16.image
     

    El proyecto es para un ATmega8, cómo cambiamos de dispositivo ?
     
    • Damos click en l icono         image
    • Click en “Change Device…”    image
    • Seleccionamos el nuevo dispositivo.    image
    • Ya habremos cambiado nuestro nuevo dispositivo. image
    • Luego sólo queda compilar y tendremos el .hex del bootloader para poder programarlo.
    Finalmente, y cuando el bootolader se encuentre instalado, podremos usar programas como SinaProg para descargar nuestra aplicación sin afectar el bootloader.
    hay que resaltar que el bootloader no permite hacer cambio de los fuses.
    En resumen:
    1. Preparar el hardware (figura 3).
    2. Con un programador cualquiera cambiar los fuses del uC (figura 5).
    3. Hacer los cambios en el software, sólo si son requeridos: F_CPU (figuras 7 y 8), .text (figura 9 ó 10), D- (figura 12), JUMPER_BIT (figura 13), PORT/PIN JUMPER (figuras 14 y 15).
    4. Agregar un nuevo uC si falta (figura 16).

    Espero que esto les sea de utilidad, ya que no necesitar un programador puede ser muy útil.




    jueves, 3 de marzo de 2016

    Control, PID, de velocidad con ATmega



    Este post será dedicado al control de velocidad de un pequeño motor DC usando el algoritmo PID.
    El esquema general a desarrollar se muestra a continuación (Figura 1).

    Figura 1.
    pid1

    El algoritmo será implementado en un ATmega32. Este microcontrolador recibirá, por el puerto serie, órdenes desde una interfaz gráfica hecha en visual c# (Figura 2).

    El programa en la PC permitirá enviar hacia el controlador(ATmega32) el SetPoint(SP), Kp(Ganancia proporcional), Ti(Tiempo integrativo en seg) y OUT cuando se seleccione modo manual. También permitirá graficar PV, SP y OUT. PV, SP y OUT son escalados de 0 a 100.

    Figura 2.
    PID


    DEL SOFTWARE (en el controlador mega32).

    Del uC usaremos:

    • Los pines PD0 y PD1 (INT0 e INT1) para leer las salidas(A y B) del encoder tal como en un post anterior.
    • El UART para recibir, mediante interrupción, SP,Kp,Ti y OUT(en modo manual) y para enviar PV y OUT(en modo automático).
    • El Timer1 para generar una interrupción cada 100ms que permitirá ejecutar el algoritmo de control y hacer el envío de datos a la PC.
    • El Timer2 para generar una señal PWM equivalente a la salida (OUT) del controlador. La salida será por el pin PD7/OC2.

    El programa funcionará a una frecuencia de 7.3728MHz y el UART a 115200bps tal como se muestra en la figura 3.

    Figura 3.
    image


    Se usaran las uniones de la figura 4. TRAMA_t es para la recepción y envío de datos hacia/desde la PC y States_t para el manejo de los estados del encoder.

    Figura 4.
    image
    Las variables a usar son:

    Figura 5.
    image


    martes, 1 de marzo de 2016

    App Inventor + Led ATmega


    Aquí les dejo un vídeo de cómo hacer una aplicación en el app inventor.




    Los programas los pueden descargar aquí:



    Se usó un modulo HC-06, ATmega32 y un programado USBasp.

    image


    El programa envía 3 comandos: CMD1, CMD2, y CMD3.

    El CMD1 y 2 son enviados con una orden, 0 ó 1, para apagar o encender un led.
    Se envía CMD10 y CMD11 para apagar y encender un led rojo. Para el led verde se envía CMD20 y CMD21.
    También se envía el CMD3 acompañado de un número, entre 0 y 255, para cambiar la intensidad de luz de un tercer led amarillo usando PWM.
    Los tres comando llevan al final un salto de linea (\n) como fin de trama.

    El programa final se ve como en la siguiente figura:


    Screenshot_2016-03-02-01-57-30


    Breve explicación:

    Cada vez que se presione un botón BTNGreen, y si hay conexión con el modulo bluetooth, el programa enviara CMD20 ó CMD21 de acuerdo a la variable green_status. También se cambia el color y texto del botón.

    image


    miércoles, 24 de febrero de 2016

    Encoder + ATmega32


    En este post desarrollaré un programa para leer las entradas de un tipo encoder incremental en cuadratura.

    La señal en cuadratura se caracteriza por tener dos señales cuadradas que se encuentras desfasadas 90° una con respecto a la otra. Esto es mostrado en la figura “Señales del encoder”.
    El movimiento rotacional puede ser medido contando los flancos que produce cada una de las señales. La relación de fase entre las dos señales determina la dirección de rotación. Cuando en giro es horario la señal QDPH0 (Comúnmente encontrada como A) adelanta a QDPH90 (B) en 90°. En el sentido antihorario ocurre exactamente lo contrario.

    Fig. 1 Señales del encoder

    Sin título

    Para nuestro ejemplo conectaremos las salidas CLK(A) y DT(B) de un encoder, como el mostrado en Fig.2, a las entradas PD2(INT0) y PD3(INT1) de un ATmega32. El encoder y el uC son alimentado con 5Volt.

    Fig. 2 Encoder
    encoder-module-ky-040-1

    El ejemplo es muy sencillo y puede funcionar con una lectura constante (en while) de las señales A y B, usando una interrupción para la señal A ó usando dos interrupciones para las señales A y B.

    Primero, y luego de crear el proyecto, debemos declarar la velocidad del CPU (F_CPU es necesaria para las rutinas _delay…) y la del UART si fuera necesario. Aquí muestro una imagen de mi configuración.

    image


    Bueno, aquí el programa.

    Includes:
    image

    Variables a usar:

    image

    14.- Se declara una variable global del tipo int32_t (cuenta) para que almacene las cuentas del encoder. Esta tiene que ser del tipo volatile para poder usarla sin problemas en las interrupciones.
    15.- cambio las usaremos como un flag que nos indica que en valor de cuenta ha cambiado.
    16.- str[30] almacenara un string que será enviado por el puesto serie.
    18-26.- Se crea una nuevo tipo de dato(States_t) para almacenar el estado actual del encoder (S0) y el estado anterior (S1).
    27.- Se crea la variable enc que es del tipo States_t.

    domingo, 21 de febrero de 2016

    Excel, SerialPort y AVR


    En este pequeño post les presento un video donde realizo la lectura del dos sensores (fototransistor y termistor tipo ntc) mediante el ADC de un XMEGA. Los datos leidos por el ADC son enviados mediante el puerto serie y al ser recibidos son graficados en excel.





    Tener en cuenta que las modificaciones para recibir cantidades diferentes de bytes deben ser hechas en esta parte del código.  Esto dependerá del número de bytes que se desean recibir (... > 4) .






    Descarga excel y ocx

    miércoles, 22 de abril de 2015

    OBTENER DATOS DEL ADC Y TRANSMITIRLOS POR EL UART


    En este video muestro como configurar el el ADC y el UART, como obtener los datos de la conversión en sus diferentes canales y luego transmitirlos. También veremos como realizar la simulación en proteus. Todo esta escrito en C y se usa el Atmel Studio 6.2.





    Espero este video sea de utilidad. 

    Saludos.

    viernes, 15 de agosto de 2014

    FAT + SD Card + ATmega128



    En este post mostraré como usar la librería FatFs ( Generic FAT File System Module) la cual podemos encontrar en el sitio web FatFs.
    Para este fin usaremos una tarjeta de prueba con ATmega128, un adaptador para microSD, un RTC DS3231 y una tarjeta microSD Samsung de 16GB clase 10.

    Aqui el programa final : Programa

                              SKU146934b                                images
     samsungcards-m


    El ATmega128 corre con un cristal de 7.3728MHz.
    El RTC es para obtener la fecha y hora al momento de crear y modificar los archivos creados.
    El adaptador de microSD se comunica mediante SPI, tiene 6 señales (CS, MISO,MOSI,SCK,VCC y GND).
    La tarjeta fue previamente formateada con FAT32.
    En las pruebas se obtuvo velocidades de escritura de 148KB/s (más de 1Mb/s).




    viernes, 27 de junio de 2014

    MASTER SPI CON DMA – ATXMEGA

     

    En este post mostraré como usar el DMA para quitarle carga al CPU y acelerar las transferencias del SPI en modo master.
    Debemos tener en cuenta que según el manual de los XMEGA esto no es posible. “No es posible” ya que no hay un evento que pueda disparar la transferencia de datos, solo existe el evento de recepción de datos ( DMA_CH_TRIGSRC_SPIC_gc  para el SPI C).

    Pero gracias a que el DMA tiene cuatro canales y que se puede establecer prioridades de los cuatro canales es que se puede implementar la transferencia por SPI usando el DMA.



    image

    Rx y Tx son los vectores a transmitir y recibir.

    Habilitamos el DMA y establecemos la prioridad de los canales. La prioridad debe ser establecida ya que el CH0(Rx) y CH1(Tx) serán usados con el mismo evento, y debemos sacar el datos recibido antes de enviar el nuevo dato.


    image


    Configuramos el CH0 para recibir los datos por el SPIC. Los datos recibimos se guardan en Rx.


    image

    Configuramos el CH1 para transmitir los datos por el SPIC. Los datos trasmitidos se sacaran de Tx. Rx y Tx deben ser de la misma longitud. Pero TRFCNT se configura con un dato menos(desde Tx[1] hasta Tx[12]) ya que Tx[0] se usara para disparar la transferencia.