제목 : 실험 #1 예비보고서 GPIO LED 제어 실험목적 - AVR에대한기본적인구조및툴사용법, 프로그래밍방법등을학습한다. - AVR과연결된 LED를제어하는프로그램작성을통해 AVR의각포트별쓰임새와사용법을학습한다. 실험장비 - ATmega128(AVR Chip), LED(Blue-LED, Green-LED) 실험이론 - AVR Studio 4 ATmega128의제조사인 Atmel에서제공하는 AVR용통합개발환경 (IDE) 툴이다. Help 메뉴에서 AVR Tools User Guide 등의유용한정보도제공한다. 사용방법 Project -> New project 메뉴를클릭하면프로젝트생성대화상자가나타난다. C 코드를이용하여프로그램을작성하려면 AVR GCC를, 어셈블리코드를이용하여프로그램을작성하려면 Atmel AVR Assembler를선택한다. 프로젝트이름과기본소스파일의이름, 프로젝트의경로를입력하고 Next 버튼을클릭한다. ATmega128에사용할프로그램을작성하기위해플랫폼에서 AVR Simulator를, 디바이스에서 ATmega128을선택하고 Finish를클릭하면프로젝트가생성된다.
소스파일에프로그램코드를작성하고 Build -> Build (F7) 메뉴를클릭하면소스코드가빌드된다. 빌드과정은하단의 Message 화면에출력되고, 별다른오류없이빌드가끝나면 hex파일이생성된다. 디버깅방법 - 디버깅관련메뉴 - 버튼을눌러프로그램을시작하면메인코드의시작점에서멈춘상태로실행된다. 왼쪽의실행제어버튼 ( 혹은단축키 ) 을통해 VC++ 등다른 IDE와마찬가지로코드를트레이스할수있다. 프로그램이특정위치에서정지하기를원하면해당코드에커서를이동한뒤, 버튼 (F9) 혹은마우스메뉴에서 Toggle Breakpoint 메뉴를통해브레이크포인트를설정할수있다. C코드가어셈블리코드로변환된상태를확인하고싶다면 View -> Disassembler 메뉴를사용한다. - 브레이크포인트가설정된상태 - - Disassembler 표시상태 - 특정변수등을직접관찰하고싶다면 View -> Watch (Alt+1) 메뉴를사용한다. 그후코드상의원하는항목위에서우클릭, Add Watch 메뉴를사용한다. - Watch 화면 -
메모리내값을직접확인하고싶다면 View -> Memory (Alt+4) 메뉴를사용한다. - Memory 화면 - 좌측의콤보박스에서프로그램메모리, IO 메모리등의종류를선택하고 Address에원하는주소를입력하면해당주소로직접이동해값을확인할수있다. AVR에프로그램다운로드방법 AVR Studio는자체적으로다운로더를지원한다. AVR과케이블을연결한뒤 Tool -> Program AVR -> Connect... 메뉴를선택하고케이블이연결된포트를선택한뒤 Connect 버튼을누르고정상적으로연결이이루어지면아래와같은화면이나타난다. - AVR Studio의 Programmer 화면 - Flash란에프로그램이빌드되어생성된.hex파일을선택하고 Program 버튼을누르면 AVR에프로그램이다운로드된다. 필요시 EEPROM의데이터인.eep파일등을바로아래란을통해같은방법으로다운로드할수있다.
- ToastProg 2005 시니어컴에서개발한, AVR칩에프로그램을다운로드해주는프로그램이다. AVR Studio의 Programmer와같은기능을하는프로그램이다. 사용방법 ATmega128에다운로드하기위해 Device 메뉴혹은도구모음의디바이스목록에서 ATmega, ATmega128을선택한다. File -> Open Flash (Ctrl+F) 메뉴를통해 AVR칩에다운로드할프로그램 (.hex) 을불러온다. 필요시, File -> Open EEPROM (Ctrl+E) 메뉴를통해데이터메모리영역에다운로드할파일 (.eep) 을불러온다. Command -> Write Program(Flash) 메뉴를통해 AVR칩에프로그램을다운로드한다. 필요시, Command -> Write Data(EEPROM) 메뉴를통해데이터메모리에파일데이터를다운로드한다. - Proteus Virtual System Modelling Labcenter Electronics에서개발한시뮬레이션툴로회로의작성, 시뮬레이션을 GUI환경에서드래그 & 드롭으로간단히수행할수있다. 전류의흐름이나소자의동작을실제회로구성없이시뮬레이션상태의애니메이션을통해쉽게확인할수있는장점이있다. - Proteus 실행화면 -
사용방법 시뮬레이션에필요한소자를가져오기위해 Library -> Pick Device/Symbol 메뉴를클릭하면위의화면이나타난다. ATmega128 칩을가져오기위해키워드에 ATmega128을입력하면오른쪽화면에키워드와일치하는소자들의목록이나타난다. 원하는소자를더블클릭하면디자인화면우측의컴포넌트목록에추가된다. 마찬가지로 LED등필요한소자를찾아추가한뒤 OK버튼을누른다. 추가한컴포넌트등으로시뮬레이션회로를구성하고, ATmega128에프로그램 (hex파일) 을적용하기위해회로의 ATmega128 컴포넌트위에서마우스우클릭, Edit Properties를클릭하여속성설정화면을호출한다.
CKSEL Fuses 할목을보면클럭이 1MHz로설정되어있는데, 장비와동일하게 8MHz로변경한다. Program File 항목에빌드된프로그램파일 (.hex) 을선택하고 OK버튼을누른다. 시뮬레이션을위해 Debug -> Execute (F12) 메뉴를클릭하고, 결과를관찰한다.
- AVR 개요 노르웨이공대의 Alf-Egil Bogen과 Vegard Wollan가 AVR 마이크로컨트롤러의구조를제안했고, 1996년 Atmel사에의해개발되었다. AVR은하버드아키텍처기반으로제작되어, 프로그램과데이터의메모리가별도로구분되어사용된다. 따라서기존의폰노이만아키텍처에비해메모리처리시병목현상이줄어들게되었다. 칩내부에 Flash, EEPROM, SRAM이통합되어있어외부메모리없이대부분의프로그램이동작할수있다. 데이터메모리의주소체계는범용레지스터, IO레지스터, SRAM으로구분된다. 범용레지스터는 32개, IO레지스터는 64개가존재하며, 각레지스터는 8비트단위로사용된다. - LED (Light Emitting Diode, 발광다이오드 ) - LED 의동작원리 - - LED 의기호 - PN접합을가지는반도체로서, 순방향 (VCC->P->N->GROUND) 전압을인가하면 N형영역의자유전자 (-) 와 P형영역의정공 (+) 이 PN접합부로이동하여재결합하고, 이때전자가가지고있는에너지가빛에너지로전환되어방사된다. LED의색은반도체와첨가물의종류에따라다양하게만들어진다. - Easy Processor Kit 휴인스에서제작한마이크로프로세서교육 / 실습용시스템이다. 모듈교체로 Cortex-M3, AVR(ATmega128), 8051프로세서중원하는장비를사용할수있다. LED, Dot-Matrix, LCD, Keypad 등실습을위한다양한주변장치가구성되어있다.
실험방법 - AVR Studio 4를이용하여프로그램소스코드작성후빌드하여실행파일 (.hex) 을생성한다. - Proteus를이용하여시뮬레이션용회로를작성하고, 시뮬레이션회로에 hex파일을적용시켜작성한프로그램이원하는동작을실행하는지확인한다. - 시뮬레이션결과이상이없다면 TaostProg 2005를이용하여 AVR칩에프로그램을다운로드하여실제하드웨어에서의동작을확인한다. 시뮬레이션결과 - 예시에제시된회로의시뮬레이션화면 - - 애니메이션소자로확인 - - 프로그램의내용대로 ATmega128의 PortB0과 PortB1에서 1이출력됨을확인할수있다. - 하지만 PortB1과연결된 LED의 N형쪽에 VCC가연결되어있어조사한내용에따르면 LED가동작하지않게된다. - 확인차직관적인에니메이션으로동작하는 LED-RED소자로교체하여시뮬레이션한결과역시 LED가켜지지않았다. - 위사진은예시와함께제공된 ATmega128 Schematic 자료의 LED 부분회로이다.
- 수정된회로의시뮬레이션화면 - - 애니메이션소자로확인 - - 예시에제시된회로는 PortB1과연결된 LED에 VCC가연결되어있었으나, LED에대해조사하면서전압이올바른방향으로연결되어야 LED가켜진다는것을알게되어위와같은회로로수정하여시뮬레이션을진행했다. - ATmega128의 PortB0과 PortB1에서 1이제대로출력되며, LED에인가된전압의방향도조사한내용과일치함을확인하였다. - 직관적인에니메이션으로동작하는 LED-RED소자로교체하여시뮬레이션한결과역시제대로동작함을확인할수있었다. 예시코드분석 C 언어소스코드 #include <avr/io.h> int main(void) { unsigned char LED_ON = 0x00; DDRB = 0XFF; PORTB = 0XFF; while(1) { LED_ON = 0X03; PORTB = LED_ON; } } 어셈블리어소스코드.include "m128def.inc".def AH=R17.def AL=R16 AVR 의레지스터등을사용하기쉽게단어로매핑해놓은헤더파일을포함시킨다. LED 의초기값. OFF 로설정한다. PortB 의 0~7 까지모든포트를출력으로사용하도록한다. PortB 의 0~7 까지모든포트의출력값을 1(ON) 로초기화한다. 프로그램종료없이계속반복실행한다. 켜질 LED 를설정한다. 0, 1 번 LED 를선택했다. (0X03 = 0B00000011) 설정한 LED 선택값을 PortB 로출력한다. AVR 의레지스터등을사용하기쉽게단어로매핑해놓은파일을포함시킨다. R17 레지스터를 AH 로매핑한다. R16 레지스터를 AL 로매핑한다.
.cseg.org 0x000 LDI AH, high(ramend) LDI AL, low(ramend) OUT SPH, AH OUT SPL, AL LDI AL, 0B11111111 OUT DDRB, AL 프로그램의시작점프로그램메모리의 0x0 번지에서부터코드를시작한다. 현재시스템의메모리의마지막주소의상위바이트를 AH 에, 하위바이트를 AL 에저장한다. 스택포인터를설정하기위해스택포인터상위에 AH 를, 하위에 AL 을저장한다. 스택은거꾸로카운트되기때문에 RAMEND 의주소를사용했다. AL 을 0xFF 로설정한다. (IO 포트방향설정용 ) PortB 의 0~7 까지모든포트를출력으로사용하도록한다. LOOP: LDI AL, 0B00000000 OUT PORTB, AL LDI AL, 0B00000011 OUT PORTB, AL JMP LOOP AL 을 0 으로설정한다. (PortB 출력값초기화용 ) PortB 의 0~7 까지모든포트의출력값을 0(OFF) 로초기화한다. 반복문을위한레이블 AL 을 0x03 으로설정한다. ( 켜질 LED 선택 ) 설정한 LED 선택값을 PortB 로출력한다. LOOP 레이블로돌아가서위작업을반복한다. 참고문헌 - LED의동작원리 : 위바코리아블로그 ( http://blog.naver.com/wiva815?redirect=log&logno=20147445002 ) - ToastProg 2005 사용방법 : ToastProg 2005 1.1b 매뉴얼 ( http://www.toastprog.com/front/php/b/board_read_new.php?board_no=7&no=25 ) - AVR 개요 : WIKIPEDIA Atmel AVR ( http://en.wikipedia.org/wiki/atmel_avr ) - Easy Processor Kit: 휴인스 제품솔루션 ( http://huins.com/m13.php?m=rd&no=58 )