AVR JTAG 에뮬레이터의 제작

AVR Project 조회 수 24557 추천 수 53 2003.11.05 09:35:28


http://avr.openchip.org/bootice/index.html
■ BootICE(아트멜 AVR JTAG ICE와 호환)를 만들자
아직도 JTAG ICE를 많은 돈을 주고 구입하십니까?
여기에 완전하게 호환되는 BootICE의 완전한 설계(회로도,기판,소스,오브젝트,설명서)가 있습니다.
조금만 노력하면 ISP보다 훌륭하고 AVR스튜디오에서 에뮬레이션과 디버깅이되는 개발도구입니다.

1. ATmega163 (혹은 Atmega16, 부트로더를 고친다 !!)
2. 7.3728MHz 크리스털
3. 표준 UART 직렬 드라이버 (MAX232 등)
4. VREF (핀 29)는 VCC으로 연결
5. ADC2 (핀 35)는 VCC으로 연결
6. PD3 풀다운 저항 4k7
7. ICE에 연결할 타겟(피시험용)용 ATmega PCB
8. TDO - PB6(핀 12)는 타겟의 TDO로 연결 ㅡ램
9. TDI - PB5(핀1)은 타겟의 TDI로 연결
10. TMS - PB1(핀 41)은 타겟의 TMS로 연결
11. TCK - PB7(핀 3)은 타겟의 TCK로 연결
12. PB3(핀 43)은 LED (LED의 다른쪽은 VCC에 연결)로 연결, 이것은 "JTAG Activity" 이다.
13. 소스 bootice.bas (AVR 베이직 소스)의 bootice.rom을 포니 프로그램으로 굽는다.
    (주의 : 부트로더는 m163 전용이다)
부트로더 오브젝트 http://avr.openchip.org/bootice/bootice.rom(구형)
부트로더 소스 http://avr.openchip.org/bootice/bootice.bas(구형)
포니 프로그램 http://www.lancos.com/
14. 휴즈 세팅: BOOTSZ, BOOTRST를 모두 세트,
클럭은 절대로건드리지 않는다. 포니 프로그램 화면을 보라.

15. 타겟 ATmega를 COM포트에 연결
16. AVRStudio 4를 시작한다.
17. AVRPROG을 연다
18. C:\Atmel AVR\JTAGICE\Upgrade.ebn"에 있는 플래시 화일을 선택.
19. Flash 프로그램을 하고, AVRPROG을 닫는다.
20. 포니프로그램을 사용하여 휴즈를 굽는다.
    BOOTRST는 세트하지 않는다. 포니 프로그램 화면을 보라.
  
21. AVRStudio 4 에서, Tools-JTAGICE을 다음 화면을 따라서 세트한다.

22. AVRStudio에서 JTAGICE로 연결된 것을 축하합니다!
23. JTAGICE를 사용하세요 !

이 작업은 전통적 입니다 ! 나는 TDO의 시작을 실수하였다.
누군가가 구형의 JTAG ICE 데이터시트에서 수정된 틀린 핀을 인터넷으로 친절하게 알려 주었다

■ Bootice(ATMEL JTAG호환) 계통도(신형)


■ Bootice(ATMEL JTAG호환) RS232C 회로도(신형)


■ Bootice(ATMEL JTAG호환) ICE 회로도(신형)


■ Bootice(ATMEL JTAG호환) 전원 회로도(신형)


■ Bootice(ATMEL JTAG호환) 첫번째 제작예(구형)


■ Bootice(ATMEL JTAG호환) 두번째 제작예(구형)


■ Bootice(ATMEL JTAG호환) 케이스에 넣은 제작예(구형)


■ m16 부트로더 bas 소스와 rom 오브젝트(구형)
http://avr.openchip.org/bootice/bootice16.bas
http://avr.openchip.org/bootice/bootice16.rom

■ JTAG OCD와 AVR JTAG 플래시 프로그램의 추가 안내
http://www.case2000.com/ocd.html

■ AVR OCD (On Chip Debug / 한줄 디버그 인터페이스) 설명
주: 이 안내는 공개자료의 설명을 수정한 것이다.
이것은 오직 종합적인 추측이며, 그리고 역시 완전하지 않다.
복제된 것은 오직 AVR OCD의 "개인적인 전용" 코멘드 (JTAG 지침들 8,9,A,B)이다.
오직 코멘드와 상태 비트들은 실제로 실리콘 상에서 비교되고 복제되었다.

○ DebugWire(한줄 디버그 인터페이스)
첫번째 공개는 2003년 5월이다.
ATtiny13, ATtiny2313은 OCD 인터페이스를 가질수 있다.
OCD란 On Chip Debug의 약자이며, 원래는 아트멜사의 비공개 자료이다.
가장 상세한 OCD는 공개되어 알게된 것이다.
savannah.gnu.org의 팀에 의한 이 자료의 가장 큰 부분은 JTAG의 덤프가 기본이었다.

○ BootICE는 JTAGICE와 1:1 호환으로 부트되는 하드웨어 플렛폼이다.
BootICE가 아트멜 응용노트 109에 의한 자체 프로그램 부트로더에 의해서 프로그램되었을때
아트멜의 AVRPROG은 JTAGICE의 펌웨어 업그레이드를 사용할 수 있다.
BootICE가 업데이트된 후에는 JTAG ICE Debugger와 호환의 JTAGICE가 된다.
물론 BootICE를 어떤 특정한 다른기능으로 부트하는 것도 가능하다.
첫번째로 성공한 BootICE 설정은- ATmega163으로 만들어진 기판은 BootICE(JTAGICE로 부트된)로 표시된다.
OCD 디버그 타겟 ATmega163은 ISP 헤더로 연결된 ISP163을 모두 가지고 있다.

■ JTAG을 사용한 AVR 플래시 프로그램
http://www.case2000.com/avrjtag.html
Copyleft(카피라잇이 아님/ 카피 레프트) 2003 Nugis Foundation.
첫번째 만든 구형은 http://www.case2000.com/JtagIce/ 에서 공개합니다.

■ JTAG 시험용 ATmega163-8AI를 사용한 타겟 회로도 (STK501 호환 ISP콘넥터)


■ AVR JTAG OCD (개인) 코멘드 설명서 날짜(2003년 4월 05일)
JTAG 명령 0x08 - 강제 브레이크(상태를 보기 위한 사용자의 정지명령)  
◎ JTAG 명령 0x09 - 작동
◎ JTAG 명령 0x0A - AVR 명령실행 (2 Words!)
   0x0A 사용, SDR 0xFFFF0000을 PC로 읽는다 (실지로 PC+2 혹은 PC+4로 리턴)
◎ JTAG 명령 0x0B - OCD 레지스터 호출
모두 16개의 어드레스 지정 가능한 레지스터
IR 다음의 DRSHIFT는 RW 플랙 (1=Write) + 4 비트 어드레스
이들 데이터는 명령에서 21 (5 + 16) 비트이다.
읽기 작동을 위한 OCD 어드레스는 미리 래치되어야 한다!
◎ 레지스터 0 PSB0
◎ 레지스터 1 PSB1
◎ 레지스터 2 PDMSB
◎ 레지스터 3 PDSB
◎ 레지스터  8 브레이크 제어 레지스터 (BCR)
--------------------------------------------
Bit    rw   설명  
--------------------------------------------
D15   rw   1=타이머를 브레이트 되기까지 작동
D14   rw   1=PC는 브레이크후에 +4 아니면 +2를 읽는다?
D13   rw   1=수정된 흐름 ? 에서 브레이크
D12   rw   1=PSB0 허가  
D11   rw   1=PSB1 허가  
D10   rw   1=단일 브레이크로 PDMSB 허가
D9   rw   1=브레이크 비교에서 마스크를 허가
D8   rw   1=  
--------------------------------------------
D7   rw   1=*  
D6   rw   1=  
D5   rw   1=  
D4   rw   1=*  
D3   rw   1=*  
D2   rw   1=  
D1-0   r   (0으로 읽힘)  
--------------------------------------------
* 주 D7, D4, D3들이 모두 세트될 때, PDSB는 프로그램 브레이크의 허가
◎ 레지스터 9 - 브레이크 상태 레지스터 (BSR)
D15-D8은  r(읽기)이다    
--------------------------------------------
Bit   rw   설명  
--------------------------------------------
D7   r   1=흐름전환으로 브레이크 작동   
D6   r   1=PSB0 (리지스터 0)로 브레이크 작동  
D5   r   1=PSB1 (리지스터 1)으로 브레이크 작동  
D4   r   1=PDMSB (단일 브레이크에 의한 리지스터 2)로 브레이크 작동  
D3   r   1=PDSB (리지스터 3)로 브레이크 작동  
D2   r   1=? (보여준)로 브레이크 작동  
D1   r   1=OCD (명령 8)에 의해서 강제 브레이크  
D0   r   1=AVR 브레이크 명령(0x9598)으로 브레이크  
--------------------------------------------
◎ 리지스터 C - OCDR 뒤로읽기(read back)
--------------------------------------------
Bit      rw   설명  
--------------------------------------------
D15-8  rw   OCDR 7..0  
D7-0   r     사용안함 (0으로 읽힘)  
--------------------------------------------
◎ 레지스터 D - 제어와 상태 레지스터
--------------------------------------------
Bit   rw   설명  
--------------------------------------------
D15   rw   1= OCDR 허가  
D14   rw   1=?  
D13-D5   r    
D4   r   1=OCDR은 AVR과 OCD의 읽지않음에 의해 쓰여진다  
D3   r   1=Reset는 active 안됨  
D2   r   1=Reset는 active 안됨 
D1-0   r    
--------------------------------------------

■ 시험 프로그램 (JAM)
이것은 OCDR로 호출을 허가한다, 그리고 OCDR(using 0xA exec-avr-insts)에 상수로 기록한다.
그리고 OCDR의 내용을 읽고 표시한다.

NOTE "MAX_FREQ" "100000";
IRSTOP IDLE;
   DRSTOP IDLE;
ACTION read_idcode = header RECOMMENDED,
   check_chain RECOMMENDED,
   exiting;
DATA data_chain;
   BOOLEAN idval[32];
'**********************************
   INTEGER ilen = 4; ' IR 범위는 4
   INTEGER scanlen = 141; ' ATmega16의 스캔 범위는 141
'****************************************************
   ' AVR JTAG 코멘드
   '****************************************************
   '
   ' JTAG 의무 코멘드
   '
   BOOLEAN extest[ilen] = $0;
   '
   ' JTAG IDCODE 코멘드 (IEEE 1149.1을 보라)
   '
   BOOLEAN idcode[ilen] = $1;
   BOOLEAN sample_preload[ilen] = $2;
   '
   ' AVR JTAG 프로그래밍 코멘드 (완전한 설명서는 Atmel 자료에 있다!)
   '
   BOOLEAN prog_enable[ilen] = $4; '
   BOOLEAN prog_commands[ilen] = $5; '
   BOOLEAN prog_preload[ilen] = $6; '
   BOOLEAN prog_pageread[ilen] = $7; '
   '
   ' AVR JTAG OCD "전용" 코멘드 (NDA와 Atmel 승인이 필요!)
   '
   '
   ' 코멘드 0x8:
   '
   BOOLEAN avr_08[ilen] = $8; ' 08은 전용 코멘드
   '
   ' 코멘드 0x9: Break? 를 해제
   '
   BOOLEAN avr_09[ilen] = $9; ' 09는 전용 코멘드
   '
   ' 코멘드 0xA: AVR 명령 실행
   '
   ' IRSCAN 4, $A;
   ' DRSCAN 16, instr_1
   ' ..
   ' DRSCAN 16, instr_n
   '
   BOOLEAN avr_instr[ilen] = $A; ' 0A는 전용 코멘드
   '
   ' 코멘드 0xB: 내부 어드레스 공간 읽기/쓰기
   '
   '
   ' IRSCAN 4, $B;
   ' DRSCAN n?, ADDR_SPACE_SELECTOR+RW_FLAG
   ' DRSCAN 16,addr?
   ' DRSCAN 16,data?
' B:C - OCDR 읽기
   ' IRSCAN 4, $B;
   ' DRSCAN n, $0C;
   ' DRSCAN 16, $0000, CAPTURE OCDR[15..0];
BOOLEAN avr_comm[ilen] = $B; ' 0B Private
   '
   ' JTAG OCD "전용" 코멘드: 리셋 AVR
   ' DR은 1 비트 폭으로, "1" 은 리셋을 홀드한다, "0" 은 Run
   ' IRSCAN 3, $C;과 ' DRSCAN 1, $1; 는 ' sysclk 카운터를 항상 청소(clear)한다,
   ' 주 JTAG_AVR_RESET 이 엑티브 되면 AVR 코어는 항상 청소한다, 물론 AVR 코어는 실행되지 않는다.
   ' 그러나 코멘드로 부터 주변장치들은 리셋에서 홀드되지 않는다
   ' 0xA는 주변장치로 쓴다
   '
   BOOLEAN avr_reset[ilen] = $C; ' 0C Reset, one bit, 1=RESET
' 코멘드 0x3, 0xD, 0xE 들은 충족하지 않는다
'
   ' JTAG 복제 코멘드, "Bypass" 안에 TAP 제어기를 설치한다
   '
   BOOLEAN bypass[ilen] = $F;
BOOLEAN comm [32];
   BOOLEAN b16 [16];
   BOOLEAN b24 [24];
   BOOLEAN b32 [32];
BOOLEAN ocd [40];
BOOLEAN scanr [scanlen]; ' 범위스캔 리지스터
   BOOLEAN instr [16]; ' 명령
   BOOLEAN tick [16]; ' 클럭음
   ENDDATA;
PROCEDURE header;
   PRINT "******************************************************************************";
   PRINT " AVR JTAG OCD sniffer! ";
   ENDPROC;
PROCEDURE print16 USES data_chain;
   PRINT "B16= ", b16[15],b16[14],b16[13],b16[12],b16[11],b16[10],b16[9],b16[8],    b16[7],b16[6],b16[5],b16[4],b16[3],b16[2],b16[1],b16[0];
   ENDPROC;
PROCEDURE print_ocd USES data_chain;
   PRINT "OCD= ", ocd[39],ocd[38],ocd[37],ocd[36],ocd[35],ocd[34],ocd[33],ocd[32],    " ", ocd[31],ocd[30],ocd[29],ocd[28],ocd[27],ocd[26],ocd[25],ocd[24],    " ", ocd[23],ocd[22],ocd[21],ocd[20],ocd[19],ocd[18],ocd[17],ocd[16],    " ", ocd[15],ocd[14],ocd[13],ocd[12],ocd[11],ocd[10],ocd[9],ocd[8],    " ", ocd[7],ocd[6],ocd[5],ocd[4],ocd[3],ocd[2],ocd[1],ocd[0];
   ENDPROC;
   PROCEDURE print_port USES data_chain;
   ' INTEGER i_32;
   ' FOR i_32 = 0 to scanlen-1;
   ' scanr[0] = 0;
   ' NEXT i_32;
scanr[135] = 0;
   scanr[132] = 0;
IRSCAN ilen, sample_preload[3..0];
   ' Boundary Scan
   DRSCAN scanlen, scanr[(scanlen-1)..0], CAPTURE scanr[(scanlen-1)..0];
' Print PORTA
   PRINT "PORTA ", scanr[23],scanr[20],scanr[17],scanr[14],scanr[11],scanr[8],scanr[5],scanr[2];
   PRINT "DDRA ", scanr[22],scanr[19],scanr[16],scanr[13],scanr[10],scanr[7],scanr[4],scanr[1];
IF (scanr[72] == 1) THEN PRINT "RESET HIGH";
   IF (scanr[72] == 0) THEN PRINT "RESET LOW";
' PRINT "OSC: ", scanr[66],scanr[65],scanr[64],scanr[63];
   ENDPROC;
   PROCEDURE reset_avr USES data_chain;
   IRSCAN ilen, avr_reset[3..0];
   DRSCAN 1, $1;
   ENDPROC;
PROCEDURE exec_avr USES data_chain;
   IRSCAN ilen, avr_instr[3..0];
   DRSCAN 16, instr[15..0];
   ENDPROC;
   PROCEDURE check_chain USES data_chain, print16, print_ocd, exec_avr, reset_avr,    print_port;
   PRINT "******************************************************************************";
IRSCAN ilen, avr_reset[3..0];
   DRSCAN 1, $1;
IRSCAN ilen, avr_reset[3..0];
   DRSCAN 1, $0;
WAIT IDLE, 7000 USEC, IDLE;
PRINT "TEST OCDR";
   PRINT "******************************************************************************";
IRSCAN ilen,avr_comm[3..0]; ocd[4..0] = $0D; DRSCAN 5, ocd[4..0];
   ocd[39..0] = $1D8000; DRSCAN 21, ocd[20..0];
WAIT IDLE, 7000 USEC, IDLE;
instr[15..0] = $EF05; CALL exec_avr; instr[15..0] = $BF01; CALL exec_avr;
IRSCAN ilen,avr_comm[3..0]; ocd[4..0] = $0C; DRSCAN 5, ocd[4..0];
   ocd[39..0] = $0000000000; DRSCAN 16, ocd[15..0], CAPTURE ocd[15..0]; CALL print_ocd;
instr[15..0] = $EA06; CALL exec_avr; instr[15..0] = $BF01; CALL exec_avr;
IRSCAN ilen,avr_comm[3..0]; ocd[4..0] = $0C; DRSCAN 5, ocd[4..0];
   ocd[39..0] = $0000000000; DRSCAN 16, ocd[15..0], CAPTURE ocd[15..0]; CALL print_ocd;
   ENDPROC;
   PROCEDURE exiting;
   PRINT "******************************************************************************";
   EXIT (0);
   ENDPROC;

■ 원저자
Copyleft 2003 Nugis Foundation.
http://avr.openchip.org/bootice/index.html

■ 번역자
이자료는 2003년 10월 31일에 ipstack@ipstack.co.kr에 의해서 번역 되었습니다.
무단복제 및 게시를 금하며, 원저자와 번역자를 아래와 같이 정확히 밝히는 조건으로 허락합니다.
원저자 http://avr.openchip.org/bootice/index.html
번역자 http://www.ipstack.co.kr/

List of Articles
번호 제목 글쓴이 날짜 조회 수

AVR Project PIC Based Serial Port Servo Controller file

http://www.digitalnemesis.com/ash/projects/picservo/ ◆ PIC Based Serial Port Servo Controller By Ashley Roll Ever wanted to use Servos in a robotics project? This project uses a PIC microcontroller and...

AVR 강좌 RS-232 란 무엇인가? file

RS-232 란 무엇인가...

AVR 강좌 하드웨어 기초 file [1]

윤덕용 새 페이지 1 외부 자료 Link 작성자 Thinking in C++, 2nd ed. Volume 1 Bruce Eckel Thinking in C++, 2nd ed. Volume 2 ...

AVR Project FT245AM을 사용한 USB 인터페이스 설계 file

http://www.eix.co.uk/Ethernet/USB/ FT245AM을 사용한 USB 인터페이스 설계 USb는 생각보다 빠르다. USB는 PC의 저속에서 중속의 주변장치에서 새로운 방법을 제공한다. 새로운 USB 표준은 RS232C와 비교하면 보다 ...

AVR Project VHF 무선 데이터 수신기 file

http://jaichi.virtualave.net/avr-prog-e.htm 새 페이지 1 VHF 무선 데이터 수신기 ■ 회로: 이 수신기는 증폭도과 함께 크리스털 세트보다 작습니다. 작동전압 범위는 3V 에서 5V입니다. 나의 책상위에서는 2.5V이하로 작동합니다....

AVR Project VHF 무선 데이터 송신기 file

http://users.cableaz.com/~cappels/dproj/LCRFLINK/TRRxmtr/TRFxmtr.htm 새 페이지 1 산뜻한 생각으로 대략 접근하는 무전원의 송신기를 그렸다. 쓰기 시작하기 전에. 디커플링 캐패시터를 너무 크게 만들지 않도록 주의하라 그래서, ...

AVR Project AVR 6디지트 50MHz 주파수 카운터 file

http://www.myplace.nu/avr/countermeasures/index.htm AVR 6디지트 50MHz 주파수 카운터 ■ 개요 이것은 필요에 충족하는 또 다른 프로젝트이다. 나는 TTL 칩들을 이용해 간단히 주파수 카운터를 조립한적이 있다. 그것은...

AVR Tool AVR JTAG ICE file

Description: The Atmel AVR® JTAG ICE is an In-circuit Emulator for Atmel's megaAVR® Flash microcontrollers with 16K or more program memory. The JTAG ICE talks to the On-Chip debug module on the...

AVR Project PIC 전자식 그림간판의 제작(AVR로 응용가능) file

http://www.interq.or.jp/japan/se-inoue/e_pic6_2.htm 16F84A의 전자식 그림간판 메세지는 오른쪽에서 왼쪽으로 흐르며 표시한다. 128 개의 LED를 이 기판에 사용하였다. 이 장치의 소프트웨어는 다음과 같은 기술을 사용하...

AVR Project AVR JTAG 에뮬레이터의 제작 file

http://avr.openchip.org/bootice/index.html ■ BootICE(아트멜 AVR JTAG ICE와 호환)를 만들자 아직도 JTAG ICE를 많은 돈을 주고 구입하십니까? 여기에 완전하게 호환되는 BootICE의 완전한 설계(회로도,기판,소...

AVR Tool AVR Studio V4.07 설정방법 및 디버거 사용방법 file

http://www.atmel.com/ipstack AVR Studio V4.07 설정방법 및 디버거 사용방법 (1) 다음 사이트를 방문하여 AvrStudioV4.07을 받는다. http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725 그림과 같은 CD모양의...

AVR Project CMOS 카메라 Treva의 PC화상표시 file

http://www.paken.org:8080/aaf/treva/index.htmlipstack CMOS 카메라 Treva의 PC화상표시 feel H용 이미지 캡쳐유닛 Treva를 범용 CPU로 접속합니다. 입력과 출력을 1가닥의 신호선으로 OK!가장 간단한? 이미지 센서입니...

AVR Project AT90S2313 디지털 용량계 file

http://elm-chan.org/works/cmc/report.htmlipstackAT90S2313 디지털 용량계 이것은 용량을 빨리 측정하는 간단한 용량계이다. 용량의 측정 원리는 임피던스 브릿지나 딥메터처럼 용량을 한번에 측정한다. 요즈음의 표준 용량계는 Cx에...

AVR Project AVR로 만드는 3채널 다이오드 온도계 file

http://elm-chan.org/works/temp3/report_j.html 다이오드로 온도를 측정하는 3채널 온도계의 제작 고정도 써미스터를 사용하여 무조정으로 ±0.5℃の 온도정도를 실현을 하였습니다만, 최근의 프로세서는 다이온도를 직접 모니터하...

AVR Project Treva or DMR-C1 Serial Camera Interface file [3]

http://homepage3.nifty.com/mujirushi/ews/dmrc1/ipstackTreva Serial Camera Interface 이 페이지에는 독자적으로 해석한 내용이 포함되어 있으므로, 반드시 내용을 보증하는 것이 아닙니다. 이용에 있어서는 자기책임으로 하여 주시기...

AVR Project Treva를 Blutooth에 연결한 무선이동 카메라 file

http://www.asahi-net.or.jp/~qx5k-iskw/robot/blue.htmlipstack ■ Treva를 Blutooth에 연결한 무선이동 카메라 모듈의 VCC, VCC_IO, ON단자에 3.3V를 공급하고, TxD, RxD를 PC의 직렬포트에 접속합니다. 이제 모듈을 ...

AVR Project AVR90S2313과 Treva 카메라 file

http://stk500.hp.infoseek.co.jp/treva.htmlipstack 최근 마이콤등으로 움직이는 방법이 증가하고 있는 FeelH용 CMOS 카메라인 Treva입니다. STK500에는 부속된 2선식 케이블로 Vcc-GND, SCK-DO의 형태입니다. Treva와 STK500의 ...

AVR Project AT90S2313을 사용한 IR to USB 모듈 file

http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB (AVR)_eng.htm Universal USB interface & USB Infrared Interface with microprocessor AT90S2313-10 : 마이크로 콘트롤러로 USB를 완성 : IgorPlug-USB (AVR) 이기사의 ...

AVR 강좌 AVR Mega128 퓨즈비트 설정방법 file

http://www.tns-tech.co.kr128 퓨즈비트 설정방법...

AVR Project AVR Mega8을 사용한 PID제어 소스 file

http://www.circuitcellar.com/library/print/1002/eady147/index.htm LCD에 보이는 것은 실제 조리기의 온도와 음식3개의 온도이다. 압전 경보기가 꺼져 있으면, 조리기의 온도는 5° 간격으로 180° 에서 400°F이다. 음...