pub:dglab_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.
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:

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:

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.

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 <avr/io.h>
#include <avr/interrupt.h>
 
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<<PB1); //Pin B1 Salida
 
    // Configuracion del timer
 
    //Fast PWM mode
    TCCR1A = 1<<COM1A1 | 1<<WGM10 | 1<<WGM11; // Cambia valor de OCR1A cuando llega al valor dado
    TCCR1B = 1<<CS12 | 1<<WGM12; // Prescaler = 256
    OCR1A = 0x7FFF; // La comparacion se inicia en la mitad del recorrido del timer
 
    TIMSK1 = 1<<TOIE1; // Mascara de interrupcion. habilitamos interrupcion por overflow
    SREG |= 1<<SREG_I; // Activacion general de las interrupciones
 
    while (1) {
 
    }
 
    return 0;
}

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.

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:

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:

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:

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/dglab_avr.txt
  • Última modificación: 2020/09/28 11:44
  • (editor externo)