🛠️ Lekcja 7: Toolchain AVR – HEX, avrdude, Extreme Burner, FuseBity

Jak budować HEX, wgrywać program, ustawiać FuseBity i pracować wygodnie w Code::Blocks + USBasp.

1) Co to jest toolchain i po co go dzielimy?

Toolchain to zestaw narzędzi, które zamieniają kod w C na program działający w mikrokontrolerze. W tym kursie stosujemy podejście praktyczne: pisanie kodu oddzielamy od wgrywania. Dzięki temu masz stabilną pracę i łatwą diagnostykę błędów.

  • Code::Blocks – edycja i budowanie projektu
  • avr-gcc – kompilator C dla AVR
  • avr-objcopy – zamiana ELF → HEX
  • Extreme Burner AVR – wgrywanie HEX (GUI)
  • avrdude – wiersz poleceń (programowanie + FuseBity)
Cel lekcji Po tej lekcji potrafisz: zbudować HEX, wgrać program i bezpiecznie obsłużyć FuseBity.

2) Programator – USBasp (co trzeba kupić)

Do programowania ATmega328P w układzie „gołym” potrzebujesz zewnętrznego programatora. Najprostszy i najpopularniejszy wybór: USBasp.

  • współpracuje z Extreme Burner i avrdude,
  • obsługuje ISP (In-System Programming),
  • tani i łatwo dostępny.
Uwaga Bez USBasp (lub innego ISP) nie zaprogramujesz samego ATmega328P.

Złącza ISP: KANDA 10-pin i ISP 6-pin

USBasp może mieć złącze KANDA 10-pin i/lub przejściówkę na ISP 6-pin. Niezależnie od złącza, liczą się te same linie sygnałowe:

  • MOSI – dane do mikrokontrolera
  • MISO – dane z mikrokontrolera
  • SCK – zegar programowania
  • RESET – wejście w tryb programowania
  • VCC – zasilanie (czasem tylko referencja)
  • GND – masa
Notatka praktyczna Jeśli Twój USBasp zasila układ, to VCC idzie z programatora. Jeśli masz osobne zasilanie – VCC bywa tylko „sense”.

3) Extreme Burner AVR – wgrywanie programu (GUI)

Extreme Burner AVR to wygodny program do wgrywania plików HEX. W kursie to nasze narzędzie „codzienne”.

🔗 Link: Extreme Burner AVR – strona producenta

Typowy workflow w Extreme Burner

  1. Podłącz USBasp
  2. Wybierz mikrokontroler: ATmega328P
  3. Wczytaj plik .hex
  4. Kliknij Program (opcjonalnie Verify)

4) avrdude – narzędzie z wiersza poleceń (CLI)

avrdude daje pełną kontrolę i jest standardem w świecie AVR. Nawet jeśli wgrywasz przez GUI, warto umieć avrdude do diagnostyki i FuseBitów.

🔗 Link: avrdude – oficjalna strona projektu

Przykład: wgranie programu HEX

avrdude -c usbasp -p m328p -U flash:w:avr_test.hex
Uwaga Jeśli dostajesz błąd komunikacji: najpierw sprawdź połączenia ISP (MOSI/MISO/SCK/RESET), zasilanie i masę.

5) HEX – co to jest i skąd się bierze?

Plik .hex to tekstowy zapis danych, które mają trafić do pamięci FLASH mikrokontrolera. Kompilator tworzy najpierw plik .elf (format binarny z symbolami), a potem narzędzie avr-objcopy zamienia go na .hex.

avr-objcopy -O ihex -R .eeprom avr_test.elf avr_test.hex

6) Skrypt w Code::Blocks: automatyczne generowanie HEX (post-build)

Żeby nie robić tego ręcznie, dodajemy krok po kompilacji. Dzięki temu po kliknięciu Build zawsze dostajesz gotowy plik HEX.

Krok po kroku (Code::Blocks)

  1. Project → Build options
  2. Zaznacz swój projekt (np. avr_test)
  3. Zakładka: Post-build steps
  4. Wklej komendę (poniżej)

Komenda (wariant standardowy)

avr-objcopy -O ihex -R .eeprom avr_test.elf avr_test.hex

Jeśli Code::Blocks nie widzi avr-objcopy (pełna ścieżka)

""C:\avr-gcc-14.3_2025-12-05_mingw32\bin\avr-objcopy.exe" -O ihex -R .eeprom "$(TARGET_OUTPUT_FILE)" "$(TARGET_OUTPUT_DIR)\$(TARGET_OUTPUT_BASENAME).hex"
Efekt Po każdym Build masz plik: avr_test.hex gotowy do wgrania w Extreme Burner.

7) FuseBity – co to jest i dlaczego trzeba uważać?

FuseBity to bity konfiguracyjne mikrokontrolera. Określają m.in.:

  • źródło zegara (wewnętrzny/zewnętrzny),
  • dzielnik częstotliwości,
  • zachowanie pinu RESET,
  • zabezpieczenia (lock bits).
Ryzyko Złe FuseBity mogą spowodować, że mikrokontroler przestanie odpowiadać na zwykłe ISP. Wtedy potrzebujesz bardziej zaawansowanego programowania (np. HV).

Bezpieczny start: wewnętrzny oscylator 8 MHz

Na start najwygodniej pracować na wewnętrznym zegarze. Przykładowe ustawienie fusebitów przez avrdude:

avrdude -c usbasp -p m328p ^
-U lfuse:w:0xE2:m ^
-U hfuse:w:0xD9:m ^
-U efuse:w:0xFF:m
Notatka (Windows) Znak ^ pozwala łamać polecenie na kilka linii w CMD. Jeśli wklejasz w jednej linii – usuń ^.

Odczyt fusebitów (zawsze warto najpierw odczytać)

avrdude -c usbasp -p m328p -U lfuse:r:-:h
avrdude -c usbasp -p m328p -U hfuse:r:-:h
avrdude -c usbasp -p m328p -U efuse:r:-:h
Zasada pracy w kursie Najpierw ODCZYT, dopiero potem ZAPIS fusebitów.

8) Program testowy w C (main.c) – sprawdzenie całego toolchainu

Ten program jest minimalnym testem: kompilujesz, generujesz HEX, wgrywasz i sprawdzasz, czy LED miga. Jeśli miga – masz gotowe środowisko do całej części praktycznej kursu.

Wymaganie sprzętowe testu

  • LED + rezystor podłączone do PB0 (zmień tylko definicję, jeśli używasz innego pinu)
#include <avr/io.h>
#include <util/delay.h>

#define LED_DDR   DDRB
#define LED_PORT  PORTB
#define LED_PIN   PB0

int main(void)
{
    // PB0 jako wyjście
    LED_DDR |= (1 << LED_PIN);

    while (1)
    {
        // LED ON
        LED_PORT |= (1 << LED_PIN);
        _delay_ms(500);

        // LED OFF
        LED_PORT &= ~(1 << LED_PIN);
        _delay_ms(500);
    }
}

9) 🔄 Pełny test krok po kroku (checklista)

Wykonaj kolejno – bez skrótów. To jest Twoja procedura „startowa” na przyszłość.

  • ✅ Otwórz projekt w Code::Blocks
  • ✅ Wklej kod do main.c
  • ✅ Build projektu
  • ✅ Sprawdź, czy powstał avr_test.hex
  • ✅ Podłącz USBasp
  • ✅ Otwórz Extreme Burner
  • ✅ Wybierz ATmega328P
  • ✅ Wczytaj plik HEX
  • ✅ Program
  • ✅ LED miga
Jeśli LED miga Masz sprawne: kompilowanie, generowanie HEX i programowanie. Od następnej lekcji jedziemy praktyką.

10) Jak pracujemy w kursie (podsumowanie)

  • kod piszemy w Code::Blocks,
  • HEX tworzy się automatycznie (post-build),
  • wgrywamy program przez Extreme Burner,
  • FuseBity ustawiamy świadomie (najpierw odczyt),
  • avrdude służy też do diagnostyki, gdy GUI nie wystarczy.