poniedziałek, 4 maja 2020

Programowanie Attiny w języku C

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 fuse
I ostatecznie kompilacja i wgranie aplikacji:
make
make flash

Źródła

Linki którymi się posiłkowałem:

Brak komentarzy:

Prześlij komentarz