background image

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- 

background image

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, 

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- 

background image

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) 

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

 

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) 

 

3 x dd 

 

Return Supported Device Codes 
(odczyt listy obsługiwanych przez programator 
układów) 

 

N x dd  

0x00 

Return Software Identifier 
(odczyt identyfikatora programu; dla 
programatora szeregowego jest to AVR ICP, dla 
płytki prototypowej AVR DEV itp.) 

 

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- 

background image

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- 

background image

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- 

background image

http://www.easy-soft.tsnet.pl/ 

 

Złącze 

Oznaczenie 

Numer 

wyprowadzenia 

Opis  

sygnału 

Uwagi 

X1 

(wyśw. LCD w 
trybie 4 bity) 









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) 









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 


PA0 (P0.0) 
PA1 (P0.1) 

Opis wyprowadzeń dla AT89S8252 i AT90S8515 

X4 


PA2 (P0.2) 
PA3 (P0.3) 

AT89S8252 i AT90S8515 

X5 


PA4 (P0.4) 
PA5 (P0.5) 

AT89S8252 i AT90S8515 

X6 


PA6 (P0.6) 
PA7 (P0.7) 

AT89S8252 i AT90S8515 

X7 


PC0 (P2.0) 
PC1 (P2.1) 

AT89S8252 i AT90S8515 

X8 


PC2 (P2.2) 
PC3 (P2.3) 

AT89S8252 i AT90S8515 

X9 


PC4 (P2.4) 
PC5 (P2.5) 

AT89S8252 i AT90S8515 

X10 


PC6 (P2.6) 
PC7 (P2.7) 

AT89S8252 i AT90S8515 

X11 


PD0 (P3.0) 
PC1 (P3.1) 

AT89S8252 i AT90S8515 

X12 


PD2 (P3.2) 
PD3 (P3.3) 

AT89S8252 i AT90S8515 

X13 


PD4 (P3.4) 
PD5 (P4.5) 

AT89S8252 i AT90S8515 

X14 


PD6 (P3.6) 
PD7 (P3.7) 

AT89S8252 i AT90S8515 

X15 


RESET 

ALE 

AT89S8252 i AT90S8515 

X16 


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 


+5V 

masa 

wyprowadzenia napięć zasilających mikrokontroler 

G3 


np.+12V 

masa 

wyprowadzenie napięcia odseparowanego od zasilania mikrokontrolera 

G4 







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- 

background image

http://www.easy-soft.tsnet.pl/ 

 

 
 
 

Zworka / element regulacyjny 

Oznaczenie 

Położenie 

Opis funkcji 

J1 

1-2 

linia RXD podłączona do drivera MAX232 (i złącza X18) 
RXD odłączone 

J2 

1-2 

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 

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- 

background image

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- 

background image

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- 

background image

 

 

 

-Strona 10/10- 

background image

 

 

-Strona 11/11- 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

Rozmieszczenie elementów: góra płytki 

Rozmieszczenie elementów: dół płytki