background image

1

Programowanie 

mikrokontrolerów 

rodziny AVR

Narz dzia rozwojowe

background image

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++

background image

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

background image

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++

background image

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.

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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

background image

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)

background image

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)

background image

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,...)

background image

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)

background image

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 *))

background image

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() )

background image

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;

background image

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 

background image

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)

background image

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

background image

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__

background image

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

background image

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)

background image

27

Biblioteka avr-libc

U ycie makr modułu 

<interrupt.h>

Przykład:

ISR

(INT0_vect)

{

PORTB = 42;

}

ISR_ALIAS

(INT1_vect, INT0_vect);