1
Programowanie
mikrokontrolerów
rodziny AVR
Narz dzia rozwojowe
2
AVR-GCC
AVR-GCC jest darmowym kompilatorem j zyka C
(licencja GNU) słu cym do pisania programów dla
mikrokontrolerów serii AVR firmy ATMEL.
Kompilator jest doł czany do rodowiska AVR
Studio, pozwalaj c na tworzenie projektów
programistycznych w j zyku C/C++
3
Programy narz dziowe - Binutils
Jest to zbiór programów pozwalaj cych na sprawne
zarz dzanie projektem.
Binutils s doł czone do rodowiska rozwojowego i wraz
z kompilatorem AVR-GCC oraz bibliotek avr-libc stanowi
kompletny ła cuch narz dzi rozwojowych
4
Programy narz dziowe - Binutils
Dost pne s nast puj ce programy narz dziowe:
avr-as - asembler
•avr-ld - linker
•avr-ar - zarz dza bibliotekami
•avr-ranlib – generuje indeksy do bibliotek
•avr-objcopy – kopiuje i tłumaczy zbiory obiektowe
•avr-objdump – wy wietla informacje z plików obiektowych
•avr-size – podaje informacj o rozmiarze sekcji i programu
•avr-nm – listuje symbole ze zboiru obiektowego
•avr-strings – listuje ła cuch znakowe ze zbiorów obiektowych
•avr-strip – usuwa symbole
•avr-readelf – wy wietla zawaro
zbioru z rozszerzeniem ELF
•avr-addr2line – konwertuje adresy
•avr-c++filt – filtr symboli C++
5
Biblioteka avr-libc
•avr-libc jest standardow bibliotek C dla AVR-GCC.
•Biblioteka zawiera wiele standardowych funkcji C
i wła ciwych dla architektury procesorów rodziny AVR.
•Dodatkowo biblioteka pozwala na tworzenie kodu startowego
programu.
6
Biblioteka avr-libc
Mikrokontrolery spierane przez bibliotek avr-libc w wersji 1.4.7:
megaAVR:
atmega103
atmega128
atmega1280
atmega1281
atmega16
atmega161
atmega162
atmega163
atmega164p
atmega165
atmega165p
atmega168
atmega168p
atmega2560
atmega2561
atmega32
atmega323
atmega324p
atmega325
atmega325p
atmega3250
atmega3250p
atmega328p
atmega48
atmega48p
atmega64
atmega640
atmega644
atmega644p
atmega645
atmega6450
atmega8
atmega88
atmega88p
atmega8515
atmega8535
7
Biblioteka avr-libc
Mikrokontrolery spierane przez bibliotek avr-libc w wersji 1.4.7:
tinyAVR:
attiny11
attiny12
attiny13
attiny15
attiny22
attiny24
attiny25
attiny26
attiny261
attiny28
attiny2313
attiny43u
attiny44
attiny45
CAN AVR:
at90can32
at90can64
at90can128
LCD AVR:
atmega169
atmega169p
atmega329
atmega329p
atmega3290
atmega3290p
atmega649
atmega6490
attiny461
attiny48
attiny84
attiny85
attiny861
Lighting AVR:
at90pwm1
at90pwm2
at90pwm2b
at90pwm216
at90pwm3
at90pwm3b
at90pwm316
Smart Battery AVR:
atmega8hva
atmega16hva
atmega406
8
Biblioteka avr-libc
Mikrokontrolery spierane przez bibliotek avr-libc w wersji 1.4.7:
USB AVR:
at90usb82
at90usb162
at90usb646
at90usb647
at90usb1286
at90usb1287
Inne:
at94K
at76c711
at43usb320
at43usb355
at86rf401
Standardowe AVR:
at90s1200
at90s2313
at90s2323
at90s2333
at90s2343
at90s4414
at90s4433
at90s4434
at90s8515
at90c8534
at90s8535
attiny461
attiny48
attiny84
attiny85
attiny861
9
Biblioteka avr-libc
Moduły biblioteki avr-libc w wersji 1.4.7:
<alloca.h> - alokujacja pami ci stosu
<assert.h> - diagnostyka
<ctype.h> - operacje na znakach
<errno.h> - obsługa bł dów
<inttypes.h> - konwersje typów całkowitych
<math.h> - funkcje matematyczne
<setjmp.h> - długie skoki
<stdint.h> - definicje standardowych typów całkowitych
<stdio.h> - standardowa biblioteka wej cia/wyj cia
<stdlib.h> - funkcje standardowe
<string.h> - funkcje operuj ce na ła cuchach
<avr/boot.h> - narz dzia wspieraj ce funkcje bootloadera
<avr/eeprom.h> - funkcje dost pu do wewn trznej pami ci EEPROM
<avr/interrupt.h> - funkcje obsługi przerwa
<avr/io.h> - definicje rejestrów i bitów I/O (doł cza wła ciwe dla danego uC)
<avr/pgmspace.h> - fukncje dost pu do pami ci programu
<avr/power.h> - funkcje zarz dzania energi
<avr/sfr_defs.h> - funkcje operuj ce na rejestrach funkcyjnych
10
Biblioteka avr-libc
Moduły biblioteki avr-libc w wersji 1.4.7, cd:
<avr/sleep.h>- funkcje zarz dzania trybami energooszcz dnymi
<avr/version.h> - makra wersji
<avr/wdt.h> - funkcje obsługi Watchdoga
<util/crc16.h> - obliczanie sum CRC
<util/delay.h> - funkcje realizuj ce opó nienia
<util/delay_basic.h> - funkcje realizuj ce podstawowe opó nienia
<util/parity.h> - generowanie bitu parzystoci
<util/twi.h> - definicje masek interfejsu TWI
<compat/deprecated.h>- informacje o przestarzałych funkcjach
<compat/ina90.h> - funkcje zapewniaj ce kompatybilno z IAR EWB 3.x
Projekty przykładowe:
•kompilacja plików C i asemblerowych
•prosty projekt
•projekt bardziej zło ony
•u ywanie standardowych narz dzi I/O
•przykład u ycia interfejsu TWI
11
Biblioteka avr-libc
Przykłady funkcji modułu <ctype.h>
int isalpha (int
__c ) – sprawdza, czy dana jest znakiem alfanumercznym
int isascii (int
__c ) – sprawdza, czy dana jest znakiem ASCII
int isblank (int
__c ) - sprawdza, czy dana jest znakiem spacji lub tabulacji
int isdigit (int
__c ) - sprawdza, czy dana jest cyfr dziesi tn
int toascii (int
__c ) – konwertuje dan do znaku ASCII
int tolower (int
__c ) - konwertuje wielk liter do małej
int toupper (int
__c ) - konwertuje liter mał do wielkiej
12
Biblioteka avr-libc
Przykłady funkcji modułu
<math.h>
•Trygonometryczne:
double acos (double
__x ) – arcus cosinus
double asin (double
__x ) – arcus sinus
double atan (double
__x ) – arcus tangens
double atan2 (double
__y, double __x ) – arcus tangens x/y w danej wiartce
double cos (double
__x ) - cosinus
double cosh (double
__x ) – cosinus hiperboliczny
double sin (double
__x ) - sinus
double sinh (double
__x ) – sinus hiperboliczny
double tan (double
__x ) - tangns
double tanh (double
__x ) – arcus tangens
13
Biblioteka avr-libc
Przykłady funkcji modułu
<math.h>
•Zaokr glenia:
double ceil (double
__x ) – zaokr glenie w gór
double floor (double
__x ) – zaokr glenie w dół
•Pot gi i pierwiastki:
double exp (double
__x ) - eksponent
double ldexp (double
__x, int __exp ) – iloczyn liczby x i pot gi exp liczby 2
double pow (double
__x, double __y ) – pot ga y liczby x
double square (double
__x ) – kwadrat x
double sqrt (double
__x ) – pierwiastek kwadratowy x
14
Biblioteka avr-libc
Moduł
<stdio.h>
W module s implementowane podstawowe operacje I/O. Ze wzgl du na brak
typowych urz dze wej cia wyj cia zakłada si kojarzenie strumieni I/O z
jednym z portów szeregowych mikrokontrolera.
Definicje:
#define
FILE
struct __file
#define
stdin
(__iob[0])
#define
stdout
(__iob[1])
#define
stderr
(__iob[2])
#define
EOF
(-1)
#define
fdev_set_udata
(stream, u) do { (stream)->udata = u; } while(0)
#define
fdev_get_udata
(stream) ((stream)->udata)
#define
fdev_setup_stream
(stream, put, get, rwflag)
15
Biblioteka avr-libc
Moduł
<stdio.h>
Definicje, cd:
#define
_FDEV_SETUP_READ
__SRD
#define
_FDEV_SETUP_WRITE
__SWR
#define
_FDEV_SETUP_RW
(__SRD|__SWR)
#define
_FDEV_ERR
(-1)
#define
_FDEV_EOF
(-2)
#define
FDEV_SETUP_STREAM
(put, get, rwflag)
#define
fdev_close
()
#define
putc
(__c, __stream) fputc(__c, __stream)
#define
putchar
(__c) fputc(__c, stdout)
#define
getc
(__stream) fgetc(__stream)
#define
getchar
() fgetc(stdin)
16
Biblioteka avr-libc
Funkcje modułu
<stdio.h>
int
fclose
(FILE *__stream)
int
vfprintf
(FILE *__stream, const char *__fmt, va_list __ap)
int
vfprintf_P
(FILE *__stream, const char *__fmt, va_list __ap)
int
fputc
(int __c, FILE *__stream)
int
printf
(const char *__fmt,...)
int
printf_P
(const char *__fmt,...)
int
vprintf
(const char *__fmt, va_list __ap)
int
sprintf
(char *__s, const char *__fmt,...)
int
sprintf_P
(char *__s, const char *__fmt,...)
int
snprintf
(char *__s, size_t __n, const char *__fmt,...)
int
snprintf_P
(char *__s, size_t __n, const char *__fmt,...)
int
vsprintf
(char *__s, const char *__fmt, va_list ap)
int
vsprintf_P
(char *__s, const char *__fmt, va_list ap)
int
vsnprintf
(char *__s, size_t __n, const char *__fmt, va_list ap)
int
vsnprintf_P
(char *__s, size_t __n, const char *__fmt, va_list ap)
int
fprintf
(FILE *__stream, const char *__fmt,...)
int
fprintf_P
(FILE *__stream, const char *__fmt,...)
17
Biblioteka avr-libc
Funkcje modułu
<stdio.h>, cd.
int
fputs
(const char *__str, FILE *__stream)
int
fputs_P
(const char *__str, FILE *__stream)
int
puts
(const char *__str)
int
puts_P
(const char *__str)
size_t
fwrite
(const void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
int
fgetc
(FILE *__stream)
int
ungetc
(int __c, FILE *__stream)
char *
fgets
(char *__str, int __size, FILE *__stream)
char *
gets
(char *__str)
size_t
fread
(void *__ptr, size_t __size, size_t __nmemb, FILE *__stream)
void
clearerr
(FILE *__stream)
int
feof
(FILE *__stream)
int
ferror
(FILE *__stream)
18
Biblioteka avr-libc
Funkcje modułu
<stdio.h>, cd.
int
vfscanf
(FILE *__stream, const char *__fmt, va_list __ap)
int
vfscanf_P
(FILE *__stream, const char *__fmt, va_list __ap)
int
fscanf
(FILE *__stream, const char *__fmt,...)
int
fscanf_P
(FILE *__stream, const char *__fmt,...)
int
scanf
(const char *__fmt,...)
int
scanf_P
(const char *__fmt,...)
int
vscanf
(const char *__fmt, va_list __ap)
int
sscanf
(const char *__buf, const char *__fmt,...)
int
sscanf_P
(const char *__buf, const char *__fmt,...)
int
fflush
(FILE *stream)
FILE *
fdevopen
(int(*put)(char, FILE *), int(*get)(FILE *))
19
Biblioteka avr-libc
Ograniczenia funkcji modułu <stdio.h>:
•Ze wzgl du na brak systemu operacyjnego nie ma faktycznej
implementacji systemu plików
•Standardowe strumienie stdin, stdout i stderr s dost pne, ale
musz by otwarte za pomoc funkcji fdevopen(), kojarz cej
strumie z urz dzeniem wysyłaj cym i odbieraj cym znaki
•Implementacja funkcji printf() i scanf() jest skomplikowana i nie
zaleca si ich u ywa (zamiast nich wskazane jest u ywa : vprintf()
i vscanf() )
20
Biblioteka avr-libc
Przykładowy program korzystaj cy z modułu
<stdio.h>:
#include <
stdio.h
>
static int uart_putchar(char c,
FILE
*stream);
static
FILE
mystdout =
FDEV_SETUP_STREAM
(uart_putchar, NULL, _
FDEV_SETUP_WRITE
);
static int uart_putchar(char c,
FILE
*stream)
{
if (c == '\n') uart_putchar('\r', stream);
loop_until_bit_is_set
(UCSRA, UDRE);
UDR = c; return 0;
}
int main(void)
{
init_uart();
stdout
= &mystdout;
printf
("Hello, world!\n");
return 0;
}
21
Biblioteka avr-libc
Moduł
<avr/io.h>
•Moduł zawiera definicje rejestrów bitów i ko cówek I/O dla mikrokontrolera
•W rzeczywistoci doł czony zostaje moduł <avr/io
XXXX
.h> definiuj cy I/O
wybranego mikrokontrolra na podstawie opcji wywołania kompilatora -mmcu=
typ_mikrokontrolera
•Moduł doł cza moduły: avr/sfr_defs.h, avr/portpins.h, avr/common.h
i avr/version.h
•W module s zdefiniowane makra:
RAMEND – stała b d ca adresem ostatniej komórki pami ci RAM
XRAMEND - stała b d ca adresem ostatniej komórki zewn trznej pami ci RAM
E2END – stała b d ca adresem ostatniej komórki pami ci EEPROM
FLASHEND – stała b d ca adresem ostatniej komórki pami ci FLASH
SPM_PAGESIZE – stała okre laj ca rozmiar pami ci bootloadera w bajtach
22
Biblioteka avr-libc
Moduł
<stdlib/io.h>
•Moduł zawiera definicje makr i funkcji wymaganych przez standard j zyka i
wła ciwych dla mikrokontrolerów AVR.
Struktury danych:
struct
div_t
, struct
ldiv_t
Funkcje niestandardowe:
char *
ltoa
(long int __val, char *__s, int __radix)
char *
utoa
(unsigned int __val, char *__s, int __radix)
char *
ultoa
(unsigned long int __val, char *__s, int __radix)
long
random
(void)void
srandom
(unsigned long __seed)
long
random_r
(unsigned long *__ctx)
char *
itoa
(int __val, char *__s, int __radix)
23
Biblioteka avr-libc
Moduł
<stdlib/io.h>
Stałe:
#define
RANDOM_MAX
0x7FFFFFFF
Funkcje konwersji dla argumentów podwójnej precyzji:
(umieszczone w module ”libm.a”, doł czanej opcj wywołania kompilatora: -lm)
char *
dtostre
(double __val, char *__s, unsigned char __prec, unsigned char __flags)
char *
dtostrf
(double __val, signed char __width, unsigned char __prec, char *__s)
#define
DTOSTR_ALWAYS_SIGN
0x01
#define
DTOSTR_PLUS_SIGN
0x02
#define
DTOSTR_UPPERCASE
0x04
24
Biblioteka avr-libc
Moduł
<stdlib/io.h>
Definicje:
#define
RAND_MAX
0x7FFF
typedef int(*)
__compar_fn_t
(const void *, const void *)
Funkcje:
void
abort
(void) __ATTR_NORETURN__
int
abs
(int __i)
long
labs
(long __i)
void *
bsearch
(const void *__key, const void *__base, size_t __nmemb, size_t
__size, int(*__compar)(const void *, const void *))
div_t div
(int __num, int __denom) __asm__("__divmodhi4")
ldiv_t ldiv
(long __num, long __denom) __asm__("__divmodsi4")
void
qsort
(void *__base, size_t __nmemb, size_t __size,
__compar_fn_t
__compar)
long
strtol
(const char *__nptr, char **__endptr, int __base)
unsigned long
strtoul
(const char *__nptr, char **__endptr, int __base)
long
atol
(const char *__s) __ATTR_PURE__
int
atoi
(const char *__s) __ATTR_PURE__
void
exit
(int __status) __ATTR_NORETURN__
25
Biblioteka avr-libc
Moduł
<stdlib/io.h>
Funkcje, cd:
void *
malloc
(size_t __size) __ATTR_MALLOC__
void
free
(void *__ptr)
void *
calloc
(size_t __nele, size_t __size) __ATTR_MALLOC__
void *
realloc
(void *__ptr, size_t __size) __ATTR_MALLOC__
double
strtod
(const char *__nptr, char **__endptr)
double
atof
(const char *__nptr)
int
rand
(void)
void
srand
(unsigned int __seed)
int
rand_r
(unsigned long *__ctx)
Zmienne:
size_t
__malloc_margin
char *
__malloc_heap_start
char *
__malloc_heap_end
26
Biblioteka avr-libc
Makra modułu
<interrupt.h>
sei() – zał cza system przerwa
cli() – wył cza system przerwa
EMPTY_INTERRUPT (vector ) – puste przerwanie (tylko powrót)
ISR (vector ) – procedura obsługi przerwania o podanym wektorze
ISR_ALIAS (vector, target_vector ) – powtórzenie obsługi dla nowego wektora
reti() – powrót z procedury obsługi przerwania
Mo liwe kombinacje parametrów:
ISR(vector, ISR_NOBLOCK) - procedura obsługi przerwania nie blokuje
kolejnych przerwa
ISR(vector, ISR_NAKED) - procedura obsługi przerwania definiowana w pełni
przez u ytkownika (równie prolog i epilog)
27
Biblioteka avr-libc
U ycie makr modułu
<interrupt.h>
Przykład:
ISR
(INT0_vect)
{
PORTB = 42;
}
ISR_ALIAS
(INT1_vect, INT0_vect);