Você está na página 1de 9

PROJEKTY

ATmega32U4-DIPMOD

AVT
5468

Breakout board dla mikrokontrolerw


AVR ATmega16U4/32U4
Prezentowany projekt powsta w zwizku z chci poznania
moliwoci komunikacyjnych mikrokontrolerw AVR z wbudowanym
interfejsem USB. W Elektronice Praktycznej byy ju opisywane
projekty wykorzystujce AVR-y oraz USB, jednak z dotychczas
przedstawionych wszystkie miay pewne niedocignicia. Midzy
innymi wykorzystyway programowy stos USB (ograniczajcy
maksymaln prdko transmisji i pozostawiajcy niewiele
mocy obliczeniowej na pozostae zadania), albo miay
niekonwencjonalny interfejs sprztowy, ktry czasami moe mie
problemy ze zgodnoci ze standardem. Przedstawione waciwoci
klasyfikuj te rozwizania jako moliwe do wykorzystania raczej
w mniej wymagajcych aplikacjach lub zabawkach, bardziej ni
w profesjonalnych urzdzeniach, ktre musz by przede wszystkim
niezawodne. Rozwizaniem opisanych problemw jest zastosowanie
mikrokontrolera majcego sprztowy interfejs USB.
Rekomendacje: doskonay projekt do nauki technik komunikowania
si oraz testowania rozwiza.

Dziki sprztowemu USB zyskuje si zgodno zestandardem oraz prostsze ipewniejsze sposoby oprogramowania tego interfejsu.
W projekcie zastosowano mikrokontroler
ATmega32U4, mona rwnie uy jego odpowiednika o mniejszej pamici Flash, tj.
ATmega16U4. Pytk drukowan zaprojektowano wten sposb, epasuje dostandardowych pytek stykowych umoliwiajc szybk
budow prototypw.

18

Opis urzdzenia
Projektujc urzdzenie staraem si uczyni
go jak najbardziej bezpiecznym i uniwersalnym, pamitajc jednoczenie, e jest
gwnie przeznaczony do umieszczania
napytce stykowej. Nie doprzecenienia jest
fakt, eukad moe by zasilany iprogramowany bezporednio zportu USB komputera,
cowwielu sytuacjach upraszcza iuprzyjemnia prac.

W ofercie AVT*
AVT-5468 A
AVT-5468 C

AVT-5468 B

Podstawowe informacje:

Napicie zasilania: 5 V z USB lub 3,3 V,


lub 79 V z zasilacza zewntrznego.
Mikrokontroler ATmega16U4 lub ATmega32U4.
Programowanie za pomoc USB.
Pasuje do pytek stykowych.

Dodatkowe materiay na FTP:


ftp://ep.com.pl, user: 42850, pass: 3063yuhc
wzory pytek PCB
Projekty pokrewne na FTP:
(wymienione artykuy s w caoci dostpne na FTP)

AVT-1795 Minimodu STK_Mega32USB


(EP 4/2014)
AVT-1777 TinyMini861 miniaturowy modu
ATtiny861 (EP 10/2013)
AVT-1752 ATmega128 na pytce ewaluacyjnej
AVT5311 (EP 8/2013)
AVT-1665 Modu wywietlacza LCD
z mikrokontrolerem Atmega8
(EP 2/2012)
AVT-1622 Minimodu z ATmega8 (EP 6/2011)
AVT-1610 Minimodu z ATtiny2313
(EP 3/2011)
AVT-1430 ATmega8 w AVT-992 (EP 7/2006)
* Uwaga:
Zestawy AVT mog wystpowa w nastpujcych wersjach:
AVT xxxx UK to zaprogramowany ukad. Tylko i wycznie. Bez elementw dodatkowych.
AVT xxxx A pytka drukowana PCB (lub pytki drukowane, jeli w opisie wyranie zaznaczono), bez elementw dodatkowych.
AVT xxxx A+
pytka drukowana i zaprogramowany ukad (czyli poczenie wersji A i wersji UK) bez elementw dodatkowych.
AVT xxxx B pytka drukowana (lub pytki) oraz komplet elementw
wymieniony w zaczniku pdf
AVT xxxx C to nic innego jak zmontowany zestaw B, czyli elementy
wlutowane w PCB. Naley mie na uwadze, e o ile
nie zaznaczono wyranie w opisie, zestaw ten nie ma
obudowy ani elementw dodatkowych, ktre nie zostay
wymienione w zaczniku pdf
AVT xxxx CD oprogramowanie (nieczsto spotykana wersja, lecz jeli
wystpuje, to niezbdne oprogramowanie mona cign,
klikajc w link umieszczony w opisie kitu)
Nie kady zestaw AVT wystpuje we wszystkich wersjach! Kada wersja
ma zaczony ten sam plik pdf! Podczas skadania zamwienia upewnij
si, ktr wersj zamawiasz! (UK, A, A+, B lub C). http://sklep.avt.pl

ELEKTRONIKA PRAKTYCZNA 10/2014

Breakout board dla mikrokontrolerw AVR ATmega16U4/32U4

Rysunek 1. Schemat ideowy ukadu ATmega32U4-DIPMOD


Narysunku1 pokazano schemat ideowy
pytki prototypowej. Przycza si j dokomputera zwykorzystaniem zcze CON3 typu
USB Mini B. Bezpiecznik F1 o wartoci
500mA ma nacelu ochron portu USB komputera w wypadku zwarcia na pytce, gdy
jest ona zniego zasilana (500mA tomaksymalna warto natenia prdu, ktr zgodnie ze standardem mona pobiera z portu
USB). Wartoci rezystancji R1 oraz R2 wzito
zkarty katalogowej mikrokontrolera.
Ukad
IC1
(USB6B1)
produkcji
STMicroelectronics chroni przed przepiciami mogcymi pojawia si na linii
transmisyjnej. Dziki wbudowanym diodom zapewnia on ograniczenie wysokich
napi mogcych wystpi naprzewodach
sygnaowych i zasilajcych. Poza interfejsem USB, ukad nadaje si m.in. doochrony interfejsu RS-485, a jego podstawow
zalet jest maa ilo miejsca zajmowanego
na pytce w porwnaniu z rozwizaniami
opartymi oelementy dyskretne.
Kondensatory C1 i C2, C9C12 i dawik L1 filtruj zaburzenia mogce wystpi na szynie zasilania. Dawik L1 to tzw.
koralik przeciwzakceniowy (ferrite bead),
ktrego rol jest absorbowanie prdu owyELEKTRONIKA PRAKTYCZNA 10/2014

sokiej czstotliwoci i wydzielanie go


w postaci iloci ciepa. Podana na schemacie warto 60 oznacza, e koralik ma
impedancj 60 V przy czstotliwoci
100 MHz (t warto warto zawsze konsultowa zdokumentacj danego modelu).
Wartoci elementw C1, L1, C2 zostay dobrane zgodnie zzaleceniami odszukanymi
w dokumentacji firm FTDI [1] oraz Texas
Instruments [2].
Pytk wyposaono w stabilizator napicia 3,3 V, dziki ktremu jest moliwy
wybr napicia zasilajcego mikrokontroler midzy +3,3V zestabilizatora a+5V
pobieranym zUSB. Nablok zasilania skadaj si elementy kondensatory C3 i C4,
ukad scalony IC2, rezystor R5, dioda D1,
zcza J1 iJ2. Pojemno kondensatora C3
(10mF) dobrano zgodnie zzaleceniami dokumentacji mikrokontrolera. Jeli miaaby
by wiksza, dla zgodnoci zestandardem
USB niezbdne moe okaza si zastosowanie soft startu w projektowanym urzdzeniu. Pojemno C4 (1mF) tominimalna
zalecana dla IC2. Ukad IC2 (MCP1825)
wybrano ze wzgldu na relatywnie may
(maks. 220 mA) pobierany prd, co moe
mie znaczenie przy testowaniu urzdze

USB wykorzystujcych tryb czuwania, gdy


pobierany prd nie powinien przekracza
wartoci 500 mA. Biorc pod uwag prd
pobierany przez wbudowane wmikrokontroler rezystory podcigajce magistral
USB (ok. 200mA) dla mikrokontrolera pozostaje okoo 80mA. Rola zworki J2 wydaje
si oczywista umoliwia ona odczenie
diody D1 (sygnalizujcej zasilanie), pobierajcej wtym wypadku znaczny prd.
Wyboru napicia zasilajcego mikrokontroler dokonuje si zwork J1. Ukad
REKLAMA

19

PROJEKTY

Rysunek 3. Schemat montaowy ukadu ATmega32U4-DIPMOD

Rysunek 2. Schemat (czciowy) bloku


zasilania mikrokontrolera ATmega32U4
zasilania mikrokontrolera wymaga kilku
sw wyjanienia, wczym pomocny bdzie
rysunek2 przedstawiajcy fragment budowy wewntrznej bloku USB mikrokontrolera ATmega32U4. Zgodnie zestandardem,
napicie zasilajce interfejsu USB wynosi
okoo +5V, za napicie poziomu wysokiego naliniach sygnaowych (D, D+) wynosi okoo +3,3V, dlatego mikrokontroler ma
wbudowany stabilizator napicia +3,3 V,
umoliwiajcy odpowiednie zasilanie linii
sygnaowych. Wejcie (UVCC) oraz wyjcie (UCAP) tego stabilizatora s dostpne na wyprowadzeniach mikrokontrolera.
W prezentowanym urzdzeniu, wejcie
stabilizatora (UVCC) przyczono na stae
do napicia VBUS (tj. +5 V z USB), natomiast do wyjcia (UCAP) jest przyczony
jedynie kondensator filtrujcy C8. Dziki
takiej konfiguracji, mikrokontroler moe
generowa wymagane poziomy napi interfejsu USB niezalenie od napicia zasilajcego (VCC). Dziki zworce J1, napicie
VCC mikrokontrolera moe zosta ustalone
na +5 V z USB lub +3,3 V ze stabilizatora IC2. Warto zaznaczy, e mikrokontroler moe pracowa w rnych konfiguracjach zasilania, ktre omwiono szerzej
Wykaz elementw
Rezystory: (SMD 0805)
R1, R2: 22 V
R3, R4: 4,7 kV
R5R8: 470 V
Kondensatory: (SMD 0805)
C1: 10 nF
C2, C5, C9C12: 100 nF
C3: 10 mF (SMD A)
C4, C8: 1 mF
C6, C7: 18 pF
Pprzewodniki:
D1D4: diody LED SMD
IC1: USB6B1 (SO-8)
IC2: MCP1825S-3.3 (TO-225)
IC3: ATmega32U4-AU lub ATmega64U4-AU
(TQFP-44)
Inne:
CON1, CON2: goldpin 161
CON3: gniazdo USB A (SMD)
F1: bezpiecznik polimerowy 0,5 A
J1: goldpin 13+zworka
J2: golpin 12+zworka
L1: 60 mH
Q1: kwarc 16 MHz
S1S5: mikroprzycisk SMD

20

w nocie katalogowej ukadu. Widoczne


narys.2 wyprowadzenie VBUS umoliwia
mikrokontrolerowi detekcj przyczenia
doUSB.
Rezonator kwarcowy Q1 oraz kondensatory C6 i C7 ustalaj czstotliwo taktowanie mikrokontrolera. Czstotliwo
Q1 jest krytyczna ipowinna wynosi 8 lub
16 MHz, poniewa tylko te wartoci zapewniaj poprawn prac interfejsu USB.
Dodatkowo, na maksymaln czstotliwo
taktowania ma wpyw napicie zasilajce: dla 3,3 V wynosi ona 8 MHz, dla 5 V
moe to 16 MHz. W trakcie uytkowania
nie stwierdziem niestabilnej pracy mikrokontrolera dla czstotliwoci 16 MHz
przy zasilaniu 3,3V, jednak nie naley tego
przyjmowa za regu.
Na pytce znalazo si rwnie miejsce
dla mikroprzecznikw S1S5 oraz diod
LED D2D4. Przycisk S1 suy do zerowania mikrokontrolera, za S2 douruchamiania
bootloadera (sposb programowania opisano
dalej). Przyciski oglnego przeznaczenia
S3S5, podobnie jak diody D2D4 mog
by wykorzystane dowolnie. Zworki J3
J5 pozwalaj na odczenie diod od mikrokontrolera. Linie przyciskw S1 iS2 zostay
podcignite do plusa zasilania za pomoc
rezystorw R3 oraz R4, za przyciski S3S5
mog by podcignite za pomoc rezystorw wbudowanych wmikrokontroler.
Nazcza CON1 iCON2 (goldpin) wyprowadzono wszystkie porty mikrokontrolera, sygna RESET, zasilanie oraz wejcie
napicia odniesienia przetwornika A/C.
Rozstaw zczy na pytce drukowanej wynosi 22,86 mm (92,54 mm), co pozwala
najej atwe umieszczenie wotworach pytki stykowej.

Monta iuruchomienie
Schemat montaowy pokazano na rysunku 3. Urzdzenie skada si gwnie z elementw SMD, w zwizku z tym wymaga
nieco wprawy w ich montau. Na samym
pocztku przestrzegam przed rozpoczciem
montau od elementw przewlekanych,
wtym przypadku zczy CON1, CON2 oraz
zworek J1J5 (naley je montowa nakocu). Ponadto, przydatne bd plecionka
ztopnikiem oraz topnik wpisaku.
Monta najwygodniej przeprowadzi
zaczynajc od elementw SMD na stronie
grnej. Na tym etapie nie naley montowa przyciskw S1S5, bezpiecznika F1,

kondensatora C4 oraz zcza USB CON3.


Nastpnie naley przylutowa elementy
SMD nastronie dolnej. Nieco uwagi wymaga monta Q1, gdy jego obudowa zasania
pola lutownicze. Montujc go naley ocynowa jedno zpl iprzylutowa doniego
jedno z wyprowadze Q1. Nastpnie zaaplikowa spor ilo topnika i przylutowa pozostae wyprowadzenia. W dalszej
kolejnoci naley przylutowa zcze USB,
lutujc najpierw wyprowadzenia obudowy,
apotem pozostae. Teraz mona ju przylutowa wszystkie pozostae elementy strony
grnej.
Zcza CON1 oraz CON2 naley montowa wten sposb, eby ich wyprowadzenia znajdoway si odstrony dolnej pytki.
Na pocztku naley delikatnie (bez wciskania) umieci pytk wpytce stykowej,
wyrwna zcza i przylutowa po dwa
przeciwlege wyprowadzenia. Nastpnie
wyj pytk i solidnie przylutowa pozostae wyprowadzenia. Czynno t warto
wykona bardzo starannie, co zaoszczdzi
pniejszych problemw zumieszczaniem
pytki w pytce stykowej oraz wyamywaniem si wyprowadze.
Zmontowany ukad naley sprawdzi
pod ktem wystpowania zwar, szczeglnie na szynie zasilania USB. Na listingu1 zamieszczono program umoliwiajcy
sprawdzenie dziaania przyciskw S2
S5 oraz diod D2D4. Dziaanie programu polega na zawieceniu diody znajdujcej si pod przyciskiem w odpowiedzi
na jego wcinicie. Nacinicie przycisku
S2 (HWB) powoduje zawiecenie wszystkich diod.

Programowanie
Mikrokontroler ATmega32U4 zosta fabrycznie wyposaony wbootloader umoliwiajcy programowanie zwykorzystaniem
USB, bez potrzeby korzystania zzewntrznego programatora. Bootloader w AVR
jest umieszczany na kocu pamici Flash,
wtzw. sekcji bootloadera. Zaraz postarcie,
mikrokontroler moe uruchomi program
wgrany przez uytkownika lub bootloader.
To, ktra aplikacja zostanie uruchomiona
(gwna czy bootloader) zaley od programu ikonfiguracji mikrokontrolera.
W fabrycznie nowym mikrokontrolerze ATmega32U4 bootloader uruchamia
si wymuszajc odpowiedni sekwencj
poziomw logicznych nawejciach RESET
ELEKTRONIKA PRAKTYCZNA 10/2014

i HWB mikrokontrolera, ktre na pytce


przyczono do przyciskw S1 oraz S2.
Sekwencja ta wyglda nastpujco: nacinicie S1 (stan niski na wejciu RESET),
nacinicie S2 (wyzerowane wejcie
HWB), zwolnienie S1 (ustawione wejcie
RESET), zwolnienie S2 (ustawione wejcie HWB). Po uruchomieniu bootloadera
mona przej do programowania ukadu
w systemie Windows mona skorzysta
z aplikacji Atmel FLIP, a pod Linuksem
zaplikacji dfu-programmer.
W systemie Windows jest niezbdne
zainstalowanie sterownika bootloadera.
Jeli FLIP zosta zainstalowany wdomylnym katalogu, topliki sterownika znajduj si w katalogu C:\Program Files\Atmel\
Flip 3.4.5\usb. Po poprawnym zainstalowaniu sterownika mona poczy si

Rysunek 4. Wygld okna programu FLIP


ELEKTRONIKA PRAKTYCZNA 10/2014

z pytk. W tym celu naley uruchomi


program FLIP, zmenu Device wybra opcj
Select, wybra docelowy mikrokontroler tj.
ATmega32U4, anastpnie zmenu Settings
wybra opcj Communication, dalej USB
i Open. Wygld programu po tych operacjach pokazano na rysunku 4. Aby wgra
wasny program do pamici mikrokontrolera, z menu File naley wybra opcj
Load HEX File i wskaza plik programu
w formacie Intel HEX, a nastpnie nacisn przycisk Run. Wgrany program mona uruchomi naciskajc przycisk Start
Application w programie FLIP lub restartujc mikrokontroler za pomoc przycisku
S1 napytce. Opisu pozostaych opcji programu FLIP naley szuka wpliku pomocy
dostpnym wmenu Help.
Programowanie pytki w systemie
Linux przy wykorzystaniu programu dfuprogrammer sprowadza si do wydania
nastpujcych polece:
$ dfu-programmer atmega32u4
erase
$ dfu-programmer atmega32u4 ash
plik_programu.hex
Ostatecznie, program mikrokontrolera
mona uruchomi poleceniem:
$ dfu-programmer atmega32u4
start
Wyjanienia dodatkowych opcji programu dfu-programmer naley szuka
wjego manualu.

REKLAMA

Listing 1. Program testujcy dziaanie przyciskw i diod LED


#include <avr/io.h>
int main( void )
{
// Piny przyciskw jako wejcia z rezystorami podcigajcymi.
DDRB &= ~( (1<<PB6) | (1<<PB4) ); // S3 & S4
PORTB |= ( (1<<PB6) | (1<<PB4) ); // S3 & S4
DDRD &= ~(1<<PD7); // S5
PORTD |= (1<<PD7); // S5
DDRE &= ~(1<<PE2); // S2 (HWB)
// Piny diod LED jako wyjcia.
DDRD |= ( (1<<PD6) | (1<<PD5) | (1<<PD4) ); // D2, D3 & D4.
// Ptla zapalajca diod w odpowiedzi na nacinicie przycisku.
while( 1 )
{
if( !( PINB & (1<<PB6) ) ) // S3 & D2.
{
PORTD |= (1<<PD6);
}
else
{
PORTD &= ~(1<<PD6);
}
if( !( PINB & (1<<PB4) ) ) // S4 & D3.
{
PORTD |= (1<<PD5);
}
else
{
PORTD &= ~(1<<PD5);
}
if( !( PIND & (1<<PD7) ) ) // S5 & D4.
{
PORTD |= (1<<PD4);
}
else
{
PORTD &= ~(1<<PD4);
}
if( !( PINE & (1<<PE2) ) ) // S2 (HWB) & D2, D3 & D4.
{
PORTD |= ( (1<<PD6) | (1<<PD5) | (1<<PD4) );
}
else
{
PORTD &= ~ ( (1<<PD6) | (1<<PD5) | (1<<PD4) );
}
}
}

21

PROJEKTY
Listing 2. Reguy demona udev pozwalajce programowa mikrokontroler uytkownikom nalecym do grupy plugdev (dotyczy
systemu Linux)
SUBSYSTEM==usb,ACTION==add,ATTRS{idVendor}==03eb,ATTRS{idProduct}==2ff4,GROUP=plugdev
SUBSYSTEM==usb,ACTION==add,ATTRS{idVendor}==03eb,ATTRS{idProduct}==2104,GROUP=plugdev
Listing 3. Dostosowanie pliku makele projektu LUFA do prezentowanej pytki
// Przed zmian:
MCU = at90usb1287
BOARD = USBKEY
F_CPU = 8000000
LUFA_PATH = ../..
// Po zmianie:
// Uyty mikrokontroler.
MCU = atmega32u4
// Pliki sterownikw bd deniowane przez programist.
BOARD = USER
// Czstotliwo kwarcu. Naley wpisa zgodnie z uytym kwarcem oraz ustawieniem fusebitu CKDIV8.
F_CPU = 16000000
// cieka do biblioteki.
LUFA_PATH = ../../LUFA-120219

W systemie Linux wan rol odgrywa posiadanie odpowiednich uprawnie,


pozwalajcych na dostp do urzdzenia
USB, w tym przypadku bootloadera prezentowanej pytki, wic pierwsze prby
warto przeprowadzi na koncie uytkownika root, aby od razu wykluczy problemy z uprawnieniami. Dodatkowo, na listingu2 przedstawiono dwie reguy demona
udev, dziki ktrym pliki urzdze tworzone dla bootloadera USB lub programatora AVRISP mkII bd naleay dogrupy

plugdev, umoliwiajc bezproblemowy dostp wszystkim uytkownikom nalecym


dotej grupy. Wprzypadku mojej dystrybucji (Slackware 13.37) okazao si niezbdne odmontowanie systemu plikw usbfs
zkatalogu /proc/bus/usb.
Na zakoczenie warto zaznaczy,
e bootloader nie umoliwia zmiany fusebitw, ale pozwala nazmian lockbitw
oraz nie umoliwia wymiany siebie samego. Ograniczenia tenie dotycz programowania z wykorzystaniem standardowego

Listing 4. Dostosowanie pliku LEDs.h do prezentowanej pytki


(...)
/** LED mask for the rst LED on the board. */
#dene LEDS_LED1 (1<<PD6)
/** LED mask for the second LED on the board. */
#dene LEDS_LED2 (1<<PD5)
/** LED mask for the third LED on the board. */
#dene LEDS_LED3 (1<<PD4)
/** LED mask for the fourth LED on the board. */
#dene LEDS_LED4 (1<<PD4)
(...)
static inline void LEDs_Init(void)
{
DDRD |= LEDS_ALL_LEDS;
PORTD &= ~LEDS_ALL_LEDS;
}
static inline void LEDs_Disable(void)
{
DDRD &= ~LEDS_ALL_LEDS;
PORTD &= ~LEDS_ALL_LEDS;
}
static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
{
PORTD |= LEDMask;
}
static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
{
PORTD &= ~LEDMask;
}
static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
{
PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
}
static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t
ActiveMask)
{
PORTD = ((PORTD & ~LEDMask) | ActiveMask);
}
static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
{
PORTD ^= LEDMask;
}
static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
static inline uint8_t LEDs_GetLEDs(void)
{
return (PORTD & LEDS_ALL_LEDS);
}
(...)

22

interfejsu ISP, jednak w tym przypadku


jest niezbdny zewntrzny programator.

LUFA

Interfejs USB, wprzeciwiestwie donp. RS232, nie naley donajprostszych woprogramowaniu. W jego wypadku najwygodniej
skorzysta z gotowych bibliotek uatwiajcych obsug. Jedn z chyba najbardziej
popularnych bibliotek USB dla mikrokontrolerw AVR jest LUFA (Lightweight USB
Framework for AVRs), ktrej podstawy uycia
przedstawi korzystajc z omawianej pytki. W przykadach wykorzystano bibliotek
LUFA o oznaczeniu 120219, ktr mona
pobra spod adresu http://goo.gl/NrWlmv.
Wszystkie przykady byy kompilowane
oraz testowane w systemie operacyjnym
Linux (Slackware) przy wykorzystaniu
kompilatora AVR-GCC (w wersji Atmel AVR
8-bit Toolchain 3.4.0 Linux 32-bit). Naley
zaznaczy, e LUFA zostaa napisana pod
ktem kompilatora GCC izduym prawdopodobiestwem nie ma prostej moliwoci
wykorzystania innego.

Podstawy konfiguracji LUFA


Biblioteka zostaa skonstruowana wten sposb, e moliwe jest szybkie uruchomienie
wybranego przykadu tak nawasnej pytce,
jak i wielu popularnych pytkach rozwojowych (np. AT90USBKEY, XPLAIN). Spord
pokanej iloci przykadowych projektw
wiele moe zosta wykorzystanych praktycznie bez wikszych zmian w kodzie.
Na potrzeby niniejszego artykuu przyjmijmy, erda biblioteki zostay rozpakowane
do katalogu ep-avr-usb katalogu domowego,
za przykadowe projekty bd kopiowane
dokatalogu projects znajdujcego si wkatalogu ep-avr-usb. Kopiowanie projektu nie jest
konieczne, jednak zapobiega tworzeniu baaganu wrdach biblioteki. Ukad katalogw
bdzie nastpujcy:

~/ep-avr-usb/LUFA-120219 oryginalne pliki rdowe biblioteki,

~/ep-avr-usb/projects/przykladowy_projekt_1 pierwszy projekt,

~/ep-avr-usb/projects/przykladowy_projekt_2 drugi projekt.


ELEKTRONIKA PRAKTYCZNA 10/2014

Breakout board dla mikrokontrolerw AVR ATmega16U4/32U4


Listing 5. Dostosowanie pliku Buttons.h do prezentowanej pytki
(...)
#dene BUTTONS_BUTTON1
(1<<PB6)
#dene BUTTONS_BUTTON2
(1<<PB4)
#dene BUTTONS_ALL_BUTTONS ( BUTTONS_BUTTON2 | BUTTONS_BUTTON1 )
(...)
static inline void Buttons_Init(void)
{
DDRB &= ~BUTTONS_ALL_BUTTONS;
PORTB |= BUTTONS_ALL_BUTTONS;
}
static inline void Buttons_Disable(void)
{
DDRB &= ~BUTTONS_ALL_BUTTONS;
PORTB &= ~BUTTONS_ALL_BUTTONS;
}
static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
static inline uint8_t Buttons_GetStatus(void)
{
return ( (PINB & BUTTONS_ALL_BUTTONS) ^ BUTTONS_ALL_BUTTONS );
}
(...)

Biblioteka zapewnia spjne API oraz


spjn struktur katalogw, dziki czemu
dostosowanie wybranego przykadu na potrzeby prezentowanej pytki sprowadza si
do wykonania kilku prostych czynnoci.
Czynnoci te s takie same dla wszystkich
przedstawionych przykadw ipolegaj na:

skopiowaniu wybranego przykadu


dokatalogu projects,

dostosowaniu pliku makefile danego przykadu,

skopiowaniu iuzupenieniu plikw


sterownikw urzdze.
Kady projekt wchodzcy w skad biblioteki posiada plik makefile, ktry naley
dostosowa doposiadanego sprztu. Nalistingu 3 przedstawiona zostaa cz zmian,
dostosowujcych wybrany projekt do prezentowanej pytki. Celowo napisaem cz
zmian, gdy rne przykady mog wymaga dodatkowych, drobnych zmian. Warto
wiedzie, eplik makefile pozwala rwnie
na szybkie zaprogramowanie mikrokontrolera, wystarczy jedynie wyda polecenie
make dfu lub make flip w katalogu z przykadow aplikacj (oczywicie bootloader
mikrokontrolera powinien by wtedy uruchomiony).
Niektre aplikacje LUFA mog wymaga
przyczenia domikrokontrolera np. przyciskw bd diod LED. W celu zapewnienia
spjnoci, biblioteka zawiera szablonowe
pliki sterownikw tych elementw, ktre
naley skopiowa dopodkatalogu Board katalogu danego przykadu, a nastpnie uzupeni ich zawarto. Szablony sterownikw
znajduj si wkatalogu: ~/ep-avr-usb/LUFA120219/LUFA/CodeTemplates/DriverStubs,
za po skopiowaniu ich cieka powinna
wyglda tak:

~/ ep-avr-usb/projects/przykladowy_projekt_1/Board/LEDs.h.

~/ep-avr-usb/projects/przykladowy_projekt_1/Board/Buttons.h.

itd.
Na listingu 4 pokazano fragment pliku
LEDs.h uzupeniony odefinicje wymagane dla
prezentowanej pytki. Makrom LEDS_LED1
ELEKTRONIKA PRAKTYCZNA 10/2014

LEDS_LED4 zostay przypisane numery pinw, doktrych przyczone sposzczeglne


diody. Poniewa na pytce mamy do dyspozycji trzy diody LED, aplik wymaga podania
czterech, programowym diodom 3 i 4 odpowiada jedna fizyczna dioda D4. Aby wszystkie diody dziaay prawidowo, powinny by
przyczone dojednego portu mikrokontrolera. Funkcje odpowiedzialne za obsug diod
(LEDs_*) uzupenione zostay na podstawie pliku ~/ep-avr-usb/LUFA-120219/LUFA/
Drivers/Board/AVR8/USBKEY/LEDs.h.
Jeeli
nie potrzebujemy sygnalizacji wykorzystujcej LED-y, makrom LEDS_LED1..LEDS_LED4
moemy przypisa warto 0, aciaa funkcji
pozostawi puste (jedynie w funkcji LEDs_
GetLEDs() naley zwrci warto 0, aby
unikn ostrzee o braku zwracania wartoci wczasie kompilacji).
Na listingu 5 przedstawiono fragment
pliku Buttons.h, uzupeniony o definicje wymagane dla prezentowanej pytki. Makrom
BUTTONS_BUTTON1 oraz BUTTONS_
BUTTON2 przypisane zostay numery pinw, doktrych przyczone sodpowiednio
przyciski S3 oraz S4. Funkcje odpowiedzialne
za obsug przyciskw (Buttons_*) uzupenione zostay na podstawie pliku ~/ep-avr-usb/LUFA-120219/LUFA/Drivers/Board/AVR8/
USBKEY/Buttons.h. W przypadku dwch lub
wicej przyciskw, powinny one by przyczone dojednego portu mikrokontrolera (std
brak uwzgldnienia przycisku S5, przyczonego doportu D). Alternatywnie, naleaoby
napisa wasn obsug, uwzgldniajc np.
likwidacj drga stykw.
Wdalszej czci artykuu przedstawione
zostan przykady wykorzystania opisywanej pytki w poczeniu z bibliotek LUFA.
W celu kompilacji danego projektu naley
wyda polecenie make. I tu jedna uwaga jeli wczeniej kompilowalimy jaki inny
projekt, warto przed poleceniem make wyda polecenie make clean, ktre oczyci bibliotek zplikw obiektowych poprzedniego
projektu. Niestosowanie si do tej reguy
moe powodowa dziwne i cikie do usunicia bdy kompilacji.

Bootloader
Wczeniej wspomniaem, e mikrokontroler
ATmega32U4 ma preinstalowany bootloader
umoliwiajcy wgranie wasnego programu.
Problem wtym, enie majc dostpu dokodu
rdowego tego bootloadera, jestemy skazani na konfiguracj producenta (np. dotyczc
sposobu uruchamiania). Wyjciem ztej sytuacji
moe by wykorzystanie ktrego zbootloaderw dostpnych wbibliotece LUFA.
Dowyboru mamy trzy wersje bootloadera:
HID, CDC oraz DFU. Wersja HID korzysta zklasy USB HID, tj. urzdzenia interfejsu czowiek
komputer, cooznacza, esystem operacyjny
posiada wbudowany sterownik dojego obsugi
(ten sam, ktry jest uywany np. dla klawiatury czy myszy). Wbibliotece, wraz zbootloaderem jest dostarczana aplikacja do jego obsugi
(hid_bootloader_cli). Wersja CDC korzysta zklasy USB CDC, tj. urzdzenia przeznaczonego
dokomunikacji ijest widziana wsystemie jako
wirtualny port szeregowy. Podobnie jak wprzypadku bootloadera HID, sterowniki dla bootloadera CDC swbudowane wsystem operacyjny.
Bootloader ten korzysta z protokou AVR109,
za programowanie moliwe jest m.in. za pomoc aplikacji avrdude. Ostatni bootloader,
tojest wwersji DFU, korzysta zklasy USB DFU,
przeznaczonej dla urzdze wspierajcych
aktualizacj firmware. Co wane, jest zgodny
zfabrycznym bootloaderem Atmela, wzwizku
ztym programowanie odbywa si widentyczny sposb (opisany wsekcji Programowanie),
przy wykorzystaniu programw FLIP lub dfu-programmer. Temu bootloaderowi przyjrzymy
si bliej.
Prac rozpoczynamy od skopiowania katalogu ~/ep-avr-usb/LUFA-120219/Bootloaders/
DFU do katalogu ~/ep-avr-usb/projects/DFU.
Nastpnie w katalogu DFU tworzymy katalogBoard i kopiujemy do niego plik ~/ep-avr-usb/LUFA-120219/LUFA/CodeTemplates/
DriverStubs/LEDs.h. Plik LEDs.h uzupeniamy
zgodnie zlist. 4. Wprzypadku tego przykadu
nie jest wymagany plik Buttons.h. Plik makefile projektu modyfikujemy zgodnie z list. 3,
dodatkowo zmieniajc definicj FLASH_SIZE_
KB = 128 na FLASH_SIZE_KB = 32 (okrela
ona wielko pamici Flash uytego mikroREKLAMA

23

PROJEKTY
Listing 6. Przykad kodu uruchamiajcego bootloader
// Pin PE2 (S2, HWB) jako wejcie, wczenie/wyczenie rezystora podcigajcego nie ma znaczenia
// bo PE2 jest podcignity za pomoc R4 na pytce.
DDRE &= ~(1<<PE2);
// Sprawd stan przycisku i ustaw ag RunBootloader na true, jeli przycisk nacinity,
// w przeciwnym razie ustaw ag na false.
RunBootloader = (!(PINE & (1<<PE2)));
// Uruchom aplikacj uytkownika, jeli bootloader nie ma by uruchomiony.
if( !RunBootloader ) AppStartPtr();
Listing 7. Dodatkowe zmiany w pliku makele przykadu
programatora AVRISP mkII
// Przed zmian:
LUFA_OPTS += -D AUX_LINE_MASK=(1 << 4)
#LUFA_OPTS += -D NO_VTARGET_DETECT
// Po zmianie:
LUFA_OPTS += -D AUX_LINE_MASK=(1 << 7)
LUFA_OPTS += -D NO_VTARGET_DETECT

kontrolera). W pliku BootloaderDFU.h makru


SECURE_MODE mona przypisa warto
true, cospowoduje, ejedyn moliw operacj
na pamici po uruchomieniu bootloadera bdzie jej skasowanie (wszczeglnoci, przed skasowaniem, niemoliwe bdzie jej odczytanie).
Zabieg ten (wraz zodpowiednim ustawieniem
lockbitw) ma nacelu uniemoliwienie skopiowania zawartoci pamici osobom postronnym.
Ostatnia modyfikacja dotyczy sposobu uruchamiania bootloadera (opisany zostanie sposb wykorzystujcy przycisk, ale moe to by
dowolny inny, wymylony przez programist).
Zaoenie jest takie, ebootloader bdzie uruchamiany w taki sam sposb jak fabryczny
bootloader, czyli poprzez odpowiedni sekwencj naciskania przyciskw S1 (RESET) oraz S2
(HWB). Zmiany wprowadzimy wgwnym pliku aplikacji, tj. BootloaderDFU.c. To, czy bootloader zostanie uruchomiony, zaley odwartoci
zmiennej RunBootloader, ktrej pocztkowa
warto wynosi true. Na listingu 6 przedstawiony zosta kod odpowiedzialny za sprawdzenie stanu przycisku S2 oraz odpowiednie
ustawienie zmiennej RunBootloader. Kod ten
naley umieci w pliku BootloaderDFU.c
napocztku funkcji main(), przed wywoaniem
funkcji SetupHardware(). Po skompilowaniu
projektu, pytk naley zaprogramowa plikiem
BootloaderDFU.hex, za sam bootloader uruchomi zgodnie zopisem wsekcji Programowanie.
W celu wymiany bootloadera niezbdny
jest osobny programator, gdy bootloadery najczciej nie wspieraj wymiany siebie samego.
Ja uyem drugiej pytki ATmega32U4-DIPMOD
z aplikacj AVRISP mkII, ktrej uruchomienie
i wykorzystanie zostao opisane w nastpnej
sekcji.
W czasie aktualizacji bootloadera warto
zwrci uwag na odpowiednie ustawienie
fusebitw mikrokontrolera, w szczeglnoci
HWBE, BOOTRST oraz CKDIV8. W tabeli 1
przedstawiony zosta sposb uruchamiania
mikrokontrolera w zalenoci od ustawienia
bitw HWBE i BOOTRST oraz stanu panujcego napinie HWB (PE2). Uwaam, ebootloader powinien by uruchamiany jako pierwszy
(BOOTRST ustawiony) i decydowa czy skoczy doprogramu gwnego, czy przej dotrybu programowania. Tym sposobem, progra-

24

Listing 8. Zmiana w pliku V2Protocol.c przykadu


programatora mkII

// Linijka 56 przed zmian:


#if dened(ADC)

// Linijka 56 po zmianie:

#if (dened(ADC) && !dened(NO_VTARGET_DETECT))

Tabela 1. Wpyw ustawienia fusebitw HWBE i BOOTRST oraz stanu na pinie


HWB (PE2) na proces uruchamiania mikrokontrolera
BOOTRST
1
0
0
0
W przypadku fusebitw:
W przypadku pinu PE2:

HWBE
HWB (PE2)
Uruchamiany program
X
X
Bootloader
0
X
Program gwny
1
0
Bootloader
1
1
Program gwny
1 ustawiony, 0 nieustawiony, X dowolny
1 poziom wysoki, 0 poziom niski, X dowolny

mowanie bdzie moliwe nawet wprzypadku


uszkodzenia programu gwnego. Bit CKDIV8
(domylnie wczony) odpowiedzialny jest za
wewntrzny podzia czstotliwoci taktujcej
przez 8, tzn. jeli zastosujemy kwarc 8 MHz
tordze (inie tylko) bdzie taktowany czstotliwoci 1MHz. Naley mie tonauwadze przy
ustalaniu wartoci F_CPU w pliku makefile
(poza fusebitem CKDIV8, istnieje rwnie moliwo programowego wyczenia tego podziau
za pomoc funkcji clock_prescale_set() funkcjonalno tajest czsto wykorzystywana wbibliotece LUFA, oczym te naley pamita). Bit
ten nie ma wpywu nadziaanie interfejsu USB,
gdy ten korzysta zPLL ijest taktowany osobno
(jakkolwiek ztego samego kwarcu).

Programator AVRISP mkII

am dodokumentacji LUFA, za poniej opisz


jak dostosowa programator doprezentowanej
pytki iwykona przykadowe poczenia interfejsu ISP.
Pliki rdowe programatora znajduj
si w katalogu ~/ep-avr-usb/LUFA-120219/
Projects/AVRISP-MKII i naley je skopiowa
dokatalogu ~/ep-avr-usb/projects/AVRISP-MKII.
Nastpnie w katalogu AVRISP-MKII tworzymy
katalog Board ikopiujemy doniego plik ~/ep-avr-usb/LUFA-120219/LUFA/CodeTemplates/
DriverStubs/LEDs.h, ktry naley uzupeni
zgodnie zlistingiem4. Wprzypadku tego przykadu nie jest wymagany plik Buttons.h. Plik
makefile projektu modyfikujemy zgodnie zlistingiem3 oraz listingiem7. Znaczenie wybranych opcji konfiguracyjnych jest nastpujce:

AUX_LINE_* (PORT, PIN, DDR,


MASK) okrelenie pinu odpowiedzialnego za obsug linii RESET
programowanego
mikrokontrolera.
Pin ten warto wybra na kocu, aby
nie kolidowa z pozostaymi pinami
interfejsu programowania (nie moe
toby rwnie pin SS moduu SPI mikrokontrolera)

NO_VTARGET_DETECT wyczenie pomiaru napicia wukadzie programowanym. Programator posiada


opcj pomiaru tego napicia, zktrej

Mona si kci, czy warto robi wasny programator, czy lepiej kupi gotowy. Zwolennikw
pierwszej opcji zachcam dodalszej lektury, za
zwolennikw drugiej... rwnie, gdy czasem
moe si zdarzy, euszkodzimy jedyny programator, jakim dysponujemy, a wtedy bdziemy
wstanie szybko zrobi co swojego.
Biblioteka LUFA zawiera projekt programatora AVRISP mkII, bdcego wznacznym stopniu kompatybilnym, jeli chodzi o firmware,
bosprzt jest owiele uboszy, zprogramatorem
Atmela otej samej nazwie. Programator obsuguje trzy interfejsy programowania, tj. ISP
Listing 9. Denicje obsugi przetwornika
(np. ATmega), PDI (np. ATxmega) oraz
A/C dla przykadu joysticka
TPI (np. ATtiny omaej liczbie wyprowa#ifndef JOYSTICK_H
#dene JOYSTICK_H
dze) oraz moe by obsugiwany z po#include <LUFA/Drivers/Peripheral/ADC.h>
ziomu AVRStudio lub avrdude. W prze// Ilo prbek na kana.
ciwiestwie do programatora Atmela,
#dene JOY_ADC_SAMPLES_NUM 8
programator z biblioteki LUFA wymaga
// Kana ADC dla osi Y.
#dene JOY_ADC_CHANNEL_Y
ADC_CHANNEL0
trzech osobnych wtykw do kadego
// Kana ADC dla osi X.
z wymienionych interfejsw programo#dene JOY_ADC_CHANNEL_X
ADC_CHANNEL1
#endif
wania. Po szczegowe informacje odsy-

ELEKTRONIKA PRAKTYCZNA 10/2014

Breakout board dla mikrokontrolerw AVR ATmega16U4/32U4


Listing 10. Denicja zmiennych
zawierajcych aktualne pooenie
joysticka
static int8_t y_ax;
static int8_t x_ax;

nie bdziemy korzysta w prezentowanym przykadzie

LIBUSB_DRIVER_COMPAT wczenie trybu kompatybilnoci z libusb, z ktrego korzysta m.in. avrdude. Niestety, jednoczenie tracona
jest kompatybilno z AVRStudio.
Jakkolwiek, nie stwierdziem bdnego dziaania avrdude (wersja 5.11.1,
Linux) przy braku ustawienia tej opcji
Zewzgldu nabd wpliku Lib/V2Protocol.c,
niezbdne jest jego poprawienie zgodnie zlistingiem8 (dotyczy wersji LUFA-120219 iprawdopodobnie wczeniejszych).
Zwracam uwag na fakt, e interfejs programowania ISP korzysta zmoduu SPI mikrokontrolera, za interfejsy PDI oraz TPI korzystaj
zUSART-umikrokontrolera, cowie si zkoniecznoci wykonania pocze wodpowiedni
sposb. Narysunku5 pokazano schemat pocze w przypadku programowania mikrokontrolerw z serii ATmega za pomoc interfejsu
SPI. Naley pamita o zachowaniu kompatybilnoci poziomw logicznych midzy pytk,
aukadem programowanym (tj. oba ukady powinny by zasilane napiciem 5V lub 3,3V).
Bardziej rozbudowane wersje interfejsu programujcego, zawierajce midzy innymi konwerter poziomw oraz interfejsy PDI oraz TPI,
mona znale wInternecie pod hasem mkII
clone (naElportalu mona znale projekt onazwie Programator USBTiny MKII PL. Napinie
OC1A (PB5) mikrokontrolera jest generowany
sygna o czstotliwoci 4 MHz, ktry mona
wykorzysta w celu odblokowania mikrokontrolera AVR zablokowanego nieprawidowym
ustawieniem fusebitw. Sygna ten naley doprowadzi do pinu XTAL1 odblokowywanego
mikrokontrolera, za czstotliwo interfejsu
ISP powinna by ustawiona na125kHz.
Po skompilowaniu przykadu, pytk naley zaprogramowa plikiem AVRISP-MKII.hex
(w tym celu mona skorzysta z bootloadera
ipolecenia make dfu). Poprzyczeniu dokomputera, pytka bdzie widziana jako programator AVRISP mkII. Wsystemie Windows naley
zainstalowa sterownik dostpny wAVRStudio,

Rysunek 5. Schemat pocze interfejsu ISP

w przypadku Linuksa, programator powinien


by odrazu gotowy douycia.

Joystick USB

Joystick to przykad urzdzenia wykorzystujcego klas HID USB, czyli urzdzenia stanowicego interfejs midzy czowiekiem akomputerem. Oryginalny przykad joysticka zbiblioteki
LUFA w celu aktualizacji wsprzdnych XY
wykorzystuje joystick oparty o styki, co uniemoliwia ich pynn zmian (moliwe stylko
skrajne pooenia). Poniej poka jak zmodyfikowa przykad, aby korzysta zprzetwornika
A/C wbudowanego wmikrokontroler, za zmiana wsprzdnych odbywaa si za pomoc
dwch potencjometrw orezystancji 10kV.
Podobnie jak poprzednio, prac naley
rozpocz od skopiowania przykadu, ktry
znajduje si w katalogu ~/ep-avr-usb/LUFA120219/Demos/Device/ClassDriver/Joystick, nastpnie naley utworzy katalog sterownikw
Board i skopiowa do niego pliki LEDs.h oraz
tym razem Buttons.h, oba uzupeniajc zgodnie
zlist.4 oraz 5. Dodatkowo naley utworzy plik
Joystick.h otreci jak nalistingu9. Gdybymy
chcieli uruchomi oryginalny przykad, plik
ten pochodziby zkatalogu DriverStubs iodpowiadaby za joystick oparty ostyki. Wnaszym
przypadku, w pliku tym okrelilimy kanay
przetwornika A/C, doktrych bd przyczone
potencjometry osi X iY oraz ile prbek zdanego
kanau naley pobra przed waciw aktualizacj wsprzdnych (zabieg ten ma nacelu eliminacj zakce mogcych pojawia si nawejciu przetwornika A/C). Plik makefile projektu
modyfikujemy zgodnie zlistingiem3, poza tym
nie wymaga ondodatkowych zmian.
W prezentowanym przykadzie zadowolimy si 8-bitow rozdzielczoci przetwornika, ktra jest rwnie wystarczajca dla wielu
zastosowa praktycznych. O minimalnej oraz
maksymalnej wartoci wychylenia joysticka
naley poinformowa komputer, co zrobi za
nas biblioteka. Wartoci te podajemy w pliku
Descriptors.c w linii 56. Omawiany przykad
operuje nawsprzdnych X iY, ktre stypu
int8_t (istnieje moliwo zmiany tego typu),
czyli ozakresie wartoci 128 +127, za zakres
wartoci przetwornika A/C to0255 (uint8_t),
wic wprogramie niezbdne bdzie dokonanie
prostego przeksztacenia zakresu wartoci typu
uint8_t na int8_t. Linia 56 bdzie wygldaa

nastpujco: HID_DESCRIPTOR_JOYSTICK(2,
128, 127, 1, 1, 2).
Teraz pozostaje ju tylko doda obsug iodczyt przetwornika A/C wgwnym pliku aplikacji (Joystick.c). Popierwsze, dyrektyw #include
<LUFA/Drivers/Peripheral/ADC.h> doczamy
funkcje obsugi przetwornika, nastpnie wmiejscu przed wywoaniem funkcji main() dodajemy dwie zmienne globalne, ktre bd zawieray aktualne pooenie potencjometrw joysticka (listing 10). W funkcji SetupHardware()
zamiast funkcji Joystick_Init() naley wstawi
wywoanie funkcji ADC_Init( ADC_SINGLE_
CONVERSION | ADC_PRESCALE_128 ), ktre
skonfiguruje przetwornik dopracy wtrybie pojedynczej konwersji, przy czstotliwoci taktowania rwnej F_CPU / 128.
W funkcji main() dodajemy waciwy odczyt wartoci z przetwornika. Biblioteka udostpnia kilka rnych funkcji, przy czym prezentowany przykad korzysta znastpujcych:

ADC_SetupChannel() wybr kanau


pomiarowego,

ADC_GetChannelReading() wykonanie i odczyt pomiaru z oczekiwaniem nazakoczenie konwersji.


Dokadny opis parametrw wywoania
funkcji przetwornika A/C mona znale
w dokumentacji biblioteki, za opis parametrw uytych w przykadzie znajduje si
w komentarzach. Na listingu 11 pokazano
zmodyfikowan wersj ptli gwnej programu Joysticka, uzupeniona oodczyt przetwornika. Jak wczeniej wspomniaem, w celu
likwidacji zakce mogcych pojawia si
na wejciu przetwornika, warto napicia
zpotencjometru joysticka jest mierzona kilkukrotnie wptli for, kolejne odczyty ssumowane, a nastpnie uredniane poprzez dzielenie. Na sam koniec, od redniej wartoci
odczytu odejmowana jest warto 128, dziki
czemu liczba bez znak ozakresie wartoci 0
255 (uint8_t) zostaje zamieniona na liczb
zeznakiem ozakresie wartoci 128 +127
(int8_t). Zwracam uwag nafakt, emoliwe
jest bezporednie wykorzystanie 10-bitowego
wyniku pomiaru przetwornika A/C zzakresu
0 1023 (bez znaku), bez koniecznoci jego zamiany naliczb zeznakiem. WprzedstawioREKLAMA

PROJEKTY
Listing 11.
for (;;)
{
// Suma
int16_t
int16_t

Zmodykowana ptla gwna przykadu Joysticka


kolejnych prbek poszczeglnych kanaw ADC.
y_ax_sum = 0;
x_ax_sum = 0;

// Ptla pomiarowa. Napicie poszczeglnych kanaw zostanie zmierzone


// tyle razy, ile okrelono w staej JOY_ADC_SAMPLES_NUM.
for( uint8_t i = 0; i < JOY_ADC_SAMPLES_NUM; i++ )
{
// Wybr kanau zapisanego w staej JOY_ADC_CHANNEL_Y.
ADC_SetupChannel( JOY_ADC_CHANNEL_Y );
// Pomiar napicia wybranego kanau ADC. Parametr wywoania oznacza, e:
// a) napicie odniesienia przetwornika pobierane jest z pinu AVCC (ADC_REFERENCE_AVCC)
// b) wynik pomiaru jest wyrwnany do lewej strony (ADC_LEFT_ADJUSTED)
// c) wybrany zostaje kana okrelony w staej JOY_ADC_CHANNEL_Y
// Funkcja ADC_GetChannelReading() czeka w ptli na zakoczenie konwersji. Wynik, przed dodaniem
// do zmiennej sumy prbek jest przesuwany o 8 bitw w prawo, poniewa parametr ADC_LEFT_ADJUSTED
// oznacza, e 8 najbardziej znaczcych bitw 10 bitowego wyniku pomiaru jest umieszczanych w
// bardziej znaczcym bajcie 16 bitowego wyniku zwracanego przez funkcj. Dziki tym operacjom,
// wynik przetwarzania jest 8 bitowy, bazujc na 10 bitowym przetworniku.
y_ax_sum += ADC_GetChannelReading( ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | JOY_ADC_CHANNEL_Y ) >> 8;
}

ADC_SetupChannel( JOY_ADC_CHANNEL_X );
x_ax_sum += ADC_GetChannelReading( ADC_REFERENCE_AVCC | ADC_LEFT_ADJUSTED | JOY_ADC_CHANNEL_X ) >> 8;

// Obliczenie pozycji potencjometrw osi X-Y. Po pierwsze, wynik pomiaru (suma prbek)
// poszczeglnych kanaw jest uredniany (dzielony przez JOY_ADC_SAMPLES_NUM). Nastpnie
// warto bez znaku z zakresu 0-255 jest zamieniana na warto ze znakiem z
// zakresu -128 - +127, poprzez odjcie wartoci 128 (255 - 128 = 127, 0 - 128 = -128).
y_ax = (y_ax_sum / JOY_ADC_SAMPLES_NUM) - 128;
x_ax = (x_ax_sum / JOY_ADC_SAMPLES_NUM) - 128;

HID_Device_USBTask(&Joystick_HID_Interface);
USB_USBTask();

Listing 12. Ciao funkcji odpowiedzialnej za tworzenie raportu HID joysticka


nym przykadzie zrezygnowaem jedUSB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;
uint8_t ButtonStatus_LCL = Buttons_GetStatus();
nak ztakiego rozwizania, gdy zmienne wyniku pomiaru s wspdzielone
JoystickReport->Y = y_ax;
JoystickReport->X = x_ax;
midzy ptl gwn a przerwaniem,
if (ButtonStatus_LCL & BUTTONS_BUTTON2)
a jak wiadomo, w przypadku 8-bitoJoystickReport->Button |= (1 << 1);
if (ButtonStatus_LCL & BUTTONS_BUTTON1)
wego mikrokontrolera oraz zmiennych
JoystickReport->Button |= (1 << 0);
*ReportSize = sizeof(USB_JoystickReport_Data_t);
wikszych ni jeden bajt, sytuacja taka
return false;
moe prowadzi do zej interpretacji
wartoci zmiennej, jeli si odpowiednio nie zabezpieczymy. Zmienne pooenia
Podsumowanie
(x_ax oraz y_ax) s aktualizowane w ptli
Dziki pokanej liczbie przykadowych apligwnej wartoci z przetwornika A/C, za
kacji, biblioteka LUFA pozwala na szybkie
ich odczyt nastpuje w funkcji CALLBACK_
iatwe rozpoczcie przygody zmikrokontroHID_Device_CreateHIDReport() (listing 12),
lerami AVR zinterfejsem USB. Wpoczeniu
ktra moe by wywoywana w kontekcie
z prezentowan pytk, ich uruchomienie
przerwania, ajej zadaniem jest przygotowanie
nie zajmie wicej ni kilkanacie kilkadzieinformacji ostanie joysticka wcelu wysania
sit minut.
Rysunek 6. Sposb doczenia
dokomputera. Ciao funkcji zlist.12 rni si
W artykule nie poruszyem problemu
potencjometrw waplikacji joysticka
od wersji oryginalnej tym, e kod odpowietworzenia wasnej aplikacji korzystajcej
Zmodyfikowane wersje rde prezentowadzialny za odczyt stanu joysticka bazujcego
z biblioteki LUFA od podstaw. W tym celu
nych przykadw mona znale wmateriana stykach zastpiony zosta kodem aktualiniezbdna jest szersza wiedza, tak ostandarach dodatkowych, doczonych doartykuu.
zujcym wsprzdne na podstawie pooedzie USB jak i strukturze samej biblioteki.
W czasie przekazywanie tego materiau
nia potencjometrw (tj. wartoci zmiennych
Jakkolwiek, przedstawione przykady daj
do redakcji, dostpna bya ju nowsza werglobalnych y_ax oraz x_ax). Nieznacznie
oglny zarys zagadnienia i myl, e przy
sja projektu LUFA. Jednak wtrakcie stawiazmieniony zosta rwnie kod odczytu stanu
odrobinie wysiku czytelnicy bd w stanie
nia pierwszych krokw, zalecam korzystanie
drugiego przycisku (wcelu odzwierciedlenia
sami osign zamierzone cele, np. przerobi
zwersji opisanej wartykule, wcelu uniknipocze napytce).
aplikacj demonstracyjn wirtualnego portu
cia przykrych niespodzianek spowodowaSchemat przyczenia potencjometrw
szeregowego
(~/ep-avr-usb/LUFA-120219/
nych wprowadzonymi zmianami.
osi X iY dopytki przedstawiony zosta naryDemos/Device/ClassDriver/VirtualSerial)
sunku6. Uwaga! Wtym przypadku, zworka J1
nakart przekanikw sterowan zterminaAndrzej Telszewski
ustalajca napicie pracy mikrokontrolera musi
la. Amoe toby dopiero pocztek fascynuatelszewski@gmail.com
by ustawiona wpozycji 5V (VBUS), gdy przy
jcej wyprawy wwiat interfejsu USB.
poczeniu zgodnie z rysunkiem 6, takie jest
Na zakoczenie jeszcze raz zachcam
Bibliografia:
napicie odniesienia potencjometrw itakie te
do przejrzenie przykadw oraz dokumen1. AN146 USB Hardware Design
powinno by napicie odniesienia przetwornitacji projektu LUFA. Wwikszoci przypadGuidelines for FTDI ICs, FTDI
ka A/C.
kw do ich uruchomienia wymagane bd
2. SPRAAR7 USB 2.0 Board Design and
Powgrania programu (Joystick.hex), pytka
jedynie modyfikacje przedstawione w artyLayout Guidelines, Texas Instruments
bdzie widziana wsystemie operacyjnym jako
kule, ewentualnie gar dodatkowych eledwuosiowy joystick, majcy dwa przyciski.
mentw umieszczonych napytce stykowej.

26

ELEKTRONIKA PRAKTYCZNA 10/2014