AVT-581.pdf
(
529 KB
)
Pobierz
32692337 UNPDF
Interfejs JTAG do procesorów AVR
Interfejs JTAG
do procesorów AVR
AVT-581
Od chwili pojawienia się
pierwszego mikrokontrolera na
rynku, zauważalna jest tendencja
do implementowania w jego
strukturze możliwie wszystkich
wykorzystywanych w praktyce
komponentów. Spowodowało to
– szczególnie po powszechnym
wprowadzeniu pamięci programu
typu Flash – że zewnętrzna
magistrala danych i adresowa
stały się zbędne. Niestety dla
konstruktora oznaczało to
kłopoty z dostępem do zasobów
mikrokontrolera. Panaceum na te
dolegliwości mogą być emulatory
z interfejsem JTAG.
Rekomendacje
: Niezwykle
użyteczny element wyposażenia
warsztatu, w którym powstają
konstrukcje oparte na
mikrokontrolerach AVR, znacznie
podnoszące komfort prac
uruchomieniowych.
Pewnego dnia, tuż po obudze-
niu się, odczułem nieprzepartą
chęć posiadania interfejsu JTAG
do procesorów AVR. Po porannych
ablucjach i małym co nieco zasia-
dłem do komputera, aby dowie-
dzieć się, w którym sklepie inter-
netowym i za ile mogę nabyć takie
urządzenie. Szybko skonstatowałem,
że zakup oryginalnego JTAG-a [1]
wygenerowałby ogromną „dziurę”
w moim domowym budżecie. Pro-
dukty mniej renomowanych i rm
[2] nie wzbudziły mojego zaufania,
„pachnąc” z daleka nieoczekiwa-
nymi kłopotami związanymi z ich
eksploatacją w miarę pojawiania
się na rynku kolejnych wersji AVR
Studio. W miarę upływu czasu
przekonałem się o słuszności mo-
ich podejrzeń [3].
Z literatury dokumentacji pro-
cesorów AVR mogących współpra-
cować z interfejsem JTAG jasno
wynika, że zrobienie takiego urzą-
dzenia od podstaw jest praktycznie
niemożliwe ze względu na brak
opisu czterech instrukcji debugera
($8?B). Odpowiednia dokumenta-
cja jest dostarczana przez Atmela
jedynie wybranym producentom.
Zatem jak mawiał kapral Kuraś
„jakbyś się nie kręcił, d... zawsze
z tyłu”. Niewątpliwie uczy to,
jak monopol na informacje może
utrzymać wysoką cenę produktu
oraz „trzymać w szachu” ubiegają-
cych się o licencję.
W Internecie funkcjonuje bądź
funkcjonowało kilka stron, na któ-
rych znajdowały się opisy [4, 5] jak
w domowych warunkach, za pomo-
cą AVR Studio, zbudować interfejs
JTAG. Oba urządzenia zbudowałem
i przetestowałem z negatywnym
wynikiem. Nawet usunięcie ewi-
dentnych błędów software’owych
[5] występujących w przypadku
programu Boot Strap Loadera dla
procesora Atmega16 nie przyniosło
spodziewanych rezultatów. Rozwią-
zania pozwalające korzystać ze sta-
rych wersji AVR Studio [6] zigno-
rowałem z oczywistych względów.
Jak widać, stanąłem przed dyle-
matem, czy kontynuować zabawę,
licząc się z i askiem całego przed-
sięwzięcia i stratą czasu, czy też
wyładować swoje niezadowolenie
na żonie i dzieciakach. W obawie
o wszelkie możliwe represje ze
strony rodziny wybrałem pierwszą
opcję, a wynikami mojej pracy
mogę podzielić się z Państwem.
Opis układu
Schemat elektroniczny układu
jest w dużej mierze odwzoro-
waniem układu prezentowanego
w Internecie [4] opartego na sche-
matach starszych wersji interfejsu
JTAGICE (
rys
.
1
). Wprowadzone
zmiany dotyczą usunięcia drugie-
10
Elektronika Praktyczna 6/2004
P R O J E K T Y
Interfejs JTAG do procesorów AVR
go procesora sprawującego funkcję
loadera programu do głównego
procesora JTAG-a oraz niewielkiej
przeróbki połączeń pozwalającej
na bezbłędne działanie układu
ISP (prawdopodobna, hardware’owa
przyczyna wadliwej weryikacji pro-
gramu wprowadzonego do proceso-
ra [5]). Warto zaznaczyć, że jedno-
procesorowy układ jest stosowany
obecnie w interfejsie JTAGICE pro-
dukowanym przez Atmela [7].
Sercem układu jest procesor
Atmega16 komunikujący się z AVR
Studio w komputerze za pomocą
kabla
null
modem
(
rys
.
2
, patrz
Pomoc Windows) przez konwerter
poziomów napięć MAX232. Proce-
sor jest połączony z emulowanym
układem, przez bufor SN74HC244
za pomocą dziesięciożyłowego prze-
wodu. Stabilizator napięcia LM7805
wytwarza napięcie 5 V do zasilania
interfejsu i emulowanego układu,
gdy założona jest zwora na wypro-
wadzenia JP. W ogólnym przypadku
emulowany układ może być zasila-
ny z innego źródła (JP rozwarty).
Dopuszczalne jest również zasilanie
interfejsu z emulowanego układu
(JP zwarty), jednak ze względu na
dane katalogowe użytych elemen-
tów, napięcie zasilania powinno
pozostawać w zakresie 4,5...5,5 V.
W rozważanym przypadku nie wol-
no podłączać gniazda J2 do innego
źródła zasilania (możliwe uszkodze-
nie stabilizatora).
Dioda D1 (żółta) zapala się
w momencie wymiany informacji
pomiędzy interfejsem i AVR Studio.
Sygnalizatorem podłączenia napię-
cia zasilającego do gniazda J2 jest
dioda D2 (czerwona). Natomiast
dioda D3 (zielona) sygnalizuje, że
podłączone jest napięcie zasilania
do emulowanego układu. Kolory
diod są zgodne z zastosowanymi
w interfejsie JTAGICE Atmela.
Program „ładowany” do proce-
sora Atmega16 jest zwykłym Boot
Strap Loaderem (BSL) mającym
za zadanie odpowiednie zainicjo-
wanie programu AVRProg z AVR
Studio tak, aby plik upgrade.ebn
mógł być następnie załadowany
do Flasha procesora Atmega16
za pomocą tegoż programu BSL.
Protokół transmisji pomiędzy AVR-
Prog i programatorem (BSL) jest
powszechnie znany, a opis działa-
nia wszystkich używanych komend
jest dostępny w literaturze [8...10].
Program BSL (
list
.
1
) nie wyko-
Rys. 1. Schemat interfejsu JTAG do procesorów AVR
rzystuje wszystkich komend, tym
niemniej prawie wszystkie z nich
zostały w nim umieszczone, aby
ułatwić czytelnikowi ewentualne
modyikacje software'u w przyszło-
ści. Zamieszczony program może
być skompilowany za pomocą do-
wolnej wersji AVR Studio. Należy
jednak pamiętać, że jego symula-
cja nie jest możliwa ze względu
na brak w AVR Studio 3.5x lub
jedynie fragmentaryczną obsługę
w AVR Studio 4.0x wszystkich
opcji rozkazu SPM.
Elektronika Praktyczna 6/2004
11
Interfejs JTAG do procesorów AVR
Rys. 2. Schemat kabla
null
-
modem
(oba wtyki żeńskie)
List. 1
; Program Boot Strap Loader’a do skonstruowanego interfejsu JTAG dla procesorów AVR
; współpracuje poprawnie z AVR STUDIO v.4.06 build 223
; 4.07 build 240
; 4.08 build 310
; 4.09 build 338
;---------------------------------------
.INCLUDE „m16def.inc”
;
.cseg
.org 0x1C00
;
.def D0 = r0
.def D1 = r1
.def AD0 = r15
.def AD1 = r16
.def TMP2 = r17
.def COMM = r18
.def TMP1 = r19
;
sbis PIND,PIND3
jmp 0x0000
rjmp INIT
;
.cseg
.org 0x1E00
;
INIT:
cli
ldi TMP1,0xFF ;
out SPL,TMP1
ldi TMP1,0x03 ;
out SPH,TMP1
ldi TMP1,0x00 ;
out UBRRH,TMP1 ; Transfer rate of UART 19200 BAUD (7.3728 MHz)
ldi TMP1,0x17 ;
out UBRRL,TMP1 ; Transfer rate of UART 19200 BAUD (7.3728 MHz)
ldi TMP1,0x40 ;
out UCSRA,TMP1 ; TXC = 1, USART Transmit Complete
ldi TMP1,0x18 ;
out UCSRB,TMP1 ; RXEN = 1, Receiver Enable, TXEN = 1, Transmitter Enable, 8 bit
ldi TMP1,0x86 ;
out UCSRC,TMP1 ; URSEL = 1, Register Select, UCSZ1:0 = 1, 8 bit for TRx use
ldi TMP1,0x08
out DDRB,TMP1 ; Activate PB3 for output
out PORTB,TMP1 ; Send „one” to PB3
MAIN: ; Read command from RS232
rcall GET_UART
mov COMM,TMP1
cpi COMM,0x70 ; ‘p’ Programmer type ?
brne O_com01 ; Go to other commands analysis (O_com01)
ldi TMP1,0x53 ; ‘S’
TERM_P:
rcall PUT_UART ; Send ‘S’erial programmer info
rjmp MAIN ; Read next command from RS232
O_com01:
cpi COMM,0x61 ; ‘a’ Report autoincrement address
brne O_com02 ; Go to other commands analysis (O_com02)
ldi TMP1,0x59 ; Set ‘Y’
rjmp TERM_P ; Send ‘Y’es for autoincrement address
O_com02:
cpi COMM,0x53 ; ‘S’ Return software identiier (7 characters)
brne O_com03 ; Go to other commands analysis (O_com03)
ldi TMP1,0x41 ; ‘A’
rcall PUT_UART
ldi TMP1,0x56 ; ‘V’
rcall PUT_UART
ldi TMP1,0x52 ; ‘R’
rcall PUT_UART
ldi TMP1,0x4E ; ‘N’
rcall PUT_UART
ldi TMP1,0x4F ; ‘O’
rcall PUT_UART
ldi TMP1,0x43 ; ‘C’
rcall PUT_UART
ldi TMP1,0x44 ; ‘D’
rjmp TERM_P
O_com03:
cpi COMM,0x74 ; ‘t’ Return supported device codes
brne O_com04 ; Go to other commands analysis (O_com04)
ldi TMP1,0x74 ; Set ‘t’ Device code for ATmega16
rcall PUT_UART ; Send device code
ldi TMP1,0x00 ; Device code terminated by 0x00
rjmp TERM_P ; Send termination
O_com04:
cpi COMM,0x56 ; ‘V’ Return software version
brne O_com05 ; Go to other commands analysis (O_com05)
ldi TMP1,0x33 ; ‘3’
rcall PUT_UART
ldi TMP1,0x31 ; ‘1’
rjmp TERM_P
O_com05:
cpi COMM,0x54 ; ‘T’ Select device type
brne O_com06 ; Go to other commands analysis (O_com06)
rjmp TERM_G
O_com06:
cpi COMM,0x41 ; ‘A’ Set address
brne O_com07 ; Go to other commands analysis (O_com07)
rcall GET_UART ; Get high byte of address
mov ZH,TMP1 ; Set high byte of address
rcall GET_UART ; Get low byte of address
mov ZL,TMP1 ; Set low byte of address
lsl ZL ; Convert from word
rol ZH ; to byte address
TERMINATE_BY_0D: ; Commands termination by 0x0D
ldi TMP1,0x0D
rjmp TERM_P
O_com07:
cpi COMM,0x50 ; ‘P’ Enter programming mode
brne O_com08 ; Go to other commands analysis (O_com08)
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com08:
cpi COMM,0x4C ; ‘L’ Leave programming mode
Po włączeniu napięcia zasilania
interfejsu, przełączanie oprogramo-
wania z programu BSL do pro-
gramu JTAGICE zachodzi jedynie
wówczas, gdy podłączone jest na-
pięcie zasilania do emulowanego
układu (pin 4 – VTG, gniazdo J4).
Jeśli nie występuje tam napięcie
wyższe od około 2,7 V (zależnie
od współczynnika β tranzystorów
T4, T3 i T1), „panem sytuacji”
pozostaje program BSL i możliwe
jest zaprogramowanie lub przepro-
gramowanie interfejsu.
Montaż i uruchomienie
układu JTAG-a
Ze względu na częściowe za-
stosowanie elementów SMD, ich
montaż wykonujemy począwszy
od najmniejszych, aż do najwięk-
szych (widok płytki drukowanej
wraz z rozmieszczeniem elemen-
tów opublikujemy w EP7/2004).
Pozwala to uniknąć nadtopienia
dużych podzespołów (np. gniaz-
da) w czasie lutowania pomiędzy
nimi małych rezystorów lub kon-
densatorów. Układy scalone warto
wyposażyć w podstawki (precy-
zyjne), mając na uwadze przyszłe
modyikacje układu lub ewentu-
alne „tragiczne” błędy w podłą-
czaniu interfejsu do komputera
lub emulowanych układów. Koszt
niewielki, a komfort napraw jest
nie do pogardzenia.
Po zmontowaniu i doprowadze-
niu zasilania (+8...12 V względem
masy) warto sprawdzić woltomie-
rzem poziomy napięć na koń-
cówkach kondensatorów C1 i C4
dołączonych do układu scalonego
MAX232 (odpowiednio ok. –6...10
i +6...10 V względem masy).
Należy też sprawdzić, czy podłą-
czenie pinu 4 w gnieździe J4 do
VCC (+5 V) skutkuje zapaleniem
się diody D3 (zielonej). Na tym
praktycznie kończy się uruchomie-
nie hardware’u.
Za pomocą AVR Studio na-
leży skompilować program BSL
12
Elektronika Praktyczna 6/2004
Interfejs JTAG do procesorów AVR
List. 1. cd.
(zawarty w pliku bsl.asm) do
postaci IntelHex (bsl.hex). Pod-
łączyć programator STK200/300
[11] do układu JTAG-a i włączyć
jego zasilanie. Po skonigurowaniu
oprogramowania PonyProg [12] (ka-
libracja i ustawienie na „AVR mi-
cro” oraz Atmega16) „wgrać wsad”
do procesora JTAG-a. Za pomocą
opcji
Coniguration
and
Security
Bits
zaprogramować bity: JTAGEN,
BOOTSZ1, BOOTSZ0, BOOTRST.
Należy pamiętać o „odprogramowa-
niu” bitu CKSEL0. Jest to istotne,
bowiem procesory Atmega16 mają
ten bit zaprogramowany w chwili
zakupu. Po tych operacjach progra-
mator nie będzie już potrzebny.
Po podłączeniu interfejsu JTAG
do komputera za pomocą kabla
z rys. 2 i włączeniu napięcia za-
silania układu, należy uruchomić
AVR Studio (wersje 4.06...09). Nie
jest wymagane otwieranie żadnego
projektu. W opcji Tools trzeba
wybrać AVR Prog..., a po wy-
świetleniu się menu programatora
klawiszem
Browse
należy wskazać
plik upgrade.ebn znajdujący się
w katalogu: ...\Program Files\Atmel\
AVR Tools\JTAGICE. Uwidocznienie
pliku upgrade.ebn następuje po
włączeniu opcji
Pliki
typu
All
i-
les
(*.*). Następnie po naciśnięciu
klawisza
Program
w opcji
Flash
rozpocznie się wprowadzanie
„wsadu” do procesora interfejsu,
sygnalizowane paleniem się diody
D1 (żółtej). Wraz ze zgaśnięciem
diody (koniec programowania)
interfejs JTAG jest gotów do
współpracy z daną wersją AVR
Studio. Można to sprawdzić, bez
podłączania emulowanego układu,
łącząc pin 4 gniazda J4 z VCC
i powtórnie włączając napięcie
zasilania. Diody D1 (żółta) i D3
(zielona) zapalą się, a po wywo-
łaniu w AVR Studio opcji
Tools
i
STK500
/
AVRISP
/
JTAGICE
zgaśnie
dioda D1 i pojawi się na ekranie
komunikat o wadliwym działaniu
interfejsu polegającym między in-
nymi na braku zasilania w emu-
lowanym układzie.
Rozkład wyprowadzeń w gnieź-
dzie J4 jest zgodny ze standar-
dem stosowanym przez Atmela
w układzie uruchomieniowym
STK500 i opisanym w instrukcji
obsługi JTAGICE [13]. Po podłą-
czeniu opisywanego interfejsu do
emulowanego układu (zastoso-
wałem tutaj procesor Atmega16)
brne O_com09 ; Go to other commands analysis (O_com09)
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com09:
cpi COMM,0x73 ; ‘s’ Read signature bytes (3 bytes)
brne O_com0A ; Go to other commands analysis (O_com0A)
ldi TMP1,0x1E ;
rcall PUT_UART
ldi TMP1,0x94 ;
rcall PUT_UART
ldi TMP1,0x03 ; 0x03 for ATmega16
rjmp TERM_P
O_com0A:
cpi COMM,0x64 ; ‘d’ Read data memory (EEPROM)
brne O_com0B ; Go to other commands analysis (O_com0B)
out EEARL,ZL ; Set address ZH:ZL
out EEARH,ZH ;
sbi EECR,EERE ; Set bit EERE – EEPROM Read Enable (in EECR register)
in TMP1,EEDR ; Read data
adiw ZH:ZL,0x01 ; Increment address by 0x01
rjmp TERM_P ; Send read EEPROM data to RS232
rjmp MAIN ; Read next command from RS232
O_com0B:
cpi COMM,0x52 ; ‘R’ Read program memory
brne O_com0C ; Go to other commands analysis (O_com0C)
ldi TMP1,0x11 ;Read-while-write Section Read Enable activation
out SPMCR,TMP1 ; within 4 cycles after SPM instruction
spm
lpm ; Read byte (Flash) from address ZH:ZL
mov D1,D0
adiw ZH:ZL,0x01
lpm ; Read byte (Flash) from address ZH:ZL
adiw ZH:ZL,0x01
mov TMP1,D0
rcall PUT_UART ; Send low byte of program to RS232
mov TMP1,D1
rjmp TERM_P ; Send high byte of program to RS232
O_com0C:
cpi COMM,0x63 ; ‘c’ Write program memory, low byte
brne O_com0D ; Go to other commands analysis (O_com0D)
rcall GET_UART ; Read byte of data
mov AD0,TMP1 ; Store data in AD0
mov AD1,ZL ; Store ZL
andi AD1,0x7F ; Hide most signiicant bit of AD1
tst AD1 ; Test if 7 less signiicant bites of address ZL are zero
brne SETD0 ; If they are not zero set D0(r0) by data for next SPM instruction
ldi TMP1,0x03 ;
out SPMCR,TMP1 ; Page erase (TMP1=0x03) within 4 cycles
spm
PER:
in TMP1,SPMCR ; Set SPMCR for erasing
sbrc TMP1,SPMEN ; SPMEN – Store Program Memory Enable
rjmp PER ; Erasing complete ?
SETD0:
mov D0,AD0 ; Set D0(r0) by data
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com0D:
cpi COMM,0x43 ; ‘C’ Write program memory, high byte
brne O_com0E ; Go to other commands analysis (O_com0E)
rcall GET_UART ; Read byte of data
mov D1,TMP1 ; Store data in D1
ldi TMP1,0x01 ;
out SPMCR,TMP1 ; Write D0, D1 content to Flash address ZH:ZL
spm
adiw ZL,0x02 ; Increment ZH:ZL by 2
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com0E:
cpi COMM,0x6D ; ‘m’ Issue Page Write
brne O_com0F ; Go to other commands analysis (O_com0F)
ldi TMP1,0x05 ;
out SPMCR,TMP1 ; Page write from buffer (beginning address by ZH:ZL)
spm
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com0F:
cpi COMM,0x65 ; ‘e’ Chip erase
brne O_com10 ; Go to other commands analysis (O_com10)
rjmp EREASE
O_com10:
cpi COMM,0x55 ; ‘U’ Chip erase II
brne O_com11 ; Go to other commands analysis (O_com11)
EREASE:
ldi ZL,0x00 ; Set low byte of address
ldi ZH,0x00 ; Set high byte of address
ldi AD1,0x00 ; Set irst page number
PAGE_ER:
ldi TMP1,0x03 ;
out SPMCR,TMP1 ; Page erase (TMP1=0x03) within 4 cycles
spm
subi ZL,0x80 ; Set address of next page low byte
sbci ZH,0xFF ; Set address of next page high byte
cpi AD1,0x70 ; Compare with last page number
breq ER_COM
inc AD1 ; Set next page number
rjmp PAGE_ER
ER_COM: ; Erasing completed
in TMP1,SPMCR
sbrc TMP1,SPMEN ; Erasing completed ?
rjmp ER_COM
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com11:
cpi COMM,0x78 ; ‘x’ Set LED
brne O_com12 ; Go to other commands analysis (O_com12)
rjmp TERM_G
O_com12:
cpi COMM,0x79 ; ‘y’ Clear LED
brne O_com13 ; Go to other commands analysis (O_com13)
sbis PINB,PINB3
rjmp LED1
cbi PORTB,PB3 ; When PB3=1 then clear it
rjmp TERM_G
LED1:
sbi PORTB,PB3 ; When PB3=0 then set it
TERM_G: ; Procedure of termination code 13d (0D) prior data receive
rcall GET_UART ; Receive data
Elektronika Praktyczna 6/2004
13
Interfejs JTAG do procesorów AVR
i wywołaniu w AVR Studio opcji
Tools
i
STK500
/
AVRISP
/
JTAGICE
pojawi się okno umożliwiające
sprawdzenie poprawności działania
(programowanie, kasowanie Flasha,
ustawianie
fuse
i
lock
bitów, czy-
tanie sygnatury procesora itp.) oraz
skonigurowanie JTAGICE. Cóż, nie
jest to jeszcze pełny sukces całego
przedsięwzięcia, ale daje już obraz
ogromnych możliwości interfejsu.
W następnym kroku, otwarcie
za pomocą AVR Studio nowego
projektu z pliku testowego test.asm
(
list
.
2
) pozwala na przetestowanie
działania interfejsu JTAG. W tym
celu po wejściu do opcji
Debug
należy wybrać rodzaj emulatora
i procesor w
Select
Platform
and
Device
. W naszym przypadku jest
to JTAGICE i Atmega16. W opcji
tej (wersje 4.09 i 4.08) zaznacza-
jąc okienko
Open
Platform
Options
możemy skonigurować, między
innymi, szybkość z jaką interfejs
będzie komunikował się z emulo-
wanym procesorem – częstotliwość
zegara JTAG-a nie może przekra-
czać 1/4 częstotliwości zegara emu-
lowanego procesora. Po dokonaniu
wyboru i zamknięciu okienka na-
ciśnięcie klawisza
Start
Debugging
powoduje uruchomienie emulato-
ra. W poprzednich wersjach AVR
Studio (4.06 i 4.07) koniguracji
emulatora można dokonać dopiero
po opcji
Start
Debugging,
wywołu-
jąc opcję
JTAG
ICE
Options
. Warto
zaznaczyć, że wersje 4.09 i 4.08
również w tym samym miejscu
posiadają powyższą opcję pozwala-
jącą na ewentualną rekonigurację
emulatora. Jednak opcja ta zostaje
„dodana” do menu debugera do-
piero po wykonaniu opcji
Select
Platform
and
Device
.
Wykonując testowy pro-
gram (test.asm lub odpowiednio
test.hex) rozkaz po rozkazie (ko-
lejne kliknięcia klawisza F11),
możemy obserwować na ekranie
zmiany w rejestrach procesora.
Praktycznie rzecz biorąc praca
z JTAG-iem wygląda dokładnie
tak samo, jak z Symulatorem
AVR Studio. Jedyną różnicę sta-
nowi fakt zapalania się diody D1
(żółtej) w momencie przeładowy-
wania zawartości rejestrów z emu-
lowanego procesora do komputera.
No, może jeszcze jedno rzuca się
w oczy, a mianowicie w przypad-
ku symulatora mamy na starcie
„pięknie” wyzerowane wszystkie
List. 1. cd.
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com13:
cpi COMM,0x1B ; „ESCAPE ?” Clear UART buffers
brne O_com14 ; Go to other commands analysis (O_com14)
rjmp MAIN ; Read next command from RS232
O_com14:
cpi COMM,0x6C ; ‘l’ Set BLB and LB bits
brne O_com15
rcall GET_UART ; Receive data
mov D0,TMP1
; rcall BLB_SET ; Always deactivate Boot and Lock Bits setting
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com15:
cpi COMM,0x76 ; ‘v’ Hardware version (1.2)
brne O_com16
ldi TMP1,0x61 ; ‘1’ + 0x30
rcall PUT_UART
ldi TMP1,0x62 ; ‘2’ + 0x30
rjmp TERM_P
O_com16:
cpi COMM,0x44 ; ‘D’ Write data memory (EEPROM)
brne O_com17
rcall GET_UART ; Receive data
out EEDR,TMP1 ; Set data for EEPROM writing
out EEARL,ZL ; Set low byte of address
out EEARH,ZH ; Set high byte of address
PEE0:
in TMP1,SPMCR
sbrc TMP1,SPMEN ; SPMEN – Store Program Memory Enable
rjmp PEE0 ; SPM complete ?
PEE1:
sbic EECR,EEWE
rjmp PEE1 ; EEPROM writing complete ?
sbi EECR,EEMWE ; EEPROM writing activate
sbi EECR,EEWE ; EEPROM write
adiw ZH:ZL,0x01 ; Increment address by 0x01
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com17:
cpi COMM,0x46 ; ‘F’ Read fuse and lock bits
brne O_com18
ldi TMP1,0xFF
rjmp TERM_P
O_com18:
cpi COMM,0x66 ; ‘f’ Write fuse bits
brne O_com19
rjmp TERM_G
O_com19:
cpi COMM,0x66 ; ‘:’ Universal command
brne O_com1A
rcall GET_UART ; Get 1st byte of data
rcall GET_UART ; Get 2nd byte of data
rcall GET_UART ; Get 3rd byte of data
ldi TMP1,0xFF
rcall PUT_UART ; Send reply
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com1A:
cpi COMM,0x2E ; ‘.’ New universal command
brne O_com1B
rcall GET_UART ; Get 1st byte of data
rcall GET_UART ; Get 2nd byte of data
rcall GET_UART ; Get 3rd byte of data
rcall GET_UART ; Get 4th byte of data
ldi TMP1,0xFF
rcall PUT_UART ; Send reply
rjmp TERMINATE_BY_0D ; Send termination code 13d (0D)
O_com1B:
cpi COMM,0x5A ; ‘Z’ Special test command
brne O_com1C
rcall GET_UART ; Get 1st byte of data
rcall GET_UART ; Get 2nd byte of data
ldi TMP1,0xFF
rjmp TERM_P ; Send reply
O_com1C:
ldi TMP1,0x3F ; ‘?’
rjmp TERM_P ; Send „I beg your pardon ?”
;
GET_UART: ; UART receiving
sbis UCSRA,RXC ; RXC – USART Receive Complete
rjmp GET_UART ; UART ready for receiving ?
in TMP1,UDR ; Receive data from RS232
ret
;
PUT_UART: ; UART sending
sbis UCSRA,UDRE ; UDRE – USART Data Register Empty
rjmp PUT_UART ; UART ready for sending ?
out UDR,TMP1 ; Send data to RS232
ret
;
BLB_SET: ; Lock bits setting
ldi TMP1,0x09 ; Set for BLB activation
out SPMCR,TMP1 ; BLB activate
spm ; BLB activate
BLB_SET1: ; Monitoring completion of Writing
in TMP1,SPMCR
sbrc TMP1,SPMEN ; SPMEN – Store Program Memory Enable
rjmp BLB_SET1 ; SPM complete ?
ret
;
rejestry (r0...r31), natomiast JTAG
pokazuje, jak wiele jest w nich
„brudu” w chwili rozpoczęcia
wykonywania programu. Warto
dodać, że interfejs JTAG przeła-
dowuje zawartość wszystkich re-
jestrów z emulowanego układu do
AVR Studio. Jednakże, podobnie
jak w czasie pracy Symulatora,
czerwonym kolorem podświetlone
są jedynie te, których zawartość
została zmodyikowana w wyniku
działania ostatniej instrukcji.
W przypadku, gdy zmieniamy
wersję AVR Studio z np. 4.06
na 4.07, powinien również ulec
14
Elektronika Praktyczna 6/2004
Plik z chomika:
balart
Inne pliki z tego folderu:
AVT434.pdf
(354 KB)
AVT5375.pdf
(10227 KB)
AVT-1633.pdf
(5967 KB)
AVT-5118_cz1.pdf
(4814 KB)
AVT1525.pdf
(3791 KB)
Inne foldery tego chomika:
Katalog tranzystorów biopolarnych
Projekty
Zgłoś jeśli
naruszono regulamin