Tecnología > Electricidad y Electrónica

TUTORIAL: ATtiny 84 con avr-gcc.

<< < (2/3) > >>

Manuel:
Carlos, sobre la idea de usar macros para limpiar el código: he programado mi propia versión de estas herramientas, y los propios ficheros de cabecera estándar  tienen sus abreviaturas, como sabes: _BV(x) para (1 << x), etc. Pero creo que no encajan en una versión minimalista: demasiadas explicaciones. Estoy creando una pequeña librería de funciones útiles, pero al introducir llamadas a funciones tipo digitalRead, el código ensamblado se complica y el espacio necesario para el programa crece de 96 bytes a más de 200 bytes, por eso de los prólogos y epílogos de las llamadas a funciones. Puede forzarse a avr-gcc a hacer un inlining agresivo pero, ¿realmente vale la pena?

La idea de trabajar con el oscilador interno de 8 Mhz es muy adecuada desde un punto de vista minimalista. Intentaré introducirla en el tutorial, porque así se simplifican al máximo los requerimientos. Realmente me da repelús usar un oscilador RC para nada que no sea audio, pero eso es claramente un prejuicio personal. También pesa el que soy un speed freak, y no me conformo con menos que todos los 20 Mhz  ::) . Muchas gracias por la sugerencia  :) .

Carlos:
Gracias por el código para sacar el ensamblador. Intentaré adaptarlo al Attiny88

En cuanto al archivo de cabecera, no tiene por qué ocupar más. Simplemente renombro:
  DDRA |= (1<<5);

por:
  DDR_A.b5 = 1;

Mediante la definición de una estructura
No ocupa más y es más sencillo de entender. Microchip lo implementa así en sus compiladores.

Luego,  con un #define lo renombro otra vez a:

   PIN5 = 1;

Al final ocupa lo mismo y se compila con la misma instrucción en assembler que pone un bit a uno.

Un saludo.

Manuel:
Estoy un poco desbordado con cómo contar todo esto de manera instructiva, porque equivale a varios capítulos, pero allí va en modo preview cómo conectar un LCD a un ATtiny84. El proceso deja todavía tres pines libres, que voy a usar para un proyecto de medición de radiofrecuencia.

[youtube]gJQHkvQLJ4s[/youtube]

El código fuente es reconocible por su semejanza a Arduino:


--- Código: (Arduino) ---#include <inttypes.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <string.h>

#include "util.h"
#include "LiquidCrystal.h"

const uint8_t barra[] = "> ";
                     
int main ()
{
    int i = 0;
   
    LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
    lcd.begin(16, 2);
    lcd.write((uint8_t*) "Hello, sailor!", 14);
    lcd.setCursor(0, 1);

    while(1)
    {
        lcd.setCursor(i,2);
lcd.write(barra, 1);
delay(200);
lcd.write(&barra[1], 1);
i++;
if (i == 16) i = 0;
delay(200);
    }
}
--- Fin del código ---

La librería util.h contiene algunas definiciones para hacer el código más bonito, y LiquidCrystal.h es una adaptación a ATtiny de la librería de Arduino, eliminando la superclase Print y simplificando el código. Ha sido realmente fácil de portar. Aún queda trabajo por hacer, para que sea más agradable de usar, pero funciona perfectamente en estos momentos.

Próximamente subo en un archivo comprimido mi makefile y todos los ficheros fuente, e intentaré ir detallando poco a poco cómo generar un entorno de trabajo.

A propósito, el tamaño del archivo es:


--- Código: ---AVR Memory Usage
----------------
Device: attiny84

Program:    1384 bytes (16.9% Full)
(.text + .data + .bootloader)

Data:         24 bytes (4.7% Full)
(.data + .bss + .noinit)
--- Fin del código ---

Mucho major de lo que me atrevía a esperar.

Carlos:
Está muy bien el ejemplo.
Echo de menos algún circuito para entender cómo lo has conectado.
Yo suelo utilizar KiCad. Es opensource y muy profesional.

Tu proyecto casi ocupa todos los pines del Attiny.
Con los módulos I2C - LDC se reducen los pines a 2. El problema está en que la programación se complica bastante.

Un saludo.

Manuel:
Para experimentar de manera básica con ATtiny84 vamos a usar el siguiente montaje (pincha para aumentar):


DETALLES:

El cristal de cuarzo (20 Mhz) con los dos condensadores cerámicos (22 pF) producen un reloj de precisión para el microcontrolador. Si no tienes un cristal de 20 Mhz, cualquier otro cristal de más de 3 Mhz es válido, simplemente cambiando la opción -DF_CPU a la hora de compilar. Por ejemplo, para un cristal de 16 Mhz, debería usarse: -DF_CPU=16000000L.

¿Por qué no usar el resonador RC interno a 8 Mhz, y ahorrar así dos pines y tres componentes? En primer lugar, porque un oscilador RC tiene una estabilidad pobre y un elevado ruido de fase. Son osciladores sucios. Los osciladores RC, incluso los cerámicos, pueden ser insuficientes para varios fines prácticos. En segundo lugar, porque a mayor frecuencia extraemos mejores prestaciones del microcontrolador.

Si deseas usar el oscilador RC interno, los fuses se programan de la siguiente manera (para 8Mhz de funcionamiento sin divisor del reloj):


--- Código: ---avrdude -U lfuse:w:0xe2:m -U hfuse:w:0xdc:m -U efuse:w:0xff:m
--- Fin del código ---

esto vale para la opción -DF_CPU=8000000L.

Hemos incluido en la perfboard un regulador de voltaje LM7805, conectado a un paquete de baterías. Idealmente, debería usarse una batería de 9V para estos fines, en vez de baterías AA, puesto que el 7805 necesita un mínimo de 7V para funcionar correctamente.

La línea amarilla lleva al pin de RESET, y está conectada vía 10K al voltaje positivo.

La línea verde está conectada al PINA5 del ATTiny, y lleva a un led verde protegido por 220 Ohm, para hacer ensayos con el programa blink.

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior

Ir a la versión completa