Do zrobienia prostego projektu nie potrzebujemy angażować całej maszynerii Arduino. Gdy nie potrzebujemy wielu wejść/wyjść to może dobrym wyborem jest użycie mikrokontrolerów z serii Attiny, które bez problemu można programować z pomocą języka C. Poniższy artykuł może pomóc w stworzeniu prostego projektu z użyciem Attiny (w moim przypadku Attiny85) oraz języka C, a następnie flashowaniu z pomocą Avrdude i odpowiednio przygotowanego Makefile.
Wymagania
Potrzebne jest przede wszystkim środowisko do kompilowania programów napisanych w języku C. Kiedyś takim środowiskiem było WinAVR, ale wydaje się ono dziś mocno archaiczne (ostatnie aktualizacje miało w 2010 roku). Ja wyszukałem w Google hasło "avr toolchain windows", które doprowadziło mnie do strony microchip.com z odpowiednim plikiem do pobrania. Aby pobrać toolchain należy zarejestrować się na stronie microchip.com i następnie zalogować.
Chciałem także budować za pomocą polecenia make, więc prócz przygotowania odpowiedniego pliku Makefile trzeba posiadać samo to polecenie. Najlepiej pobrać instalator środowiska MinGW, które pozwala zainstalować pakiet MSys zawierające wszystkie potrzebne polecenia.
Po instalacji tych narzędzi należy pamiętać o dodaniu odpowiednich ścieżek do zmiennej PATH
W moim przypadku wyglądało to tak:
SET PATH=%PATH%;C:\MinGW\msys\1.0\bin;C:\Apps\avr8-gnu-toolchain-win32_x86\avr\bin;\
C:\Apps\avr8-gnu-toolchain-win32_x86\bin;C:\apps\avrdude\avrdude-6.3
Budowanie
Samo Makefile znalazłem na Github'ie, zrobiłem w nim kilka drobnych modyfikacji i wygląda teraz tak:
# Makefile template for ATtiny85
# Derived from AVR Crosspack template
DEVICE = attiny85 # See avr-help for all possible devices
CLOCK = 1000000 # 1Mhz
PROGRAMMER = -c usbasp -P usb # For using USBasp
OBJECTS = main.o # Add more objects for each .c file here
EXTRA = -B 10 # Extra options : slower
# fuse settings:
# use http://www.engbedded.com/fusecalc
FUSES = -U lfuse:w:0x62:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m # 1mhz
#FUSES = -U lfuse:w:0xe2:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m # 8 Mhz
AVRDUDE = avrdude $(PROGRAMMER) -p $(DEVICE) $(EXTRA)
COMPILE = avr-gcc -Wall -Os -DF_CPU=$(CLOCK) -mmcu=$(DEVICE)
# symbolic targets:
all: main.hex
.c.o:
$(COMPILE) -c $< -o $@
flash: all
$(AVRDUDE) -U flash:w:main.hex:i
fuse:
$(AVRDUDE) $(FUSES)
install: flash fuse
clean:
rm -f main.hex main.elf $(OBJECTS)
# file targets:
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-size --format=avr --mcu=$(DEVICE) main.elf
# If you have an EEPROM section, you must also create a hex file for the
# EEPROM and add it to the "flash" target.
Tak przygotowany plik pozwala nie tylko kompilować i budować aplikację ale także zapisać fusebity oraz flashować urządzenie.
Aplikacja
Sama aplikacja to prosty kod w języku C migający diodą podpiętą pod pin PB3:#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
// Set Data Direction to output on port B, pins 2 and 3:
DDRB = 0b00001000;
while (1) {
// set PB3 high
PORTB = 0b00001000;
_delay_ms(500);
// set PB3 low
PORTB = 0b00000000;
_delay_ms(500);
}
return 1;
}
Całość można pobrać stąd.Test
Po podłączeniu programatora USBASP poprzez USB do komputera i do odpowiednich pinów mikrokontrolera dobrze jest sprawdzić czy jest komunikacja i jak są ustawione fusebity:
avrdude.exe -c usbasp -p attiny85 -U lfuse:r:-:i -v -B 10
Dodałem -B 10 by zwolnić trochę transfer (bez tej opcji były problemy z komunikacją USBASP-Attiny)
Zapis
Kolejny krok to zapis fusebitów: domyślnie Attiny jest taktowane 8MHz, ja chciałem tylko 1MHz (przy zasilaniu bateryjnym niższe taktowanie to niższe zużycie energii i tym samym dłuższa praca na bateriach):make fuseI ostatecznie kompilacja i wgranie aplikacji:
make make flash
Brak komentarzy:
Prześlij komentarz