http://www.easy-soft.tsnet.pl/
Płytka testowa dla mikrokontrolerów
AT89S... oraz AVR.
Budując model urządzenia z mikr
czegoś
ożliwiał łatwe dołączenie urządzeń zewnętrznych,
ikrokontrolerów bez poważnych zmian w konstrukcji
•
wanie programów przeznaczonych dla mikrokontrolera i nie wymagał
•
ę z używanymi przeze mnie programami typu IDE.
jb
ereg wad, które
zdecydowałem się na zaprojektowanie własnego. Jest on
sane dla
u na
mowanie (metodą „in-circuit”) następujących układów
AT89S8252
AT90S1200 rev.C
•
AT90S4434
odana wyżej lista w łatwy sposób może być rozszerzona. I najważniejsze: płytkę testową bez najmniejszych
Programowanie „in-circuit”.
Kilka lat temu firma ATMEL zaczęła wyposażać swoje mi okontrolery w interfejs sprzętowy o nazwie SPI (Serial
ady i
M)
cji
ą to MOSI,
jako Master (nadrzędny – sterujący
•
•
go która jest wyjściową gdy układ pracuje jako Master i wejściową, gdy
pracuje jako Slave,
okontrolerem czego tak naprawdę oczekuje projektant od tzw. układu
uruchomieniowego? Trudno odpowiedzieć na takie pytanie, ponieważ z całą pewnością każdy oczekuje
innego. Może spróbuję wymienić własne kryteria wyboru. Chciałbym aby taki układ:
•
um
•
umożliwiał wykorzystanie stosowanych przeze mnie m
zestawu uruchomieniowego,
pozwalał na łatwy zapis i testo
dodatkowego układu programatora,
w łatwy sposób pozwalał integrować si
Na ardziej zbliżonym do tego mojego „ideału” jest AVR Starter Kit firmy ATMEL. Ma jednak sz
obniżają w moich oczach jego funkcjonalność. Mam na przykład zawsze duże problemy z podłączeniem zasilania
sondy logicznej – najczęściej lutuję jej wyprowadzenia wprost do układu stabilizatora. Nie jest to ani
funkcjonalne, ani estetyczne, ani zbyt wygodne.
W związku z brakiem na rynku podobnego układu
częściowo wzorowany na AVR Starter Kit firmy ATMEL i na notach aplikacyjnych tej firmy, jednak posiada
pewne cechy funkcjonalne, których nie ma pierwowzór. Układ przeznaczony jest dla mikrokontrolerów
produkowanych przez ATMEL. Oczywiście można przy jego pomocy uruchamiać również programy napi
mikrokontrolerów produkowanych przez innych producentów i zgodnych pod względem wyprowadzeń z
popularnym 8051 czy 8052, jednak w takim wypadku zestaw traci sporo ze swej funkcjonalności. Mam t
myśli jedną z najważniejszych cech a mianowicie możliwość zapisu programu do pamięci programu
mikrokontrolera bez użycia dodatkowego programatora.
Płytka prototypowa umożliwia wykorzystanie lub zaprogra
mikrokontrolerów:
•
•
AT90S1200 i
•
AT90S2313
•
AT90S2323
•
AT90S2333
•
AT90S2343
•
AT90S4414
•
AT90S4433
•
AT90S8515
•
AT90S8535
•
ATMega 103
•
ATMega 161
•
ATMega 163
•
ATMega 603
•
ATMega 83
P
problemów zintegrować z Bascom AVR oraz AVR Studio. W innych sytuacjach wykorzystywany jest program
AVRProg.
kr
Peripherial Interface) a wkrótce potem w możliwość zapisu pamięci FLASH i EEPROM z jego wykorzystaniem.
Daje to projektantowi systemu możliwość łatwej implementacji metody zapisu programu do pamięci
mikrokontrolera zwanej z języka angielskiego „in-circuit” to znaczy „w układzie”. Posiada ona swoje w
zalety. Wadą jest to, że czasami trzeba nieco skomplikować układ połączeń tak, aby odseparować obwody
sterownika od szeregowego programatora w czasie zapisu czy odczytu wewnętrznej pamięci FLASH (EEPRO
mikrokontrolera. Do wad zaliczam również możliwość ustawienia tylko niektórych bitów bezpieczników i opcji
przy pomocy tego rodzaju interfejsu. Zaletą jest niewątpliwie umożliwienie zapisu pamięci mikrokontrolera bez
konieczności wylutowywania go z płytki czy nawet wyjęcia z podstawki. Jest to cecha szczególnie korzystna dla
elektronika – amatora, który nie dysponuje zbyt dużym budżetem koniecznym na zakup emulatora. Pozwala
mu na uruchamianie urządzenia metodą prób i błędów. Do metody programowania „in-circuit” sięgają również
chętnie profesjonaliści, ponieważ umożliwia im ona łatwą zmianę programu wykonywanego przez
mikrokontroler w celu dokonania poprawek czy dodania cech funkcjonalnych już podczas eksploata
urządzenia. Opisywaną wyżej cechę wykorzystuje proponowany układ uruchomieniowy.
Układy mikrokontrolerów wyposażone w interfejs SPI posiadają przyporządkowane mu 4 linie. S
MISO, SCK i SS. Ich nazwy pochodzą z języka angielskiego i oznaczają:
•
MOSI – Master Output Slave Input – linia danych; gdy układ pracuje
transmisją) jest to linia wyjściowa, gdy jako Slave (podporządkowany) wówczas jest to linia wejściowa,
MISO – Master Input Slave Output – linia danych; gdy układ pracuje jako Master jest to linia wejściowa,
gdy jako Slave – wyjściowa,
SCK – linia sygnału zegarowe
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 1/1-
http://www.easy-soft.tsnet.pl/
SS – Slave Select – linia sterując przełączaniem interfejsu z funkcji układu master do funkcji slave; stan ni
oduje przełączenie in
ski
pow
terfejsu w tryb Master.
i odpowiedniego sterowania wymagają tylko wyprowadzenia
.
podaje zewnętrzny sygnał synchronizujący przesyłanie danych SCK i steruje transmisją.
amowanego mikrokontrolera z serii AVR,
ż zasilony sygnałem
wystarczy jednak
er znajduje się w stanie reset. Można to uzyskać przez podanie stanu wysokiego dla AT89S8252,
,
itów
igdy zaś
jściowe lub wyjściowe. W przypadku,
O
składa się
posiada
Aplikacja sterująca – AVRPROG.
Do sterowania pracą programatora wy
tronie internetowej firmy ATMEL,
program AVRProg. Jest to aplikacja wykonana dla środowiska Windows. Nie wymaga przeprowadzania żadnej
.
łytkę ewaluacyjną. Komunikacja
(bądź też
Przy programowaniu w układzie nie wykorzystuje się wszystkich wyprowadzeń. Na wyprowadzeniu SS
najczęściej wymusza się stan wysoki. Podłączenia
MISO, MOSI i SCK.
Programowany układ mikrokontrolera zawsze pracuje jako Slave, dla którego układem Master jest programator
Master (programator)
Sygnał SCK powinien mieć częstotliwość:
•
co najmniej 40 razy mniejszą dla programowanego mikrokontrolera AT89S8252,
•
co najmniej 4 razy mniejszą dla progr
Oprócz sygnału zegarowego transmisji, programowany mikrokontroler musi być równie
zegarowym na wejściu XTAL1 sterującym synchroniczną pracą CPU. W tym wypadku
podłączony na zewnątrz rezonator kwarcowy czy ceramiczny będący najczęściej integralną częścią układu
sterownika.
Oba rodzaje pamięci (FLASH i EEPROM) mogą być zapisane z użyciem interfejsu SPI tylko wówczas, gdy
mikrokontrol
lub niskiego dla AVR, na wyprowadzenie RESET. To jednak nie wszystko. Aby możliwy był zapis do pamięci, CPU
musi wykonać instrukcję „Programming Enable”. Polega to na wprowadzeniu przez interfejs SPI kodu
właściwego rozkazu. W przypadku AT89S8252 jest to 3-bajtowy rozkaz składający się z kodów 0xAC – 0x53 i
np. 0x00. Konieczny do spełnienia jest jeszcze jeden warunek. Aby możliwy był zapis z wykorzystaniem
interfejsu SPI musi on pracować synchronicznie z programatorem (układem master). Synchronizację bada się
testując wartość wyprowadzaną podczas zapisu trzeciego bajtu rozkazu. Jeśli interfejs pracuje poprawnie
powinien on wyprowadzić liczbę o wartości drugiego bajtu (0x53) podczas zapisu trzeciego bajtu rozkazu.
Producent zaleca aby próbę synchronizacji przeprowadzić 32 razy. Jeśli w ciągu 32 prób synchronizacji nie
powiedzie się ona, oznaczać to będzie brak komunikacji z programowanym układem. Jeśli mikrokontroler
połączony jest poprawnie z programatorem, to przyczyną może być uszkodzenie interfejsu lub ustawienie b
opcji (bezpieczników) w sposób uniemożliwiający dostęp do pamięci programu z wykorzystaniem SPI.
Normalnie zapis pamięci wykonanej w technologii FLASH nie jest możliwy bez wcześniejszego ustawienia
wartości zapisywanej komórki pamięci na 0xFF. To znaczy – możliwa jest zmiana stanu bitu z 0 na 1, n
odwrotnie. Zapisując dane do pamięci FLASH mikrokontrolera firmy ATMEL nie musimy zajmować się tą
właściwością. Tuż przed zapisem bajtu, automatycznie wykonywana jest instrukcja ustawiająca wartość bitów
programowanej komórki pamięci na „1” - jest to tak zwane „Auto erase”.
Interfejs SPI jest typu synchronicznego. Oznacza to, że dane przesyłane są synchronicznie z sygnałem SCK.
Linie interfejsu są dwukierunkowe i w zależności od funkcji pracują jako we
gdy interfejs służy do zapisu danych w pamięci FLASH czy EEPROM, linie MOSI i SCK są wejściowymi, zaś MIS
wyjściową. W wybranym trybie pracy, przesyłane poprzez linię MOSI bity wprowadzane są podczas
narastającego zbocza, natomiast stan MISO zmienia się podczas opadającego zbocza sygnału SCK.
Odrębne zagadnienie stanowi sposób adresowania komórek pamięci i wymiany danych. Wszystko to
na tak zwany protokół komunikacyjny, który jest różnych dla różnych mikrokontrolerów, aczkolwiek
wiele cech wspólnych. Na przykład rodzina AVR wymaga do zapisu pamięci słowa danych o długości 16 bitów,
natomiast AT89 – 8 bitów. Różnice występują również w metodach zapisu – AT89 i AT90 zapisuje się słowo po
słowie, natomiast ATMega strona po stronie (256 bajtów). Zainteresowanych szczegółowym opisem protokołu
komunikacyjnego odsyłam do lektury kart katalogowych konkretnych modeli mikrokontrolerów.
korzystałem darmowy, dostępny na s
instalacji. Program rozprowadzany jest w jako archiwum w formacie ZIP, które zawiera plik wykonywalny EXE
Należy go po prostu skopiować na dysk twardy i utworzyć skrót ułatwiający uruchomienie. Uwaga: program nie
uruchomi się bez podłączenia urządzenia, które wyśle identyfikator zawierający 3 pierwsze znaki „AVR” podczas
próby nawiązania komunikacji.
AVRProg przeznaczony jest do sterowania zarówno pracą programatorów szeregowych jak i równoległych. Ja
zastosowałem go do sterowania programatorem wbudowanym w p
nawiązywana jest przez interfejs szeregowy RS232 komputera PC (19200, n, 8, 1). Po uruchomieniu program
testuje porty szeregowe sprawdzając możliwość komunikacji i w ten sposób sam wykrywa obecność
nieobecność) podłączonego układu programatora. Protokół komunikacyjny jest bardzo prosty, aczkolwiek jego
gruntowne poznanie zajęło mi kilka dni. AVRProg przesyła polecenie w formie pojedynczego znaku. Komendy te
wyszczególnione są w tabeli 1. Niektóre z komend wymagają potwierdzenia ze strony odbierającego i
wykonującego je układu w postaci kodu CR (0x0D). Inne podają również parametry takie, jak adres czy bajt
danych do zapisu.
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 2/2-
http://www.easy-soft.tsnet.pl/
AVRProg zapisuje
AVRProg czyta
Opis komendy
ID Dane
Dane
Enter Programming Mode
(załączenie trybu programowania)
P - -
0x0D
Auto Increment Address Status
(pytanie o możliwość automatycznej
inkrementacji adresu)
a
-
„Y” lub „?”
Set Address
(ustawienie adresu zapisywanego lub
odczytywanego bajtu)
A MSB
LSB 0x0D
Write Program Memory Low Byte
(zapis młodszego bajtu pamięci programu)
c dd 0x0D
Write Program Memory High Byte
(zapis starszego bajtu pamięci programu)
C dd 0x0D
Issue Page Write
(instrukcja zapisu strony pamięci)
m
0x0D
Read Lock Bits
(odczyt bitów blokujących)
r
dd
(dd)
Read Program Memory
(odczyt pamięci programu – FLASH)
R
N x dd
Read Data Memory
(odczyt pamięci danych – EEPROM)
d dd
Write Data Memory
(zapis pamięci danych – EEPROM)
D dd 0x0D
Chip Erase
(kasowanie pamięci danych i pamięci programu)
e
0x0D
Write Lock Bits
(zapis bitów blokujących)
l dd
0x0D
Write Fuse Bits
(zapis bitów bezpieczników)
f dd
0x0D
Read Fuse Bits Low Byte
(odczyt młodszego bajtu stanu bitów
bezpieczników)
F dd
Read Fuse Bits High Byte
(odczyt starszego bajtu stanu bitów
bezpieczników)
N dd
Leave Programming Mode
(opuszczenie trybu programowanie, przejście do
stanu spoczynkowego)
L
0x0D
Select Device Type
(ustawienie typu programowanego
mikrokontrolera)
T dd 0x0D
Read Signature Bytes
(odczyt bajtu sygnatury układu)
s
3 x dd
Return Supported Device Codes
(odczyt listy obsługiwanych przez programator
układów)
t
N x dd
0x00
Return Software Identifier
(odczyt identyfikatora programu; dla
programatora szeregowego jest to AVR ICP, dla
płytki prototypowej AVR DEV itp.)
S
7 x dd
Return Software Version
(odczyt wersji oprogramowania)
V
dd
dd
Return Hardware Version
(odczyt wersji układu programatora)
v
dd
dd
Return Programmer Type
(odczyt rodzaju programatora; S to programator
szeregowy, P równoległy)
p dd
Set LED
(załączenie diody LED o podanym kodzie)
x dd 0x0D
Clear LED
(wyłączenie diody LED o podanym kodzie)
y dd 0x0D
Tabela 1. Wykaz komend programy AVRProg.
Aby zilustrować użycie komend posłużę się sekwencją rozkazów przesyłanych przez AVRProg tuż po
uruchomieniu. Komendy te wysyłane są w celu identyfikacji rodzaju podłączonego programatora oraz pobrania
listy obsługiwanych układów:
•
0x1B (ESC) - oczyszczenie bufora komunikacji programatora,
•
„S” w – identyfikacja wersji oprogramowania,
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 3/3-
http://www.easy-soft.tsnet.pl/
•
„a” – pytanie o możliwość autoinkrementacji adresu,
•
„t” – pobranie listy obsługiwanych układów,
•
„T” + kod – wybranie programowanego mikrokontrolera (najczęściej jest to ostatni zapisywany
mikrokontroler).
Aplikacja jest bardzo prosta w użyciu. Obsługuje się ją identycznie jak większość programów napisanych dla
środowiska Windows. Korzystając z pola combo (device) umieszczonego na dole okienka, należy wybrać
programowany układ mikrokontrolera. Od tego wyboru zależeć będzie faza sygnału RESET oraz algorytm z
zastosowaniem którego zapisywana i odczytywana będzie pamięć mikrokontrolera. Na górze okienka
umieszczony jest przycisk „Browse” (Hex file). Korzystając z niego należy wskazać zbiór w formacie HEX
zawierający dane do zapisu w FLASH lub EEPROM. W ten sam sposób wskazuje się również nazwę zbioru, w
którym zostaną zapamiętane odczytane dane. Teraz, po wykonaniu wyżej opisywanych czynności, można
przeprowadzić programowanie pamięci, odczytać ją lub porównać jej zawartość z danymi zapamiętanymi na
dysku. Operacje te można przeprowadzać niezależnie dla obu rodzajów pamięci. Uwaga: przed zapisem pamięci
FLASH wykonywana jest instrukcja kasująca zarówno zawartość pamięci FLASH jak i EEPROM. W przypadku
zapisu danych do EEPROM – zawartość FLASH nie jest usuwana.
Komunikację z programatorem możemy przetestować wykorzystując przycisk „Advanced”. Po jego wybraniu
ukaże się okienko dialogowe, które w części informacyjnej powinno zawierać identyfikator podłączonego układu
programatora (dla opisywanej płytki jest to „AVR DEV”), wersję oprogramowania (tu powinno się znaleźć „7.0”)
oraz sygnaturę układu umieszczonego w podstawce. Jedynym wyjątkiem jest tu AT89S8252, którego sygnatura
nie jest odczytywana (ukaże się następująca informacja „?? ?? ??”)
Zdjęcie 1. Wygląd okna programu AVRProg po uruchomieniu.
Opis układu.
Układ zmontowany został na płytce dwustronnej z metalizacją otworów. Umożliwia podłączenie
mikrokontrolerów w obudowie DIL40 oraz DIL20. Inne – mimo iż mogą się znajdować na liście programowanych
układów – wymagają zastosowania adaptera. Rolę programatora spełnia tani i popularny mikrokontroler
AT89C2051, w którym zaimplementowałem programowy interfejs SPI, pracujący z zewnętrznym rezonatorem
kwarcowym 11,0592 MHz. Mikrokontroler ten komunikuje się z aplikacją sterującą AVRProg przez interfejs
szeregowy RS232. Konwersji poziomów napięć dokonuje układ drivera MAX232. Wykorzystane są tylko 2
bramki: odpowiednio jedna nadajnika i jedna odbiornika. Pozostałe dwie podłączone są do wyprowadzeń UART
programowanego mikrokontrolera. Umożliwia to jego podłączenie i pracę na przykład jako terminal, bez
stosowania dodatkowego układu dopasowującego. Wyprowadzenia UART można odłączyć od drivera MAX232.
Wystarczy wyjąć zworki J1 i J2.
AT89C2051 pełni jednocześnie rolę układu sterującego wyprowadzeniem reset programowanego
mikrokontrolera. Faza sygnału reset jest dobierana w dwojaki sposób. Tuż po włączeniu układ „nie wie” jaka
faza sygnału jest wymagana, ponieważ nie został jeszcze przesłany przez AVRProg bajt dokonujący wyboru
typu mikrokontrolera. Można to co prawda określić na podstawie odczytu sygnatury układu, jednak ta metoda
nie została zaimplementowana. Aby określić fazę reset po włączeniu zasilania układ odczytuje stan zwory J3. I
tak AT89S8252 wymaga aby zworka znalazła się w położeniu 1-2, natomiast układy z serii AVR 2-3. Nastawa ta
ma znaczenie tylko do momentu przesłania bajtu identyfikatora wybranego układu. Później nastawa zwory jest
ignorowana.
Do wyprowadzenia INT0 mikrokontrolera programatora podłączony jest przycisk, lub tak jak w modelu,
goldpiny zwierane w razie potrzeby na przykład przy pomocy śrubokręta, czy pęsety. Zwarcie wyprowadzeń
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 4/4-
http://www.easy-soft.tsnet.pl/
(lub naciśnięcie przycisku) wymusza krótki sygnał reset programowanego mikrokontrolera. Przycisk nie działa w
czasie, gdy programator zapisuje lub odczytuje dane.
Stan programatora sygnalizowany jest przez trzy diody świecące o kolorach żółtym, zielonym i czerwonym:
•
dioda zielona oznaczona jako „OK” zaświeca się, gdy rezultat operacji jest poprawny oraz po nawiązaniu
połączenia z aplikacją AVRProg, tuż po jej uruchomieniu,
•
dioda żółta oznaczona jako „praca” świeci się, gdy programator zapisuje lub odczytuje dane,
•
dioda czerwona sygnalizuje błąd zapisu, odczytu lub weryfikacji danych i zaświeca się po wyświetleniu
komunikatu o błędzie przez aplikację AVRProg.
Poza układem drivera MAX232 i dwoma stabilizatorami napięcia, na płytce nie ma innych układów scalonych. Ci,
którzy lubią eksperymentować z rozmaitymi znajdującymi się na płytce testowej układami, nie znajdą tu nic dla
siebie. Płytka ma wszystkie porty mikrokontrolera wyprowadzone na zewnątrz bądź to przy pomocy złącz
terminatorów, bądź to przy pomocy goldpinów. Te ostatnie przeznaczone są do podłączenia wyświetlacza
pracującego z interfejsem 4 lub 8 bitowym oraz do wyprowadzenia sygnałów z układu programatora w celu
zapisu danych w innym, zewnętrznym układzie. Wszystkie linie portów mikrokontrolera testowego za wyjątkiem
P1 są podłączone do zewnętrznych rezystorów pull-up o wartości 47k. Rolę oscylatora spełnia rezonator
kwarcowy. Ja stosuję dla większości AVR rezonator o częstotliwości 7,3728 MHz a dla AT89S8252 11,0592 MHz
lub 22,1184 MHz. Oscylator trzeba będzie prawdopodobnie wymieniać w zależności od aktualnych potrzeb.
Można więc w otwory na płytce drukowanej wlutować 2 wyprowadzenia wyjęte z podstawki precyzyjnej tak, aby
możliwa była wymiana rezonatora bez konieczności użycia lutownicy. Można też w razie potrzeby wymienić
rezonator na inny wylutowując go.
Jak wspomniałem wcześniej, na płytce znajdują się 2 układy stabilizatorów napięcia. Ten pierwszy, oznaczony
jako U1, służy do zasilania układów znajdujących się na płytce. Ten drugi, oznaczony jako U2, mimo iż korzysta
ze wspólnego napięcia wejściowego podawanego przez G1, służy do zasilania układów znajdujących się poza
płytką i może stabilizować napięcie o innej wartości niż U1. W układzie modelowym używałem stabilizatora z
serii 7812. Oba napięcia wyprowadzone są na zewnątrz przez złącza G2 (5V) i G3 (inne napięcie, w modelu było
to 12V). Ich stan sygnalizowany jest przez diody LED – odpowiednio D6 i D8. Diody mają za zadanie świecić
przy obecności napięcia wyjściowego. Ich dodatkową funkcją jest to, że zgasną w przypadku zwarcia. Jest to
jedynie bardzo prosty sposób sygnalizacji. Zabezpieczenie nadprądowe jest jednym z elementów, w które
wyposażony jest stabilizator. Uwaga: obwody stabilizatorów nie posiadają separacji galwanicznej. Ich wyjść nie
można łączyć szeregowo w celu uzyskania wyższego napięcia. Napięcie wejściowe zależy od rodzaju
zastosowanych stabilizatorów. Jego wartość powinna być co najmniej o 2V wyższa od napięcia wyjściowego
stabilizatora. I tak, jeśli konieczne jest wyłącznie zasilenie układów płytki testowej, wystarczy doprowadzenie
do G1 napięcia stałego lub przemiennego o wartości około 8V. Za złączem G1 znajduje się mostek prostowniczy
i kondensator elektrolityczny, toteż polaryzacja doprowadzonego napięcia nie ma znaczenia: zamiana „+” z „-”
nie jest dla układu groźna.
Tabela 2 zawiera opisy złącz – wyprowadzeń płytki. Złącza oznaczone jako X to wyprowadzenia sygnałów
mikrokontrolera. Funkcje G1, G2 i G3 omówiliśmy już wcześniej. G4 to wyprowadzenie przez które sygnały
interfejsu SPI programatora szeregowego mogą być podawane na zewnątrz. Można sobie wyobrazić zasilenie
nimi płytki – przejściówki z podstawką, w której znajduje się mikrokontroler do zapisu czy odczytu lub
podłączenie programatora do urządzenia zewnętrznego.
Złącza X1 i X2 to wyprowadzenia przeznaczone dla podłączenia wyświetlacza LCD. Złącze X1 umożliwia
podłączenie LCD z interfejsem 8-bitowym, natomiast złącze X2 z interfejsem 4-bitowym. Potencjometr
wieloobrotowy PR1 służy do regulacji kontrastu. Dla większości wyświetlaczy LCD można z niego zrezygnować,
łącząc wyprowadzenia 2 i 3 potencjometru, podając potencjał masy zamiast napięcia regulacji. Złącza X3 do
X16 to wyprowadzenia portów mikrokontrolera.
Pewnego wyjaśnienia wymaga rola zwory J4 podłączonej do nóżki 31 mikrokontrolera. Wyprowadzenie 31 w
przypadku AT89S8252 oznaczane jest jako V
PP
/Prog i służy do wyboru rodzaju pamięci programu podłączonej
do mikrokontrolera. Praca z wewnętrzną pamięcią programu FLASH wymaga podania stanu wysokiego. Nie jest
ono używane z innym przeznaczeniem niż tylko wybór pamięci programu. Inaczej jest w rodzinie układów AVR.
Tutaj, na przykład dla AT90S8515, to samo wyprowadzenie pełni funkcję Capture Input (ICP) i może służyć do
pomiaru czasu trwania impulsu. Zwora J4 umożliwia wybór podłączenia nóżki 31 mikrokontrolera do „1”
logicznej w położeniu 1-2 oraz dołączenie jej do wyprowadzenia złącza X16 w położeniu 2-3. Pamiętajmy o jej
roli zmieniając rodzaj mikrokontrolera. Bez podania logicznej „1” AT90S8252 nie będzie pracował poprawnie z
wewnętrzną pamięcią programu!
Złącza DSUB9 oznaczone jako X17 i X18 to wyprowadzenia interfejsu RS232. X17 to wejście / wyjście
programatora, X18 to dodatkowe złącze umożliwiające wykorzystanie interfejsu UART testowanego
mikrokontrolera. Sygnały tego interfejsu obecne są również, bez dodatkowych układów buforów, na
wyprowadzeniach złącza X11. Tabele 2 i 3 zawierają opisy złącz oraz opis funkcji i położeń elementów
regulacyjnych i zworek.
Programator – opis programu.
Programator szeregowy wykonałem w oparciu o mikrokontroler AT89C2051 pracujący z rezonatorem
kwarcowym 11,0592 MHz. Cały program napisany jest w języku C z niewielkimi fragmentami w języku
asembler. Po skompilowaniu zajmuje on około 1,6kB przy włączonej opcji optymalizacji kodu wynikowego pod
kątem szybkości jego działania. Do napisania programu posłużył mi kompilator firmy RAISONANCE. Każdy, kto
będzie chciał wykonać modyfikacje może się posłużyć darmową wersją demonstracyjną tego pakietu dostępną
na stronie producenta http://www.raisonance.com/ umożliwiającą kompilację i uruchamianie programów do
4kB kodu.
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 5/5-
http://www.easy-soft.tsnet.pl/
Złącze
Oznaczenie
Numer
wyprowadzenia
Opis
sygnału
Uwagi
X1
(wyśw. LCD w
trybie 4 bity)
1
2
3
4
5
6
7
8
9
10
masa
+5V
kontrast
PB0 (P1.0)
PB1 (P1.1)
PB2 (P1.2)
PB4 (P1.4)
PB5 (P1.5)
PB6 (P1.6)
PB7 (P1.7)
z potencjometru PR1, można zewrzeć z GND
RS (LCD Register Select)
RD (LCD Read)
EN (LCD Enable)
DB4 (LCD Data Bus 4)
DB5 (LCD Data Bus 5)
DB6 (LCD Data Bus 6)
DB7 (LCD Data Bus 7)
X2
(wyśw. LCD w
trybie 8 bitów)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
masa
+5V
kontrast
PD4 (P1.0)
PD5 (P1.1)
PD6 (P1.2)
PB0 (P1.4)
PB1 (P1.5)
PB2 (P1.6)
PB3 (P1.7)
PB4 (P1.7)
PB5 (P1.7)
PB6 (P1.7)
PB7 (P1.7)
+podśw.
masa
z potencjometru PR1, można zewrzeć z GND
RS (LCD Register Select)
RD (LCD Read)
EN (LCD Enable)
DB0 (LCD Data Bus 0)
DB1 (LCD Data Bus 1)
DB2 (LCD Data Bus 2)
DB3 (LCD Data Bus 3)
DB4 (LCD Data Bus 4)
DB5 (LCD Data Bus 5)
DB6 (LCD Data Bus 6)
DB7 (LCD Data Bus 7)
napięcie zasilania podświetlania tła: 4,3V DC
masa napięcia podświetlania tła
X3
1
2
PA0 (P0.0)
PA1 (P0.1)
Opis wyprowadzeń dla AT89S8252 i AT90S8515
X4
1
2
PA2 (P0.2)
PA3 (P0.3)
AT89S8252 i AT90S8515
X5
1
2
PA4 (P0.4)
PA5 (P0.5)
AT89S8252 i AT90S8515
X6
1
2
PA6 (P0.6)
PA7 (P0.7)
AT89S8252 i AT90S8515
X7
1
2
PC0 (P2.0)
PC1 (P2.1)
AT89S8252 i AT90S8515
X8
1
2
PC2 (P2.2)
PC3 (P2.3)
AT89S8252 i AT90S8515
X9
1
2
PC4 (P2.4)
PC5 (P2.5)
AT89S8252 i AT90S8515
X10
1
2
PC6 (P2.6)
PC7 (P2.7)
AT89S8252 i AT90S8515
X11
1
2
PD0 (P3.0)
PC1 (P3.1)
AT89S8252 i AT90S8515
X12
1
2
PD2 (P3.2)
PD3 (P3.3)
AT89S8252 i AT90S8515
X13
1
2
PD4 (P3.4)
PD5 (P4.5)
AT89S8252 i AT90S8515
X14
1
2
PD6 (P3.6)
PD7 (P3.7)
AT89S8252 i AT90S8515
X15
1
2
RESET
ALE
AT89S8252 i AT90S8515
X16
1
2
ICP-1 (Vpp)
OC1 (PSEN)
AT89S8252 i AT90S8515
X17
RS232
złącze programatora; X17 podłączone jest do AT89C2051
X18
RS232
złącze interfejsu UART testowanego mikrokontrolera; odłączane przy pomocy J1 i J2
G1
1, 2
napięcie zasilania
napięcie zasilające układu, stałe lub przemienne, o wartości wyższej o co najmniej 2V
od napięcia wyjściowego
G2
1
2
+5V
masa
wyprowadzenia napięć zasilających mikrokontroler
G3
1
2
np.+12V
masa
wyprowadzenie napięcia odseparowanego od zasilania mikrokontrolera
G4
1
2
3
4
5
6
8
7, 9, 10
+5V
PB7
-
PB6
-
PB5
RESET
masa
wyprowadzenia programatora przeznaczone do podłączenia zewnętrznego,
programowanego układu
Tabela 2. Opis wyprowadzeń płytki testowej
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 6/6-
http://www.easy-soft.tsnet.pl/
Zworka / element regulacyjny
Oznaczenie
Położenie
Opis funkcji
J1
1-2
0
linia RXD podłączona do drivera MAX232 (i złącza X18)
RXD odłączone
J2
1-2
0
linia TXD podłączona do drivera MAX232 (i złącza X18)
TXD odłączone
J3
1-2
2-3
wybór fazy sygnału reset, aktywna jest „1” (AT89)
aktywne jest „0” (AT90 i ATMega)
J4
1-2
2-3
logiczna „1” (Vcc) dołączona do wyprowadzenia 31 mikrokontrolera (AT89S8252)
wyprowadzenie 31 podłączone do złącza X16 (ICP-1)
PR1
-
regulacja kontrastu dla wyświetlacza
SW1
-
zwarcie powoduje reset programowanego mikrokontrolera, funkcja blokowana podczas
odczytu / zapisu danych
SW2
1-2
0
zwora - wyłącznik zasilania
Tabela 3. Opis elementów regulacyjnych oraz nastaw zworek
Cały program to rodzaj terminala dołączanego do komputera PC i realizującego polecenia przesyłane przez
AVRProg. Z małym wyjątkiem, do komunikacji używane są funkcje wejścia / wyjścia, z biblioteki producenta.
Ten „mały wyjątek” to funkcja przesyłająca znaki do komputera PC, która wymagała odrębnej implementacji.
Standardowo bowiem putchar() po napotkaniu kodu 0x0A przesyła dodatkowo 0x0D tworząc typową sekwencję
końca linii znaków (powrót karetki i nowa linia). Nie jest to pożądane przy przesyłaniu danych w postaci
binarnej zawartych w pamięci mikrokontrolera. Najprostszym rozwiązaniem była własna implementacja funkcji
putchar(), co uczyniono na początku programu. Jak widać, nie należy ona do zbyt skomplikowanych. Nie
wykorzystuje mechanizmu przerwań, zeruje flagę TI oraz zapisuje dane do bufora UART i oczekuje na
ustawienie TI będące sygnałem zakończenia transmisji bajtu.
Funkcja korzysta z nastaw predefiniowanych przez producenta pakietu. Szybkość transmisji określana jest
przez polecenie #pragma DEFJ(TIM1_INIT=0xFD) zawierające wartość inicjującą Timer 1 sterujący pracą UART.
//własna funkcja putchar (dla każdego 0x0A oryginalny putchar dodaje 0x0D)
int putchar (const int c) //nagłówek zgodny z biblioteką producenta
{
SBUF = c;
//zapis bufora UART
TI = 0;
//zerowanie flagi TI, początek transmisji
while (!TI);
//oczekiwanie na przesłanie bajtu
}
Listing 1. Implementacja funkcji putchar()
Funkcje zapisu (wrser) i odczytu (rdser) interfejsu SPI napisane zostały w języku asembler. Są to niewielkie
procedury, zaledwie po kilka bajtów każda. Ich implementacja w C, aczkolwiek możliwa, zajmowałaby więcej
miejsca w pamięci programu oraz była nieco bardziej skomplikowana. Dzięki asemblerowi łatwo jest zapanować
nad funkcją i stanem flagi przeniesienia „C” mikrokontrolera a także nad czasem wykonywania instrukcji. Z tego
samego powodu również funkcja - pętla absorbująca CPU na czas około 1ms wykonana jest w asemblerze
(delayms). Deklaracji bitów wyprowadzeń programowego interfejsu SPI (MISO, MOSI i SCK) dokonałem w
module napisanym w języku asembler. Reszta programu to bardzo rozbudowany warunek switch rozpatrujący
odebrane znaki i podejmujący akcję w zależności od przesłanych przez AVRProg poleceń. Protokoły
komunikacyjne AT89 i AT90 różnią się znacznie pomiędzy sobą. Z tego też powodu, w wielu miejscach
programu, konieczny jest rozdział funkcji na te realizowane przez AVR i te realizowane przez AT89 mimo, iż
przesyłane polecenia mają identyczną postać. Podstawowa różnica w protokole polega na tym, że AT89
wymaga 3 bajtów dla każdego z poleceń, natomiast AT90 i ATMega wymagają 4.
Szczególną uwagę należy zwrócić na poprawną implementację funkcji spiinit() i polecenie „P” – była już o nim
mowa wcześniej. Funkcja ta wprowadza kod rozkazu „Programming Enable” umożliwiając zapis pamięci FLASH i
EEPROM. Układy z serii AVR wymagają, aby dokonana została synchronizacja interfejsów Master (programator)
i Slave (mikrokontroler). Dodatkowo funkcja ta wywoływana jest na koniec cyklu zapisu, przed przełączeniem
do cyklu odczytu. Uwaga: bez poprawnej pracy funkcji spiiinit() nie jest możliwy zapis i odczyt danych z
wykorzystaniem interfejsu SPI.
Poszczególne funkcje i wymagane formaty danych były omawiane wcześniej przy okazji opisu protokołu
komunikacyjnego. Dokładna lektura programu źródłowego pozwoli na zrozumienie szczegółów implementacji
oraz ewentualne własne przeróbki. Pomocne mogą być zwłaszcza noty aplikacyjne dostępne na stronie
internetowej firmy ATMEL (dla przykładu AVR109 i AVR910) oraz karty katalogowe poszczególnych
mikrokontrolerów.
Wykonanie i użytkowanie układu.
Całość zmontowana jest na płytce dwustronnej z metalizacją otworów. Wszystkie kondensatory za wyjątkiem
elektrolitycznych i rezystory to elementy SMD w obudowie 1206. Ich montaż nie powinien nastręczać żadnych
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 7/7-
http://www.easy-soft.tsnet.pl/
trudności. Również z zakupem raczej nie powinno być problemów. Osobiście przy tego rodzaju zamówieniach
posiłkuję się ofertą firm sprzedających elementy przez Internet, w formie sprzedaży wysyłkowej. Płytkę można
nabyć z oferty AVT, raczej nie polecam jej samodzielnego wykonywania aczkolwiek jest to oczywiście możliwe.
Układy stabilizatorów napięcia zamontowane są poziomo. Płytka stanowi jednocześnie radiator i zwiększa
powierzchnię, dzięki której stabilizator traci ciepło. Układ U1 musi podawać napięcie o wartości 5V (7805),
układ U2 można dobrać w zależności od indywidualnych potrzeb. Może to być drugi egzemplarz 7805, może być
również 7809 czy 7812. Można stosować również układy dla wyższych napięć (7815 czy 7824), jednak w takim
przypadku prawdopodobnie wymagane będzie założenie dodatkowego radiatora odprowadzającego nadmiar
ciepła z układu U1.
Układy mikrokontrolerów montowane są w podstawkach. U4, to znaczy AT89C2051 w celu łatwego demontażu i
ewentualnej zmiany programu, układy testowe wykorzystują JP1 i JP2 w celu łatwej ich wymiany. Raczej
proponuję nie stosować tak zwanych podstawek precyzyjnych lecz te zwykłe. „Duża” podstawka, DIL40, ma
wewnątrz poprzeczne wzmocnienie, które należy odciąć przy pomocy piłki lub ostrego noża. „Mała” podstawka,
DIL20, jest bowiem montowana wewnątrz dużej a wzmocnienie to uniemożliwia. Ze względu na ten sposób
montażu, podstawka DIL20 może wymagać również nieznacznego zeszlifowania na przykład przy pomocy
papieru ściernego tak, aby pasowała do wnętrza DIL40. Szczegóły ich montażu pokazane są na fotografii 2.
Zdjęcie 2. Sposób montażu podstawek JP1 i JP2 przeznaczonych dla testowanych
mikrokontrolerów.
Złącza X1, X2 i G4 to dwurzędowe listwy z goldpinami. Są one przycinane do potrzebnej długości i
wlutowywane w płytkę. Wyprowadzenia portów mikrokontrolera to złącza „pod śrubkę”, tak zwane terminatory,
o rastrze 3,81mm. Zostały one zastosowane dla wygody połączeń i montażu. Można ich nie stosować a w ich
miejsce na przykład przylutować zwykłe przewody. Obniży to znacznie koszt wykonania układu.
Wszystkie zwory to pozostałości po demontażu starej płyty głównej komputera PC. Są one stosowane zarówno
do wyboru opcji czy przełączania sygnałów, jak i znajdują zastosowanie jako wyłącznik napięcia zasilania czy
„przycisk” reset.
Uruchomienie układu.
Poprawnie zmontowany układ nie powinien nastręczać żadnych trudności przy uruchomieniu. Najgroźniejsza dla
niego może być jedynie zamiana układu U1 z U2, toteż przed wlutowaniem czy włożeniem w podstawki
mikrokontrolerów i układu MAX232, należy podłączyć układ do zasilania i sprawdzić wartość napięcia
zasilającego układy. Powinno ono być równe 5V. Później napięcie zasilania należy odłączyć i zamontować U3
(MAX232) oraz zaprogramowany układ U4 (AT89C2051). Całość podłączamy typowym kablem do transmisji
szeregowej do komputera PC i włączamy zasilanie. Diody LED sygnalizujące stan programatora powinny
zaświecić się a następnie kolejno zgasnąć. Diody sygnalizujące obecność napięć wyjściowych powinny zostać
zaświecone.
Teraz należy przystąpić do próby komunikacji z aplikacją AVRProg. Tuż po jej uruchomieniu próbuje ona
zidentyfikować typ podłączonego programatora oraz listę programowanych układów. Wysłanie komendy „t”
powoduje zaświecenie się diody zielonej („OK”), co jest sygnałem poprawnej wymiany danych programatora z
aplikacją sterującą. Po krótkiej chwili od nawiązania połączenia, na ekranie PC powinno się ukazać okno robocze
programu AVRProg. Teraz wybierzmy przycisk „Advanced”. Na ekranie powinna ukazać się informacja jak na
zdjęciu 3.
Zdjęcie 3. Identyfikacja rodzaju programatora po wybraniu opcji „Advanced”.
Teraz zamykamy okienka AVRProg, wyłączamy zasilanie i umieszczamy układ testowy w podstawce. Na
początek wybrałem AT90S8515, jednak może to być dowolny z listy obsługiwanych mikrokontrolerów, w
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 8/8-
http://www.easy-soft.tsnet.pl/
obudowie DIL40 lub DIL20. Ustawiamy położenia zworek J3 i J4 w zależności od rodzaju użytego
mikrokontrolera. Włączamy zasilanie i uruchamiamy aplikację AVRProg. Ponowny wybór „Advanced” powinien
pokazać nam odczytaną sygnaturę układu (nie działa dla AT89S8252!). Pole „Calibration byte” pozostaje puste.
Po zamknięciu okienka „Advanced”, najlepszym testem jest próba zapisu pamięci FLASH i EEPROM. Pamiętajmy
o wyborze właściwego typu mikrokontrolera z listy programowanych układów.
Uwagi na temat eksploatacji.
Protoplasty opisywanego układu używam od około 3 lat. Ciągłe rozszerzanie listy dostępnych układów zmusiło
mnie do napisania własnego programu do obsługi programatora, który teraz, na podstawie algorytmów
opisywanych w kartach katalogowych mikrokontrolerów, w łatwy sposób mogę modyfikować.
Połączenia z układami zewnętrznymi wykonuje się przy pomocy przewodów. Płytka to w zasadzie jądro systemu
umożliwiające dołączenie pewnych funkcji, nie ma wbudowanych żadnych układów dodatkowych – pamięci,
zegara, podtrzymania bateryjnego itp. Wyprowadzenia wyświetlacza LCD są wspólne z liniami interfejsu SPI.
Czasami nie jest możliwe zaprogramowanie mikrokontrolera przy podłączonym LCD. Zależy to jednak od
konkretnego modelu wyświetlacza. Niektóre z nich, przy braku sygnału wyboru EN, ustawiają swoje szyny jako
wejściowe i nie powodują zakłóceń w pracy programatora. Inne wymuszają stan niski na przykład linii MOSI
(PB5) uniemożliwiając zapis programu. Tak więc, jeśli przy podłączonym wyświetlaczu LCD nie jest możliwa
poprawna weryfikacja zawartości pamięci, należy go na czas programowania odłączyć. Typ programowanego
układu przechowywany jest w pamięci RAM programatora. Czasami przy wyłączeniach płytki uruchomieniowej,
mimo iż każdorazowo sekwencja programowania zaczyna się od przesłania kodu wyboru programowanego
układu, może się zdarzyć, że przy pierwszej próbie zapisu lub odczytu danych otrzymamy komunikat „Cannot
enter programming mode”. Należy wówczas ponowić próbę operacji a jeśli nie da to rezultatu, zamknąć
aplikację AVRProg i uruchomić ją ponownie. Operacja taka przywraca wszystkie nastawy programatora,
ponownie ustawiając poprawny tryb jego pracy.
Jacek Bogusz
jacek.bogusz@easy-soft.tsnet.pl
Wykaz elementów:
C1, C2, C3, C4
22p/1206
C5
1000u/25V
C6,
C7
10u/25V
C8, C9, C10, C11, C12,
C13,C14
0,1u/1206
C15, C16, C17, C18
1u/50V
D1, D2, D3, D4, D5
1N4007
D6,
D7
LED
zielony
2,5mm
D8,
D9
LED
żółty 2,5mm
D10
LED
czerwony
2,5mm
G1, G2, G3
złącza terminatory o rastrze 5,08mm
JP1
podstawka
DIL-40
JP2
podstawka
DIL-20
PR1
10k
R1
1,5k/1206
R2,
R3
680R/1206
R4, R5, R6
10k/1206
SR1, SR2, SR3
sieci rezystorowe 8x47k ze wspólnym „+“
Q1*
8MHz
Q2
11,0592
MHz
U1
7805/TO-220
U2*
7812/TO-220
U3
MAX232/DIL16
lub
odpowiednik
U4
AT89C2051/DIL20
X4 .. X16
złącza terminatory o rastrze 3,81mm
X17,
X18 DSUBB-9/F
*elementy dobierane w zależności od potrzeb
J.Bogusz „Płytka uruchomieniowa dla ...”
-Strona 9/9-
-Strona 10/10-
-Strona 11/11-
Rozmieszczenie elementów: góra płytki
Rozmieszczenie elementów: dół płytki