Cariño, encogi lo Arduino: pasar de Arduino a ATtiny y escribir el código en C de AVR puro (2 / 5 paso)

Paso 2: Nuestro primer AVR C proyecto: Hola mundo, LED!

Software

El "Hola mundo" de la programación del microcontrolador es el LED que parpadea. Así que esto es justo lo que intentaremos lograr con nuestro primer programa!

Nota: Puede obtener el código completo de estos programas en mi repositorio de github. También es mucho mejor ver el código porque github ha resaltado de la sintaxis correcta.

No queremos hacer todos los pasos de compilación, enlaces, etc. a mano así que lo primero que necesitamos es un Makefile. Si utilizas Crosspack AVR en os x, puede utilizar el comando avr-proyecto en el Terminal que crea automáticamente un archivo make para nosotros (y para un proyecto de XCode que no necesitamos por lo que se puede borrar). De lo contrario, puede utilizar la siguiente plantilla para su Makefile. Tenga en cuenta que debe modificar las primeras líneas de esta plantilla para su propia configuración (es decir, establecer las variables de dispositivo y programador).

--

#
# Plantilla Makefile para ATtiny45
# Derivados de AVR Crosspack plantilla
#

DISPOSITIVO = attiny45 # ver avr-ayuda para todos los dispositivos posibles
RELOJ = 1000000 # 1Mhz
Programador = - c usbtiny -P usb # para el uso de Adafruit USBtiny
OBJETOS = main.o # añadir más objetos para cada archivo .c aquí
FUSIBLES = - U lfuse:w:0x62:m - U hfuse:w:0xdf:m - U efuse:w:0xff:m # configuración como tomado de http://www.engbedded.com/fusecalc/

AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE)
COMPILAR = avr-gcc-pared -Os-DF_CPU=$(CLOCK)-mmcu=$(DEVICE)

objetivos simbólicos #:
todos: main.hex

. co:
$(COMPILE) - c $< -o $@

. S.o:
$(COMPILE) - x ensamblador con cpp - c $< -o $@

. CS:
$(COMPILE) -S $< -o $@

Flash: todos
Flash:w:main.hex:i - U $(AVRDUDE)

fusible:
$(AVRDUDE) $(FUSES)

instalar: fusible de flash

# Si utilizas un gestor de arranque, cambiar adecuadamente el siguiente comando:
carga: todos
bootloadHID main.hex

limpiar:
RM -f main.hex main.elf $(OBJECTS)

objetivos de archivo #:
Main.ELF: $(OBJECTS)
$(COMPILE) -o main.elf $(OBJECTS)

Main.hex: main.elf
RM -f main.hex
avr-objcopy - j .text -j. Data - O ihex main.elf main.hex
AVR-tamaño - formato = avr--mcu=$(DEVICE) main.elf
# Si tiene una sección EEPROM, también debe crear un archivo hex para el
# EEPROM y agregarlo en el destino del "flash".

# Metas para depuración de código y análisis:
disasm: main.elf
avr-objdump main.elf -d

CPP:
$(COMPILE) -E main.c

--

Usted puede preguntarse, ¿qué es esto "Fusiona"? Al programar el microcontrolador con un programador establecerá algunos bits en el chip que son algún tipo de configuración inicial. Utilice esta calculadora para configurar los bits de la derecha. Con esta configuración se puede saber por ejemplo el microcontrolador a utilizar el pin RESET como pines de I/O normal (que es útil cuando tiene sólo 8 pins!).

A continuación, necesita un archivo main.c mínima que tiene este aspecto:

--

#include < avr/io.h >
int Main {}
for(;;) {
bucle principal
}
return 0;   nunca llegó a
}

--

Este programa no hace realmente nada, pero vamos a intentar compilar sin embargo. Tipo de hacer en el terminal y compilar y enlazar el programa. Incluso muestra el tamaño de su programa y cuánto ocupará en el dispositivo.
hacer llamará todos blanco de su Makefile. Hay otros objetivos importantes en su Makefile:

- limpia eliminar archivos binarios todos generados y que compile todo nuevo
- instalar transmitirá su programa al microcontrolador mediante un programador. más sobre eso más adelante

Ahora deja paso a paso crea un programa completo para dejar dos LEDs parpadean alternadamente:

En primer lugar, debemos incluir algunos encabezados para las funciones comunes de C de AVR. Se incluyeron ya avr/io.h para la dirección de I/O, que significa leer y escribir desde y hacia nuestros pins. También necesitaremos una función de "retraso" porque queremos que los LEDs parpadear durante un tiempo especificado. Esta función se incluye en util/delay.h. A continuación definimos los pines que utilizamos y el tiempo de retardo. Así las primeras líneas de nuestro programa este aspecto:

--
#include < avr/io.h >
#include < util/delay.h >

Definir pines
#define PIN_LED1 PB0
#define PIN_LED2 PB1

Definir el tiempo de retardo en ms
#define DELAY_MS 500
--

Necesitamos un ayudante macros y funciones que utilizamos a menudo (en el futuro). En AVR-C, se establece "alta" a un pin específico por escrito un registro de puerto específico usando operaciones bit a bit un bit «1». En nuestro ATtiny, sólo tenemos "PORTB" como/O-port. Cuando queremos configurar un pin "PB0" a "alto" escribimos: PORTB | = (1 << PB0);
Ajuste a "bajo" trabaja asimismo con una operación bit a bit, colocando la broca en esta posición "0" (lógico, no 1): PORTB & = ~ (1 << PB0);

Utilizamos esta información para escribir dos macros para configurar un pin en un determinado puerto "baja" o "alta". Además definimos una función que nos permite crear tiempos de demora. Es el problema con tiempos de demora, que el temporizador interno (o reloj contador) registrar voluntad desbordamiento muy rápido ya que generalmente es sólo un contador de 8 bits. Por lo tanto, definimos una función que divide nuestro retraso en trozos de 10 ms y esperar X tiempo 10 ms para obtener la larga espera.

--
escritura digital "alta" al perno < pn > Puerto < prt >
#define DIGIWRITE_H (prt, pn) prt | = (1 << pn)

escritura digital "baja" al perno < pn > Puerto < prt >
#define DIGIWRITE_L (prt, pn) prt & = ~ (1 << pn)

Definir la función de retardo largo
void long_delay_ms (uint16_t ms) {}
para (ms = 10; em > 0; ms-) _delay_ms(10);
}
--

Ahora vamos a pasar a la función main() . En primer lugar, necesitamos modificar el "registro de dirección de datos" para el puerto B, que se encuentra en la variable DDRB. Este registro indica el chip, que pines pueden obtener datos de entrada y que pines producirá un voltaje de salida. De forma predeterminada, todos los pines se establecen en la "entrada". Cuando nosotros queremos fijar ciertos pines a "salida" necesitamos establecer su registro bit a "1"

El resto es muy fácil: nosotros ahora solo llame al DIGIWRITE_L() y DIGIWRITE_H() para los pines respectivos y alternan el estado mediante el uso de un variable de palanca. Luego agregamos un tiempo de retraso.

Observe el uso de uint8_t para la variable de la palanca . Al escribir el código para chips con muy una pequeña cantidad de memoria flash, es fundamental utilizar siempre el tipo de datos más pequeño posible. Usted puede cambiar a, por ejemplo, int32_t y verás que el consumo de memoria aumenta ligeramente.

Este es el código completo de nuestro bucle principal:

--
punto de entrada del programa
int Main {}
DDRB es el "registro de dirección de datos" para el puerto B
la ATtinyX5 solo tiene puerto B con pines utilizables
Ponemos los pines del LED para la "salida"
DDRB | = (1 << PIN_LED1) | (1 << PIN_LED2);

configuración inicial de los pines a "baja"
DIGIWRITE_L (PORTB, PIN_LED1);
DIGIWRITE_L (PORTB, PIN_LED2);

bucle principal
palanca de uint8_t = 0;
for(;;) {
alternar entre los LEDs que se deje de parpadear
¿Digiwrite_l (PORTB, (palanca == 0? PIN_LED1: PIN_LED2));
¿Digiwrite_h (PORTB, (palanca == 0? PIN_LED2: PIN_LED1));

Alternave la variable palanca
palanca =! cambiar;

hacer un largo retraso
long_delay_ms(DELAY_MS);
}

return 0;   / * nunca * /
}
--

Tipo hacer para compilar el código. Generará un .hex-archivo. En el siguiente paso, voy a explicar cómo nos sube esto a nuestro ATtiny.

Artículos Relacionados

Aprende o enseña Arduino sin ninguna línea de código #1

Aprende o enseña Arduino sin ninguna línea de código #1

Parte 1: Hola mundoIntroducciónHola a todos, este es el primer tutorial de Arduino que programa sin necesidad de escribir ninguna línea de código, usando Ardublock, que es una extensión del IDE de Arduino para programación visual. Ardublock se basa e
Arduino y CueCat escáner de código de barras

Arduino y CueCat escáner de código de barras

he tenido un escáner de código de barras cuecat sentados por más de 10 años. Básicamente se conecta a un puerto PS2 (al parecer hay una version USB) como un teclado y escupe hacia fuera un código de barras cuando se analizan. Bonito!. Lo molesto es q
Arduino rfid leer y escribir en la pantalla lcd

Arduino rfid leer y escribir en la pantalla lcd

le mostrará cómo hacer arduino rfid leer y escribir en la pantalla lcdPaso 1:¡Hola!Hoy voy a mostrar cómo hacer arduino rfid leer y escribir en la pantalla lcd. Descargar el código y la carga en arduino no importa bruja uno pero prefiero uno y infidu
Robot Linefollower de Arduino y la basura - pensamientos y código

Robot Linefollower de Arduino y la basura - pensamientos y código

este linefollower terminó como falla con respecto a la competencia, pero aprendí algunas cosas que voy a compartir ahora.Si desea ver la estructura general, vaya a photoseries que postee anteriormente mientras que el edificio estaba en progreso. Info
Vidrio de Arduino - casco de realidad aumentada de código abierto

Vidrio de Arduino - casco de realidad aumentada de código abierto

¿Has pensado en conseguir un casco de realidad aumentada? ¿Fueron también asombró a la posibilidad de realidad aumentada y miró la etiqueta del precio con un corazón roto?Sí, yo también!Pero eso no me impide allí. Construí mi coraje y en su lugar, de
Cuatro canales TV falsos con Arduino o Attiny

Cuatro canales TV falsos con Arduino o Attiny

Mientras trabajaba en un simulador de "en casa" Anexo sistema de alarma, una de las cosas que quería hacer es tener un televisor encendido y de vez en cuando cambiar de canal. Por tuve un IR Led incorporado en el proyecto y fino trabajado.Sin em
Interfaz de LCD de 2 hilos para Arduino o Attiny (actualizado junio de 2016)

Interfaz de LCD de 2 hilos para Arduino o Attiny (actualizado junio de 2016)

Generalmente necesidad de 11signal líneas de LCD + 3 o 5 líneas para Vcc, tierra y contraste y en algunos casos un 2 extra de luz de fondo.Utilizando la pantalla LCD en modo de 4 bit ahorra 4 pines, pero a menudo eso no es suficiente. Aunque es posib
Aprende o enseña Arduino sin ninguna línea de código # 2

Aprende o enseña Arduino sin ninguna línea de código # 2

Hola a todos, este es el segundo tutorial de Arduino como al programa sin necesidad de escribir ninguna línea de código, usando Ardublock, que es una extensión de la IDE de Arduino para programación visual. Si es la primera vez que utilice Ardublock,
Una máquina pequeña Tea Timer (TTT) para Arduino y ATtiny

Una máquina pequeña Tea Timer (TTT) para Arduino y ATtiny

TinyTeaTimmer (TTT) es una implementación de un pequeño accesorio que fácilmente puede ser montado y programado usando un interruptor, un botón, 1 o 2 LEDs, un pequeño servo motor y una placa Arduino o un procesador ATTiny.Puede encontrar los archivo
Arduino animatronics-hacer tu vestuario impresionante más impresionante!

Arduino animatronics-hacer tu vestuario impresionante más impresionante!

Aquí es cómo agregar luces, sonido y acción a tu proyecto favorito de Halloween utilizando el microcontrolador de Arduino de código abierto. Arduino es fácil aprender a utilizar y se abre un nuevo mundo para traje constructores y creadores de la cria
Clave de acceso con arduino

Clave de acceso con arduino

~ ~ el kit completo para este tutorial ya está a la venta en www.razvantech.com conseguir uno! ~~Este instructable le mostrará cómo hacer un sistema de bloqueo de código usando la placa Arduino Mega.Cuando escriba el código adecuado, un LED se encien
Velocidad coche RC controlado con (controlador de controlador de Motor de CH 4 + Arduino + Bluetooth)

Velocidad coche RC controlado con (controlador de controlador de Motor de CH 4 + Arduino + Bluetooth)

Hola, ya que este es mi primer instructivo aquí, espero que te guste y no dude en preguntar sobre cualquier cosa no clara en él.En primer lugar, empecé este proyecto después de que quería controlar 4 motores que requiere de relativamente alta potenci
Arduino powered bluetooth remoto relé interruptor

Arduino powered bluetooth remoto relé interruptor

HiQuería construir una simple caja de interruptor remoto de bluetooth 2 canales.para poder cambiar de forma remota varios dispositivos de encendido y apagado desde mi teléfono android.El dispositivo tenía que ser pequeña fácil de usar y flexable sufi
Invernadero miniatura con arduino

Invernadero miniatura con arduino

Requisitos-Botella de refresco-humedad / sensor de temperatura-Motor servo-Arduino-caja de-Caso Arduino-bandas elásticas-cables eléctricosPaso 1: Conecte la humedad / sensor de temperatura para la botella de sodaFijar la humedad / sensor de temperatu