===== AVR ===== Dglab 1.0 incluye herramientas para el desarrollo con microcontroladores AVR de 8 bit de Atmel. Se integran en el entorno de desarrollo de ''Eclipse'' las siguientes herramientas: * ''gcc'': Compilador de C/C++ GNU para AVR. * ''binutils'': Utilidades binarias para AVR (assembler, linker, objcopy, objdump…). * ''libc-avr'': Subconjunto de la librería estándar de C para el desarrollo de AVR. * ''gdb'': debugger de GNU para AVR. * ''avr-dude'': utilidad de línea de comandos destinada a la programación del programa principal y los ''fuses'' o bits de configuración. ==== Ejemplo de uso ==== == Recursos necesarios == Para demostrar el funcionamiento de las herramientas AVR utilizaremos una placa de desarrollo ''Arduino UNO'', por ser común entre makers y estudiantes. Primeramente, necesitaremos conocer la disposición de pines del microcontrolador en la placa. Esta disposición puede encontrarse en: [[https://www.arduino.cc/en/uploads/Main/Arduino_Uno_Rev3-schematic.pdf|Arduino UNO Schematic]] También necesitaremos la hoja de datos del microcontrolador en cuestión. En el caso del Arduino UNO tenemos dos microcontroladores en la placa, pero utilizaremos el Atmega328p para el ejemplo. La hoja de datos correspondiente al Atmega328p puede encontrarse en el siguiente enlace: [[http://www.atmel.com/images/Atmel-8271-8-bit-AVR-Microcontroller-ATmega48A-48PA-88A-88PA-168A-168PA-328-328P_datasheet_Complete.pdf|Hoja de datos Atmega328p]] == Objetivo del diseño == El **objetivo** de este ejemplo es utilizar un temporizador que mediante interrupciones y el registro de comparación de salida del temporizador produzcan una señal PWM que vaya incrementando en ancho de pulso, y por tanto, al conectarse un led, se vea incrementar en luminosidad. Para la temporización se utilizará el ''timer1'', que corresponde a un timer de 16 bits con dos unidades de comparación de salida. Se utilizará como pin de salida el ''pin PB1'' del microcontrolador. Este pin, si observamos el esquemático del Arduino UNO, se encuentra conectado al ''pin 9'' de la placa de desarrollo. Se ha elegido el pin PB1 porque se corresponde con una de las posibles conexiones del bloque de comparación de salida del valor del timer1. == Diseño y creación del proyecto en Eclipse == Para crear el proyecto en eclipse, debemos ir al menú ''File'', hacer click sobre ''New'' y sobre ''C Project''. En el tipo de proyecto, deberemos seleccionar ''AVR Cross Target Application'', tal y como se muestra en la siguiente figura. {{ :pub:avr_crearproyecto.png?direct&450 }} Tras haber creado el proyecto, vemos que las fuentes de los ''include'' se han incorporado directamente. Estos son los componentes de la ''libc-avr''. Necesitaremos crear nuestro archivo de código. Para ello, de nuevo en ''File'', ''New'', ''Source File'', creamos un archivo llamado ''main.c''. En este archivo, debemos desarrollar nuestro código, que se muestra a continuación. /* * main.cpp * * Created on: 5/10/2015 * Author: usuario */ #include #include ISR(TIMER1_OVF_vect) { // Almacenamiento del registro de estado char cSREG = SREG; PORTB = 0x00; OCR1A = OCR1A + 8; // Restaurar el registro de estado SREG = cSREG; } int main(void) { DDRB = (1< Además del código del programa principal, es necesario especificar el chip a programar y ajustar los bits de configuración (''Fuses'') del microcontrolador. Para ello, Eclipse dispone de una interfaz gráfica para la edición de los ''Fuses'', a la que se puede acceder haciendo click derecho sobre el proyecto, en propiedades, y navegando hasta la siguiente ventana. {{ :pub:avr_settings.png?direct&600 }} En ella, podemos especificar el programador que vamos a utilizar. En el caso del ejemplo, se ha tomado el ''usb tiny''. Por otro lado, para especificar el microcontrolador, debemos desplazarnos hasta la siguiente pestaña: {{ :pub:avr_mcu_freq.png?direct&600 }} Lo más sencillo, es conectar el programador al Arduino y cargar el tipo de microcontrolador desde el propio Arduino. Además, debe especificarse en hercios la frecuencia de funcionamiento del microcontrolador. Por último, para programar los fuses, vamos a la siguiente pestaña: {{ :pub:avr_fuses.png?direct&600 }} Seleccionamos la opción ''direct hex values'' y arrancamos el editor. En esa pantalla, nos saldrá un editor para establecer los valores correctos. Una vez establecidos los fuses, el microcontrolador correcto y la frecuencia de operación del mismo (utilizada principalmente para la función Delay), construimos el proyecto y procedemos a descargarlo a nuestra placa Arduino, haciendo click en el siguiente icono: {{ :pub:avr_descargarhex.png?direct&200 }} Si recibiésemos un mensaje diciendo que no ha encontrado el archivo ''.hex'' significa que se está generando el ''.elf'' al construir el proyecto, pero no el ''.hex''. Para solventar el problema basta con entrar en la configuración y habilitar la siguiente casilla. {{ :pub:avr_generarhex.png?direct&600 }}