Systemy wbudowane - Maciej Piechowiak

Transkrypt

Systemy wbudowane - Maciej Piechowiak
Systemy wbudowane
Mikrokontrolery AVR
Wprowadzenie do programowania w C
dr inż. Maciej Piechowiak
Wprowadzenie







język C jest językiem strukturalnym wysokiego poziomu,
jednak działającym „blisko sprzętu” i generującym kod
zbliżony do kodu tworzonego w asemblerze,
optymalizacja kodu pozwala na uzyskanie zwartego kodu
wynikowego,
można dopisywać „krytyczne” fragmenty kodu w czystym
asemblerze,
przenośność kodu (funkcje nie związane ze sprzętem, np.:
algorytmy, funkcje konwertujące),
szeroka dostępność bibliotek, popularnych kodów itp.,
darmowe narzędzia deweloperskie (avr-gcc),
wersje kompilatora (porty) na różne mikrokontrolery.
Struktura





/bin – zestaw bezpośrednio używanych programów
narzędziowych avr-gcc i avr-binutils,
/avr/include – pliki nagłówkowe (headers) biblioteki avr-libc,
glównie pliki z definicjami zasobów poszczególnych
mikrokontrolerów,
/avr/lib/ldscripts – skrypty sterujące pracą linkera, opisują
wielkości poszczególnych obszarów pamięci, podział na
sekcje, adresy początkowe i końcowe,
/lib/gcc/avr/3.4.2/include – ogólne pliki nagłówkowe gcc (nie
powiązane z mikrokontrolerami),
/doc/avr-libc/avr-libc-user-manual – pliki pomocy.
1
Kompilacja
• preprocesor realizuje zmiany w kodzie
określone przez dyrektywy:
dodatkowe pliki z dyrektyw #include,
definicje i makroinstrukcje z #define,
dyrektywy kompilacji warunkowej #if,
#else, #endif,
• kompilacja z przeprowadzeniem
optymalizacji (automatyczne
uproszczenie i skrócenie kodu) –
wynik: instrukcje asemblera (.s),
• asemblacja (przetworzenie na kod
maszynowy) – pliki relokowalne (.o),
adresy zmiennych i funkcji nie są
jeszcze ustalone,
Kompilacja
• linkowanie i konsolidacja (ulokowanie
fragmentów kodu w obszarze pamięci
programu i wyliczenie adresów),
dołączenie funkcji bibliotecznych oraz
plików kodu inicjującego dla danego
mikrokontrolera,
• plik obiektowy (.elf) zawiera kod
wynikowy, informacje dla debuggera,
wykaz symboli, rozmiary sekcji kodu
(z informacji tych można korzystać
poprzez zbiór narzędzi binutils),
• W rezultacie tworzone są pliki
wykonywalne (obrazy pamięci) Flash
(.hex) lub EEPROM (.eep)
Środowisko uruchomieniowe
Kompilacja programu odbywa się w środowisku AVR Studio. Domyślnie
środowisko pozwala na pisanie programu w asemblerze oraz jego symulację.
Wcześniejsze zainstalowanie kompilatora avr-gcc (WinAVR) umożliwia
kompilowanie kodów źródłowych programów w C poprzez AVR Studio.
2
Środowisko uruchomieniowe
Programowanie



technologia Flash ISP pozwala na
przeprogramowywanie pamięci „w
systemie” poprzez szeregowy interfejs
ISP z wykorzystaniem konwencjonalnych
programatorów, magistralę JTAG oraz
przez program bootujący pracujący w
samym układzie,
program bootujący może wykorzystywać
dowolny rodzaj interfejsu, aby załadować
właściwy program do pamięci aplikacji,
program z sekcji bootującej kontynuuje
swoją pracę podczas programowania
części aplikacyjnej, na co pozwala
technika Write-While-Read.
Programatory


/STK500 Microsense/
programator zgodny z AVR
STK500v2 na USB,
w systemie Windows XP działa w
trybie COM, w systemach
Windows 7 oraz Windows Vista
zarówno 32 i 64 bitowych pracuje
w trybie HID.
3
Programatory
/STK500 Microsense/
Programatory
/STK500 Microsense/
•
•
•
Programatory
instalacja sterowników (USB AVR ISP II FT STK500v2),
przypisanie urządzenia do wolnego portu COM w
systemie (Menedżer urządzeń -> Właściwości),
Connect… -> Zmniejszenie częstotliwości:
ISP frequency.
/KamPROG Kamami/
Prosta instalacja oprogramowania wraz z plugin-em do
AVRStudio: http://www.kamami.com/dl/kamprogavr_en.pdf
4
Programatory
/KamPROG Kamami/
Programowanie /STK 200 LPT/



aplikacja PonyProg2000 jest przeznaczona
do programowania układów z pamięcią
Flash lub EEPROM, które mogą być
programowane szeregowo,
obsługuje przy tym różne standardy
szeregowej transmisji takie jak magistrala
I2C, microwire i SPI,
za pomocą aplikacji można
zaprogramować większość popularnych
mikrokontrolerów jednoukładowych AVR
wyposażonych w interfejs SPI (ang. Serial
Peripherial Interface), niektóre z
mikrokontrolerów ATMEL z serii AT89S,
mikrokontrolery PIC serii PIC16X84 oraz
pamięci szeregowe EEPROM.
Programowanie /STK 200 LPT/
5
Programowanie /STK 200 LPT/
Porty mikrokontrolera



układy peryferyjne mikrokontrolera AVR można dołączać
do czterech portów poprzez rejestry we/wy – 8-bitowe
rejestry we/wy znajdują się w przestrzeni adresowej
pamięci danych,
możliwe jest zapisywanie do portów/rejestrów we/wy lub
odczytywanie z nich podobnie jak z pamięci danych,
w zbiorze instrukcji języka maszynowego
mikrokontrolera AVR istnieją też specjalne rozkazy
służące do odczytu i zapisu zawartości rejestrów we/wy
oraz rozkazy do manipulowania pojedynczymi bitami
rejestrów,
Porty mikrokontrolera



z każdym z równoległych portów we/wy: A, B, C i D
powiązane są po trzy rejestry I/O, o nazwach: DDRx,
PORTx, PINx, (gdzie x oznacza port A, B, C lub D,
stan poszczególnych bitów rejestrów DDRx (ang. Port
Data Direction Register) decyduje czy odpowiadające im
linie są wejściami czy wyjściami (0-wejście, 1-wyjście),
jeżeli dana linia we/wy pracuje jako wyjście, wtedy
ustawiając na wartość 1 odpowiadający tej linii bit w
rejestrze PORTx (ang. Port Data Register) na
wyprowadzeniu wymuszany jest stan wysoki, a
ustawiając wartość bitu na 0 – stan niski,
6
Porty mikrokontrolera



jeżeli linia portu została skonfigurowana jako wejście, poziom
logiczny na wyprowadzeniu sprawdza się odczytując wartość
odpowiadającego tej linii bitu w rejestrze PINx (ang. Port Input
Pins Address),
dodatkowo, gdy linia jest wejściem i odpowiadający tej linii bit
w rejestrze PORTx ma wartość 1, wtedy wyprowadzenie jest
wewnętrznie podciągnięte do napięcia zasilania,
dla dowolnego pinu jednego z portów konfiguracja
przedstawia się następująco:
Ustawiając wszystkie linie portu
B jako wyjścia należy do
rejestru DDRB wpisać wartość
0xff.
DDRx.n
PORTx.n
Px.n
0
0
wejście
0
1
wejście podciągnięte do Vcc
1
0 lub 1
wyjście
Asembler vs. C
.INCLUDE "m32def.inc"
.org 0x0000
rjmp Reset
#define F_CPU 16000000UL
#include <avr/io.h>
int main(void) {
DDRA = 0xFF;
PORTA = 0x05;
while (1) {
Reset:
ldi R16, 0xff
out DDRA, R16
Petla:
ldi R16, 0b10101010
out PORTA, R16
rjmp Petla
}
}
Porty mikrokontrolera
Pętle opóźniające są dobrze skalibrowane tylko przy włączonej optymalizacji:
Project -> GCC / WinAVR flags -> Optimization -> Level 2
7
Porty mikrokontrolera
DDRB = _BV(7)|_BV(6)|_BV(5)|_BV(4)
DDRB = 0xF0
Porty mikrokontrolera
…
8

Podobne dokumenty