Mikrokontrolery i systemy embedded

BASCOM AVR – programowanie mikrokontrolerów i konfiguracja środowiska

Spis treści
BASCOM AVR – programowanie mikrokontrolerów i konfiguracja środowiska

BASCOM-AVR to popularne środowisko do programowania mikrokontrolerów AVR w języku BASIC. Łączy przystępną składnię z rozbudowaną obsługą peryferiów oraz zintegrowanymi narzędziami do kompilowania, symulowania i programowania układów.

Czym jest BASCOM-AVR?

BASCOM-AVR to zintegrowane środowisko programistyczne przeznaczone do programowania mikrokontrolerów z rodziny AVR w języku BASIC. Układy te zostały opracowane przez firmę Atmel, która obecnie jest częścią Microchip Technology.

Do najważniejszych cech środowiska należą:

  • IDE dla systemu Windows – łączy edytor kodu, kompilator, programator, symulator i podstawowe narzędzia diagnostyczne;
  • przystępny język BASCOM – wykorzystuje składnię zbliżoną do klasycznego języka BASIC, dzięki czemu ułatwia rozpoczęcie pracy osobom bez doświadczenia w C;
  • rozbudowane biblioteki sprzętowe – zawiera gotowe funkcje do obsługi portów wejścia i wyjścia, przetwornika ADC, interfejsu UART, pamięci EEPROM oraz innych peryferiów;
  • obsługa wielu rodzin AVR – pozwala programować między innymi układy ATtiny, ATmega i wybrane modele ATxmega;
  • współpraca z płytkami Arduino – umożliwia programowanie wielu modeli wyposażonych w klasyczne mikrokontrolery AVR, takich jak Arduino Uno i Arduino Nano.

BASCOM-AVR może być pomostem między prostym językiem wysokiego poziomu a bezpośrednim sterowaniem sprzętem.

Obsługiwane mikrokontrolery i zastosowania

BASCOM-AVR obsługuje wiele popularnych mikrokontrolerów AVR — od niewielkich układów ATtiny po bardziej rozbudowane modele ATmega i wybrane układy ATxmega.

Typowe zastosowania środowiska obejmują:

  • sterowniki i panele HMI z wyświetlaczami LCD oraz klawiaturami,
  • proste roboty i układy mechatroniczne,
  • systemy pomiarowe wykorzystujące ADC, UART lub USB,
  • sterowanie oświetleniem i automatyką domową,
  • projekty edukacyjne i hobbystyczne.

Aktualna lista obsługiwanych mikrokontrolerów jest dostępna w środowisku programistycznym oraz dokumentacji producenta. Obejmuje szeroki wybór układów AVR i współpracujących z nimi programatorów.

Wymagania systemowe i licencje

Przed instalacją warto sprawdzić wymagania programu oraz różnice między dostępnymi licencjami:

  • system operacyjny – BASCOM-AVR jest aplikacją przeznaczoną dla systemu Windows;
  • wersja demonstracyjna – jest bezpłatna, ale ogranicza rozmiar generowanego programu; zazwyczaj wystarcza do nauki i realizacji prostych projektów;
  • wersja komercyjna – zapewnia pełną funkcjonalność i nie nakłada limitu rozmiaru generowanego kodu właściwego dla wersji demonstracyjnej.

Wersja demonstracyjna dobrze nadaje się do nauki oraz tworzenia prostych sterowników LED i projektów wykorzystujących UART. Przy bardziej rozbudowanych aplikacjach warto rozważyć zakup pełnej wersji.

Instalacja BASCOM-AVR krok po kroku

Instalację i pierwsze uruchomienie można przeprowadzić w kilku etapach:

  1. Pobierz instalator. Wybierz najnowszą dostępną wersję demonstracyjną lub komercyjną BASCOM-AVR.
  2. Wybierz katalog instalacji. Zainstaluj program w lokalizacji, do której użytkownik ma prawo zapisu, na przykład C:\bascavr. Ułatwi to aktualizowanie aplikacji i zapisywanie plików tymczasowych.
  3. Zainstaluj wymagane sterowniki. Jeśli instalator lub używany programator tego wymaga, uruchom instalację z uprawnieniami administratora.
  4. Sprawdź działanie środowiska. Utwórz projekt, zapisz go, a następnie skompiluj prosty program testowy.

Pierwsza konfiguracja środowiska

Po instalacji należy wybrać docelowy mikrokontroler oraz skonfigurować sposób przesyłania programu do układu.

Wybór mikrokontrolera

W menu, zazwyczaj w sekcji Options → Chip, wybierz rodzinę mikrokontrolera, taką jak ATtiny, ATmega lub ATxmega, a następnie konkretny model, na przykład ATmega8, ATmega16 albo ATmega328P.

Wybrany układ określa między innymi:

  • dostępne peryferia, takie jak ADC, UART i liczniki,
  • rozmiar pamięci Flash, RAM i EEPROM,
  • dostępne rejestry oraz źródła przerwań.

Konfiguracja programatora

W menu Options → Programmer wybierz urządzenie używane do przesyłania kodu do mikrokontrolera. BASCOM-AVR może obsługiwać programator bezpośrednio albo uruchamiać aplikację zewnętrzną, taką jak AVRDUDE.

Najczęściej spotykane rozwiązania to:

  • USBasp – popularny programator USB ISP;
  • JTAG ICE i debugWIRE – interfejsy służące do programowania i debugowania wybranych układów;
  • bootloader – umożliwia programowanie mikrokontrolera przez UART lub USB bez używania klasycznego programatora ISP;
  • programator LPT – historyczne rozwiązanie ISP korzystające z portu równoległego, nadal spotykane w starszych projektach edukacyjnych.

Konfiguracja programatora w praktyce

Klasyczny programator ISP na LPT

W starszych poradnikach można znaleźć prosty programator ISP podłączany do portu równoległego LPT. Taki układ składa się zwykle z gniazda DB25, kilku rezystorów i przewodów.

Konfiguracja takiego programatora przebiega następująco:

  1. Skonfiguruj port LPT w BIOS-ie. W zależności od konstrukcji programatora może być wymagany określony tryb pracy portu, na przykład ECP.
  2. Podłącz programator. Połącz linie portu LPT z sygnałami ISP mikrokontrolera: MOSI, MISO, SCK i RESET. Pamiętaj również o połączeniu masy programatora z masą układu.
  3. Skonfiguruj BASCOM-AVR. W menu Options → Programmer wybierz typ programatora zgodny z używanym interfejsem i sprawdź adres portu LPT.
  4. Przetestuj połączenie. Włącz zasilanie mikrokontrolera i użyj funkcji Chip → Identify, aby sprawdzić, czy układ jest prawidłowo wykrywany.

USBasp jako programator zewnętrzny

USBasp jest popularnym programatorem ze względu na prostą konstrukcję i obsługę przez wiele narzędzi. BASCOM-AVR może współpracować z programem AVRDUDE, uruchamianym z odpowiednimi parametrami wiersza poleceń.

Konfigurację można przeprowadzić w trzech krokach:

  1. w oknie Options → Programmer wybierz opcję External programmer,
  2. wskaż plik wykonywalny programu AVRDUDE,
  3. wprowadź parametry wywołania odpowiednie dla programatora i mikrokontrolera.

Przykładowe parametry dla mikrokontrolera ATmega8 wyglądają następująco:

-p m8 -c usbasp -U flash:w:demo.hex

Polecenie wskazuje układ ATmega8, programator USBasp oraz plik demo.hex, który ma zostać zapisany w pamięci Flash.

W konfiguracji BASCOM-AVR można zastosować następujący wzorzec:

-p m8 -c usbasp -U flash:w:"{FILE}":a

Wartość {FILE} jest automatycznie zastępowana ścieżką do aktualnie wygenerowanego pliku HEX.

Należy zaznaczyć opcję „Use HEX file”, aby BASCOM-AVR wygenerował plik HEX i przekazał go do zewnętrznego programatora.

Dodawanie innych programatorów

Niestandardowy programator, na przykład wbudowany w płytkę ewaluacyjną, można skonfigurować za pomocą opcji Options → Programmer → Other. Należy wskazać plik wykonywalny aplikacji odpowiedzialnej za fizyczne programowanie mikrokontrolera.

W ten sposób można uruchamiać zewnętrzne narzędzia obsługujące różne interfejsy programujące. BASCOM-AVR przekazuje im plik wynikowy oraz zdefiniowane parametry.

Struktura programu w BASCOM-AVR

Typowy program w BASCOM-AVR zawiera następujące elementy:

  • deklaracje – instrukcje takie jak Dim i Declare, służące do definiowania zmiennych oraz procedur;
  • konfigurację – instrukcje rozpoczynające się od słowa Config, odpowiedzialne za ustawienie portów i peryferiów;
  • dyrektywy kompilatora – polecenia rozpoczynające się od znaku dolara, używane między innymi do wyboru mikrokontrolera i częstotliwości zegara.

Podstawowa struktura programu może wyglądać tak:

$regfile = "m8def.dat" ' Plik definicji mikrokontrolera
$crystal = 8000000 ' Częstotliwość oscylatora: 8 MHz

Config Portb = Output ' Port B jako wyjście
Dim I As Byte ' Deklaracja zmiennej

Do
Portb = &B00000001
Waitms 500
Portb = &B00000000
Waitms 500
Loop

Najważniejsze elementy przykładu to:

  • dyrektywa $regfile – wskazuje plik z definicjami wybranego mikrokontrolera, w tym przypadku ATmega8;
  • dyrektywa $crystal – określa częstotliwość taktowania potrzebną do prawidłowego działania funkcji czasowych i interfejsu UART;
  • instrukcja Config – konfiguruje porty i peryferia;
  • instrukcja Dim – deklaruje zmienne używane w programie.

Podstawy języka BASCOM

Deklaracje i typy danych

Do najczęściej używanych typów danych należą:

  • Byte – 8-bitowa liczba całkowita bez znaku;
  • Integer – 16-bitowa liczba całkowita ze znakiem;
  • Word – 16-bitowa liczba całkowita bez znaku;
  • Long – 32-bitowa liczba całkowita;
  • Single – liczba zmiennoprzecinkowa pojedynczej precyzji.

Zmienne deklaruje się za pomocą instrukcji Dim:

Dim Licznik As Byte
Dim Temperatura As Integer

Dyrektywy kompilatora

Dyrektywy rozpoczynające się od znaku $ sterują pracą kompilatora. Do najważniejszych należą:

  • dyrektywa $regfile – wybiera plik definicji mikrokontrolera;
  • dyrektywa $crystal – określa częstotliwość zegara mikrokontrolera;
  • dyrektywy $hwstack, $swstack i $framesize – określają rozmiary stosów oraz obszaru ramek;
  • dyrektywa $baud – ustawia prędkość transmisji interfejsu UART.

Konfiguracja portów wejścia i wyjścia

Porty mikrokontrolera można skonfigurować jako wejścia lub wyjścia:

Config Porta = Input
Config Portb = Output

Przykładowe operacje na portach wyglądają następująco:

Portb.0 = 1 ' Ustawienie bitu 0 portu B
Portb = &B10101010

If Pina.1 = 1 Then
' Reakcja na wysoki stan wejścia
End If

BASCOM-AVR udostępnia instrukcje wysokiego poziomu, a jednocześnie umożliwia bezpośrednią zmianę stanu pojedynczych bitów portów.

Obsługa liczników i opóźnień

Do odmierzania czasu można wykorzystać następujące mechanizmy:

  • instrukcje Wait, Waitms i Waitus,
  • sprzętowe liczniki i timery mikrokontrolera,
  • przerwania wywoływane w określonych odstępach czasu.

Prosty program migający diodą może korzystać z instrukcji Waitms. W bardziej wymagających aplikacjach lepiej użyć sprzętowego timera, ponieważ oczekiwanie blokujące zatrzymuje wykonywanie pozostałej części programu.

Obsługa peryferiów w BASCOM-AVR

Jedną z głównych zalet BASCOM-AVR są gotowe instrukcje i biblioteki upraszczające obsługę peryferiów mikrokontrolera.

Przetwornik analogowo-cyfrowy

Konfigurację przetwornika ADC upraszczają instrukcje Config oraz funkcje odczytu. Można określić tryb pracy, źródło napięcia odniesienia i preskaler, a następnie zapisywać wyniki pomiarów bezpośrednio w zmiennej.

Przykładowa konfiguracja i odczyt kanału ADC wyglądają tak:

Config Adc = Single , Prescaler = Auto , Reference = Avcc
Start Adc

Dim Wynik As Word

Do
Wynik = Getadc(0) ' Odczyt kanału 0
' Dalsze przetwarzanie
Loop

Transmisja szeregowa UART

BASCOM-AVR oferuje prostą konfigurację interfejsu UART. Prędkość transmisji można określić dyrektywą $baud, a bufory skonfigurować odpowiednimi instrukcjami.

Podstawowy program wysyłający tekst przez UART może wyglądać następująco:

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Serialin = Buffered , Size = 16
Config Serialout = Buffered , Size = 16

Print "Witaj z BASCOM!"

Instrukcja Print wysyła tekst przez UART. Dane można odbierać za pomocą instrukcji Input lub mechanizmu buforowania.

Pamięć EEPROM

BASCOM-AVR udostępnia instrukcje do zapisywania i odczytywania danych z wbudowanej pamięci EEPROM. Można w niej przechowywać ustawienia urządzenia, wartości kalibracyjne oraz informacje, które powinny pozostać dostępne po odłączeniu zasilania.

Do obsługi EEPROM służą polecenia Writeeeprom Zmienna, Adres oraz Readeeprom Zmienna, Adres.

Przykładowy projekt z migającą diodą LED

Przykład zakłada użycie mikrokontrolera ATmega8 taktowanego częstotliwością 8 MHz. Dioda LED jest podłączona do wyprowadzenia PB0 przez odpowiednio dobrany rezystor ograniczający prąd.

Kod źródłowy

Program cyklicznie włącza i wyłącza diodę co 500 ms:

$regfile = "m8def.dat"
$crystal = 8000000

Config Portb = Output

Do
Portb.0 = 1 ' Włączenie diody na PB0
Waitms 500
Portb.0 = 0 ' Wyłączenie diody
Waitms 500
Loop

Kompilowanie programu

Aby przygotować plik wynikowy, wykonaj następujące czynności:

  1. zapisz kod, na przykład w pliku led.bas,
  2. uruchom polecenie Compile, aby wygenerować plik z rozszerzeniem .hex,
  3. sprawdź komunikaty kompilatora wyświetlane w dolnej części okna programu.

Programowanie mikrokontrolera

Jeżeli programator jest obsługiwany bezpośrednio, wybierz polecenie Program → Send to Chip → Program lub użyj przypisanego skrótu klawiszowego. W przypadku programatora zewnętrznego sprawdź ustawienia External programmer i Use HEX file, a następnie uruchom zapis programu.

Przed zaprogramowaniem pamięci warto użyć funkcji Chip → Identify, aby sprawdzić połączenie i komunikację z mikrokontrolerem.

Przykładowy projekt z komunikacją UART

Poniższy program co sekundę wysyła do komputera bieżącą wartość licznika.

Kod źródłowy

Przykład wykorzystuje transmisję z prędkością 9600 bit/s:

$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Serialout = Buffered , Size = 16

Dim Licznik As Byte

Do
Print "Licznik = " ; Licznik
Incr Licznik
Waitms 1000
Loop

Po każdym wysłaniu wartości zmienna Licznik jest zwiększana o jeden.

Połączenie sprzętowe

Do komunikacji z komputerem należy przygotować następujące połączenia i ustawienia:

  • podłącz interfejs USB–UART lub odpowiedni konwerter poziomów RS232,
  • połącz wyprowadzenie TX mikrokontrolera z wejściem RX konwertera,
  • połącz masę mikrokontrolera z masą konwertera,
  • uruchom terminal szeregowy na komputerze i ustaw prędkość 9600 bit/s.

Symulowanie i debugowanie programu

BASCOM-AVR zawiera wbudowany symulator, który pozwala analizować działanie programu oraz wybranych urządzeń wejścia i wyjścia.

Najważniejsze możliwości symulatora to:

  • wykonywanie programu krok po kroku,
  • podgląd rejestrów, pamięci i zmiennych,
  • symulowanie podstawowych urządzeń wejścia i wyjścia.

Dzięki tym funkcjom można:

  • sprawdzić logikę programu przed przesłaniem go do mikrokontrolera,
  • wykrywać błędy w obliczeniach i obsłudze warunków,
  • analizować działanie przerwań oraz procedur.

Typowy proces pracy obejmuje kompilowanie, symulowanie, programowanie mikrokontrolera i testowanie aplikacji w docelowym układzie.

Typowe błędy i dobre praktyki

Problemy z programatorem

Do najczęstszych przyczyn problemów z programowaniem należą:

  • nieprawidłowy typ programatora wybrany w menu Options → Programmer,
  • brak zaznaczonej opcji Use HEX file podczas korzystania z programu zewnętrznego,
  • nieodpowiedni tryb portu LPT,
  • brak wspólnej masy między mikrokontrolerem a programatorem,
  • uszkodzony lub nieprawidłowo podłączony przewód ISP,
  • zbyt wysoka częstotliwość zegara programatora w stosunku do częstotliwości taktowania mikrokontrolera.

Diagnostykę warto rozpocząć od funkcji Chip → Identify, która pozwala sprawdzić, czy mikrokontroler jest prawidłowo wykrywany.

Niezgodność częstotliwości zegara

Jeśli wartość dyrektywy $crystal nie odpowiada rzeczywistej częstotliwości taktowania, funkcje czasowe i interfejs UART będą działać nieprawidłowo. Skutkiem może być niewłaściwa długość opóźnień lub błędna prędkość transmisji.

Podczas diagnostyki należy:

  • sprawdzić ustawienia bitów konfiguracyjnych mikrokontrolera,
  • ustalić, czy układ korzysta z wewnętrznego oscylatora, czy z zewnętrznego rezonatora kwarcowego,
  • ustawić wartość $crystal zgodnie z rzeczywistą częstotliwością zegara.

Zbyt mała ilość pamięci

Wersja demonstracyjna BASCOM-AVR ogranicza rozmiar generowanego kodu. Jeśli projekt przekracza dopuszczalny limit, można:

  • usunąć nieużywane funkcje i biblioteki,
  • uprościć kod oraz ograniczyć liczbę zmiennych,
  • przejść na pełną wersję BASCOM-AVR.

Kiedy warto wybrać BASCOM-AVR?

Najważniejsze zalety BASCOM-AVR to:

  • prosty język BASIC – zapewnia niski próg wejścia dla początkujących;
  • rozbudowane biblioteki – ułatwiają obsługę popularnych peryferiów;
  • zintegrowane środowisko – łączy edytor, kompilator, programator i symulator;
  • dostępność materiałów edukacyjnych – obejmuje dokumentację, książki, kursy i przykłady projektów.

Do ograniczeń środowiska należą:

  • zależność od systemu Windows – program jest przeznaczony głównie dla tej platformy;
  • mniejsza popularność w zastosowaniach profesjonalnych – w wielu projektach częściej wykorzystuje się język C i kompilator AVR-GCC;
  • limit wersji demonstracyjnej – ograniczenie rozmiaru kodu utrudnia rozwijanie większych aplikacji.

BASCOM-AVR sprawdza się szczególnie w następujących zastosowaniach:

  • edukacji i nauce podstaw mikrokontrolerów,
  • małych projektach hobbystycznych,
  • szybkim tworzeniu prototypów,
  • projektach wymagających wygodnej obsługi typowych peryferiów.

W rozbudowanych projektach wymagających maksymalnej wydajności, przenośności i pełnej kontroli nad sprzętem lepszym wyborem może być język C, kompilator AVR-GCC, system czasu rzeczywistego lub odpowiednie biblioteki HAL.

Źródła wiedzy i dalsza nauka

W dalszej nauce BASCOM-AVR mogą pomóc następujące materiały:

  • książka „Programowanie mikrokontrolerów AVR w języku Bascom” Marcina Wiązani – omawia podstawy języka i praktyczne projekty;
  • dokumentacja BASCOM-AVR – zawiera opis składni, dyrektyw, instrukcji i obsługiwanych mikrokontrolerów;
  • materiały dotyczące peryferiów – przedstawiają przykłady obsługi ADC, UART, wyświetlaczy LCD, klawiatur i pamięci EEPROM;
  • kursy i projekty praktyczne – oferują gotowe schematy, kody źródłowe i omówienia uruchamiania urządzeń.

Regularne tworzenie niewielkich projektów — od migającej diody, przez pomiar napięcia, aż po komunikację szeregową — pozwala stopniowo opanować środowisko i poznać specyfikę mikrokontrolerów AVR.