Programowanie mikrokontrolerów rodziny AVR Narzdzia rozwojowe 1
AVR-GCC AVR-GCC jest darmowym kompilatorem jzyka C (licencja GNU) słucym do pisania programów dla mikrokontrolerów serii AVR firmy ATMEL. Kompilator jest dołczany do rodowiska AVR Studio, pozwalajc na tworzenie projektów programistycznych w jzyku C/C++ 2
Programy narzdziowe - Binutils Jest to zbiór programów pozwalajcych na sprawne zarzdzanie projektem. Binutils s dołczone do rodowiska rozwojowego i wraz z kompilatorem AVR-GCC oraz bibliotek avr-libc stanowi kompletny łacuch narzdzi rozwojowych 3
Programy narzdziowe - Binutils Dostpne s nastpujce programy narzdziowe: avr-as - asembler avr-ld - linker avr-ar - zarzdza bibliotekami avr-ranlib generuje indeksy do bibliotek avr-objcopy kopiuje i tłumaczy zbiory obiektowe avr-objdump wywietla informacje z plików obiektowych avr-size podaje informacj o rozmiarze sekcji i programu avr-nm listuje symbole ze zboiru obiektowego avr-strings listuje łacuch znakowe ze zbiorów obiektowych avr-strip usuwa symbole avr-readelf wywietla zawarozbioru z rozszerzeniem ELF avr-addr2line konwertuje adresy avr-c++filt filtr symboli C++ 4
avr-libc jest standardow bibliotek C dla AVR-GCC. Biblioteka zawiera wiele standardowych funkcji C i właciwych dla architektury procesorów rodziny AVR. Dodatkowo biblioteka pozwala na tworzenie kodu startowego programu. 5
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 6
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 attiny461 attiny48 attiny84 attiny85 attiny861 CAN AVR: at90can32 at90can64 at90can128 LCD AVR: atmega169 atmega169p atmega329 atmega329p atmega3290 atmega3290p atmega649 atmega6490 Lighting AVR: at90pwm1 at90pwm2 at90pwm2b at90pwm216 at90pwm3 at90pwm3b at90pwm316 Smart Battery AVR: atmega8hva atmega16hva atmega406 7
Mikrokontrolery spierane przez bibliotek avr-libc w wersji 1.4.7: Standardowe AVR: at90s1200 at90s2313 at90s2323 at90s2333 at90s2343 at90s4414 at90s4433 at90s4434 at90s8515 at90c8534 at90s8535 attiny461 attiny48 attiny84 attiny85 attiny861 USB AVR: at90usb82 at90usb162 at90usb646 at90usb647 at90usb1286 at90usb1287 Inne: at94k at76c711 at43usb320 at43usb355 at86rf401 8
Moduły biblioteki avr-libc w wersji 1.4.7: <alloca.h> - alokujacja pamici 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 wejcia/wyjcia <stdlib.h> - funkcje standardowe <string.h> - funkcje operujce na łacuchach <avr/boot.h> - narzdzia wspierajce funkcje bootloadera <avr/eeprom.h> - funkcje dostpu do wewntrznej pamici EEPROM <avr/interrupt.h> - funkcje obsługi przerwa <avr/io.h> - definicje rejestrów i bitów I/O (dołcza właciwe dla danego uc) <avr/pgmspace.h> - fukncje dostpu do pamici programu <avr/power.h> - funkcje zarzdzania energi <avr/sfr_defs.h> - funkcje operujce na rejestrach funkcyjnych 9
Moduły biblioteki avr-libc w wersji 1.4.7, cd: <avr/sleep.h>- funkcje zarzdzania trybami energooszczdnymi <avr/version.h> - makra wersji <avr/wdt.h> - funkcje obsługi Watchdoga <util/crc16.h> - obliczanie sum CRC <util/delay.h> - funkcje realizujce opónienia <util/delay_basic.h> - funkcje realizujce 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 zapewniajce kompatybilno z IAR EWB 3.x Projekty przykładowe: kompilacja plików C i asemblerowych prosty projekt projekt bardziej złoony uywanie standardowych narzdzi I/O przykład uycia interfejsu TWI 10
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 dziesitn 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 11
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 12
Przykłady funkcji modułu <math.h> Zaokrglenia: double ceil (double x ) zaokrglenie w gór double floor (double x ) zaokrglenie w dół Potgi i pierwiastki: double exp (double x ) - eksponent double ldexp (double x, int exp ) iloczyn liczby x i potgi exp liczby 2 double pow (double x, double y ) potga y liczby x double square (double x ) kwadrat x double sqrt (double x ) pierwiastek kwadratowy x 13
Moduł <stdio.h> W module s implementowane podstawowe operacje I/O. Ze wzgldu na brak typowych urzdze wejcia wyjcia 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) 14
Moduł <stdio.h> Definicje, cd: Biblioteka avr-libc #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) 15
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,...) 16
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) 17
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 *)) 18
Ograniczenia funkcji modułu <stdio.h>: Ze wzgldu na brak systemu operacyjnego nie ma faktycznej implementacji systemu plików Standardowe strumienie stdin, stdout i stderr s dostpne, ale musz by otwarte za pomoc funkcji fdevopen(), kojarzcej strumie z urzdzeniem wysyłajcym i odbierajcym znaki Implementacja funkcji printf() i scanf() jest skomplikowana i nie zaleca si ich uywa (zamiast nich wskazane jest uywa: vprintf() i vscanf() ) 19
Przykładowy program korzystajcy 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; } 20
Moduł <avr/io.h> Moduł zawiera definicje rejestrów bitów i kocówek I/O dla mikrokontrolera W rzeczywistoci dołczony zostaje moduł <avr/ioxxxx.h> definiujcy 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 bdca adresem ostatniej komórki pamici RAM XRAMEND - stała bdca adresem ostatniej komórki zewntrznej pamici RAM E2END stała bdca adresem ostatniej komórki pamici EEPROM FLASHEND stała bdca adresem ostatniej komórki pamici FLASH SPM_PAGESIZE stała okrelajca rozmiar pamici bootloadera w bajtach 21
Moduł <stdlib/io.h> Moduł zawiera definicje makr i funkcji wymaganych przez standard jzyka i właciwych 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) 22
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 23
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 24
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 25
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 Moliwe 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 uytkownika (równie prolog i epilog) 26
Uycie makr modułu <interrupt.h> Przykład: ISR(INT0_vect) { PORTB = 42; } ISR_ALIAS(INT1_vect, INT0_vect); 27