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)
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.
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
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
- Podłącz USBasp
- Wybierz mikrokontroler: ATmega328P
- Wczytaj plik .hex
- 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
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)
- Project → Build options
- Zaznacz swój projekt (np. avr_test)
- Zakładka: Post-build steps
- 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"
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).
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
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
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
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.