<BDC7C7E83120B0E1B0FABAB8B0EDBCAD202832C1D6C2F7292E687770>

Similar documents
<BDC7C7E83220B0E1B0FABAB8B0EDBCAD202833C1D6C2F7292E687770>

<BDC7C7E83120BFB9BAF1BAB8B0EDBCAD2E687770>

ATmega128

비트와바이트 비트와바이트 비트 (Bit) : 2진수값하나 (0 또는 1) 를저장할수있는최소메모리공간 1비트 2비트 3비트... n비트 2^1 = 2개 2^2 = 4개 2^3 = 8개... 2^n 개 1 바이트는 8 비트 2 2

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

2. GCC Assembler와 AVR Assembler의차이 A. GCC Assembler 를사용하는경우 i. Assembly Language Program은.S Extension 을갖는다. ii. C Language Program은.c Extension 을갖는다.

Microsoft Word - PLC제어응용-2차시.doc

<BDC7C7E83520BFB9BAF1BAB8B0EDBCAD2E687770>

<BDC7C7E83320BFB9BAF1BAB8B0EDBCAD2E687770>

OCW_C언어 기초

11장 포인터

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

정보보안 개론과 실습:네트워크

슬라이드 1

Microsoft PowerPoint - ch07 - 포인터 pm0415

목차 1. 키패드 (KeyPAD) 2. KeyPAD 를이용한비밀번호입력기

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - chap06-2pointer.ppt

UART.h #ifndef _UART_H_ #define _UART_H_ #define DIR_TXD #define DIR_RXD sbi(portd,4) cbi(portd,4) #define CPU_CLOCK_HZ UL UART PORT1 void UAR

Microsoft PowerPoint - 제5장 인터럽트 (HBE-MCU-Multi AVR).ppt [호환 모드]

Microsoft PowerPoint - chap03-변수와데이터형.pptx

Microsoft Word - 1. ARM Assembly 실습_xp2.doc

0. 표지에이름과학번을적으시오. (6) 1. 변수 x, y 가 integer type 이라가정하고다음빈칸에 x 와 y 의계산결과값을적으시오. (5) x = (3 + 7) * 6; x = 60 x = (12 + 6) / 2 * 3; x = 27 x = 3 * (8 / 4

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Microsoft Word - logic2005.doc

Visual Basic 반복문

Microsoft PowerPoint - 부호기와 복호기.PPT

Chapter. 14 DAC 를이용한 LED 밝기제어 HBE-MCU-Multi AVR Jaeheung, Lee

<BFACBDC0B9AEC1A6C7AEC0CC5F F E687770>

PowerPoint 프레젠테이션

Microsoft PowerPoint - C프로그래밍-chap03.ppt [호환 모드]

Microsoft PowerPoint - 3ÀÏ°_º¯¼ö¿Í »ó¼ö.ppt

untitled

프로그래밍개론및실습 2015 년 2 학기프로그래밍개론및실습과목으로본내용은강의교재인생능출판사, 두근두근 C 언어수업, 천인국지음을발췌수정하였음

<443A5C4C C4B48555C B3E25C32C7D0B1E25CBCB3B0E8C7C1B7CEC1A7C6AE425CBED0C3E0C7C1B7CEB1D7B7A55C D616E2E637070>

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

lecture4(6.범용IO).hwp

Microsoft PowerPoint - C++ 5 .pptx

PowerPoint Presentation

슬라이드 1

Microsoft PowerPoint - hw8.ppt [호환 모드]

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

3. 1 포인터란 3. 2 포인터변수의선언과사용 3. 3 다차원포인터변수의선언과사용 3. 4 주소의가감산 3. 5 함수포인터


인터럽트 (Interrupt) 범용입출력포트에서입출력의내용을처리하기위해매번입출력을요구하는플래그를검사하는일 (Pollong) 에대하여마이크로컨트롤러에게는상당한시간을소비하게만든다. 인터럽트란 CPU가현재처리하고있는일보다급하게처리해야할사건이발생했을때, 현재수행중인일을중단하고

I/O (GPIO) 제어 I/0 제어 ATmega128의 I/O 구성및특징 I/O PORT 구성 8비트 / 양방향 / 범용 / 병렬 I/O포트 (PORT A ~PORT F) 6개 5비트 / 양방향 / 범용 / 병렬 I/O포트 (PORT G) 1개 I/O PORT 특징

K&R2 Reference Manual 번역본

슬라이드 1

BMP 파일 처리

(1) 주소지정방식 Address Mode 메모리접근 분기주소 명령어 직접번지 Reg. 지정 Reg. 간접 Base Index 간접 Immediate 상대번지 절대번지 Long 주소 Reg. 간접 Byte Access Bit Access 내부 Data M

(b) 미분기 (c) 적분기 그림 6.1. 연산증폭기연산응용회로

[8051] 강의자료.PDF

Microsoft PowerPoint - a6.ppt [호환 모드]

PowerPoint 프레젠테이션

Microsoft PowerPoint - additional01.ppt [호환 모드]

2주차: 입출력 제어 복습

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

API 매뉴얼

Microsoft PowerPoint - es-arduino-lecture-03

버퍼오버플로우-왕기초편 10. 메모리를 Hex dump 뜨기 앞서우리는버퍼오버플로우로인해리턴어드레스 (return address) 가변조될수있음을알았습니다. 이제곧리턴어드레스를원하는값으로변경하는실습을해볼것인데요, 그전에앞서, 메모리에저장된값들을살펴보는방법에대해배워보겠습

Microsoft PowerPoint - 03_(C_Programming)_(Korean)_Pointers

학습목차 2.1 다차원배열이란 차원배열의주소와값의참조

Poison null byte Excuse the ads! We need some help to keep our site up. List 1 Conditions 2 Exploit plan 2.1 chunksize(p)!= prev_size (next_chunk(p) 3

<4D F736F F F696E74202D20C1A63036C0E520BCB1C5C3B0FA20B9DDBAB928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

윈도우즈프로그래밍(1)

Microsoft PowerPoint - 제3장 GPIO 입출력 제어 (HBE-MCU-Multi AVR)

<BDC7C7E83820BFB9BAF1BAB8B0EDBCAD2E687770>

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202831C1D6C2F72C2032C1D6C2F729>

온습도 판넬미터(JTH-05) 사양서V1.0

The Pocket Guide to TCP/IP Sockets: C Version

C프로-3장c03逞풚

예제 1.1 ( 관계연산자 ) >> A=1:9, B=9-A A = B = >> tf = A>4 % 4 보다큰 A 의원소들을찾을경우 tf = >> tf = (A==B) % A

Microsoft Word - Lab.4

API 매뉴얼

슬라이드 1

untitled

PowerPoint Presentation

Section 03 인터럽트활성화와인터럽트서비스루틴연결 34/82 장치에대한인터럽트설정과활성화 내부장치에대한특수레지스터존재 장치의특성을반영한동작설정용또는상태관찰용비트로구성 인터럽트사건의발생패턴을설정해야함 인터럽트활성화비트를 1 로셋하여, 인터럽트발생을허락» 전제, 전역

1. 객체의생성과대입 int 형변수 : 선언과동시에초기화하는방법 (C++) int a = 3; int a(3); // 기본타입역시클래스와같이처리가능 객체의생성 ( 복습 ) class CPoint private : int x, y; public : CPoint(int a

가. 도트매트릭스제어하기 단일 LED와는다르게도트매트릭스를구동시는구동전류가프로세서에서출력되는전류보다사용량을더많이필요하기때문에 TTL 계열의 IC로구동시키기에는무리가따른다. 이러한문제를해결하기위해서사용전압, 전류정격이높은달링턴트랜지스터가어레이형태로들어있는 ULN2803을

실험 5

chap 5: Trees

<4D F736F F D20BDBAC5D7C7CE20B6F3C0CEC6AEB7B9C0CCBCADB0ADC1C2202D203420C7C1B7CEB1D7B7A1B9D62E646F63>

Microsoft PowerPoint - chap10-함수의활용.pptx

Microsoft PowerPoint - 제11장 포인터(강의)

Microsoft PowerPoint - 제11장 포인터

인터럽트 * 인터럽트처리메커니즘 ATmega128 인터럽트 2

C++ Programming

untitled

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

쉽게 풀어쓴 C 프로그래밍

A Hierarchical Approach to Interactive Motion Editing for Human-like Figures

PowerPoint 프레젠테이션

<4D F736F F F696E74202D2037C0E55FC0CEC5CDB7B4C6AEC0C720B5BFC0DB2E707074>

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

PowerPoint Presentation

PowerPoint 프레젠테이션

Transcription:

제목 : 실험 #1 결과보고서 GPIO LED 제어 실험일 : 2013. 03. 12. (2 주차 ) 실험내용 - 예비과제 : ATmega126의 8개의핀에연결되어있는 LED 점멸하는프로그램 - 실험과제 : ATmega126의 8개의 LED를순차적으로켜고끄는프로그램 실험결과 - 예비과제 - 해결방법 : 점멸되는시간 (Delay) 를구현하기위해임의의변수 i를적당한지연시간이생길정도의크기만큼증가시킨후, 해당크기가되면 LED로의출력값을반전시켜점멸효과구현. : 어셈블리코드에서는각레지스터는 1바이트, 0~255까지만을카운트할수있기때문에디지털시스템실험과목에서배운분주기를응용하여레지스터세개를사용해최대 3바이트크기를카운트할수있는코드를작성했다. : 단, 시뮬레이션에서는 PortB와모든 LED가연결되었음을가정하고작성하였지만, 실제실험킷에서는각포트와 LED가 PortB(7~4:7~4), D(3~2:5~4), E(1~0:3~2) 로나뉘어연결되어있어 LED 출력부의소스코드를수정해야했다. 또, LED회로의전류방향이예제와는반대로연결되어있어출력값역시반대로변경했다. 즉, 기존예제의 1=ON, 0=OFF가아닌 1=OFF, 0=ON이된다. : 또한, PortE3는킷의다른회로와연결되어있어제대로동작하지않았는데, 점퍼 (JP13) 설정을바꿔해당회로와의연결을끊어주었다. 또 PortE2는 Piezo 소자와연결되어점멸시비프음이발생하였기에역시점퍼 (JP11) 연결을끊어주었다. - PE3 과 JP13 을통해연결된소자 - - PE2 와 JP11 을통해 Piezo 와연결됨 -

- 결과 : 약 1초마다모든 LED가동시에켜졌다가동시에꺼지는동작을확인함. - 소스코드 C 언어소스코드 #include <avr/io.h> int main(void) { unsigned char LED_ON = 0x00; unsigned long i = 0; DDRB = 0B11110000; DDRD = 0B00110000; DDRE = 0B00001100; while(1) { if(i > 55000) { LED_ON ^= 0XFF; i = 0; PORTB = LED_ON & 0b11110000; PORTD = (LED_ON & 0b00001100) << 2; PORTE = (LED_ON & 0b00000011) << 2; i++; 어셈블리어소스코드.include "m128def.inc" LED 의출력값. ON 으로초기화한다. 딜레이카운트를위한변수. PortB 의 7~4 를출력으로사용하도록한다. PortD 의 5~4 를출력으로사용하도록한다. PortE 의 3~2 를출력으로사용하도록한다. PortB 를초기화한다. PortD 를초기화한다. PortE 를초기화한다. 프로그램종료없이계속반복실행한다. i 가적당히증가하여시간이지연되면이전 LED 출력값을반전시킨후 i 를 0 으로초기화해다시카운트한다. 각포트에맞는값을뽑아내출력한다. PortD 와 E 는출력할핀이출력값보다 2 자리앞에존재하기때문에왼쪽으로두번시프트한다. 그후, 딜레이계산을위해 i 를증가시킨다..def AH=R17.def AL=R16.def CNTA=R20.def CNTB=R19.def CNTC=R18.def CNTH=R21.def LED_ON=R22.cseg.org 0x000 LDI AH, high(ramend) LDI AL, low(ramend) OUT SPH, AH OUT SPL, AL LDI AL, 0B11110000 OUT DDRB, AL LDI AL, 0B00110000 OUT DDRD, AL LDI AL, 0B00001100 R17 레지스터를 AH 로매핑한다. R16 레지스터를 AL 로매핑한다. 딜레이카운트 (2~0 중 2) 를위한레지스터. 딜레이카운트 (2~0 중 1) 를위한레지스터. 딜레이카운트 (2~0 중 0) 를위한레지스터. 딜레이카운트의비교값을저장하기위한레지스터. LED 출력값을저장하기위한레지스터. 프로그램의시작점프로그램메모리의 0x0 번지에서부터코드를시작한다. 현재프로그램의스택을설정한다. LED 와연결된각포트의출력위치를설정한다.

OUT DDRE, AL LOOP: LDI CNTH, 0B00000011 LDI AL, 0B11111111 LDI AH, 0B00000001 LDI LED_ON, 0XFF ANDI R23, 0B11110000 OUT PORTB, R23 ANDI R23, 0B00001100 OUT PORTD, R23 ANDI R23, 0B00000011 OUT PORTE, R23 ADD CNTC, AH ADD CNTB, AH INC CNTA CP CNTA, CNTH BRNE LOOP EOR LED_ON, AL JMP LOOP 딜레이카운터를초기화한다. 딜레이는 255 * 255 * 3, 즉 3 비트가필요하기때문에세개의레지스터를사용한다. 카운터의비교값을설정한다. (0B00000011 = 3) 이후 AL 은출력반전을위한피연산자로이용된다. 이후 AH 는 1 증가 ADD 연산의피연산자로이용된다. LED 의초기출력값을 OFF 로설정한다. 반복문을위한레이블현재 LED 출력값을임시레지스터에복사한다. 해당포트에출력할값만을선택한다. 해당포트에출력한다. PortD 와 E 는각각출력할포트와출력값이두자리만큼차이나기때문에왼쪽으로두번시프트한뒤출력한다. 딜레이카운터를증가시킨다. 레지스터의최대값 (255) 를넘을경우캐리가발생하기때문에 LOOP 로돌아가지않고다음코드를실행하여다음레지스터를증가시킨다. 마찬가지로두번째레지스터도캐리가발생할경우카운터의최상위값을저장한레지스터를증가시키고, 그값이 CNTH 와같을때까지반복 ( 현재설정은 3 회 ) 한다. CNTA 와 CNTH 가같을경우 LED 출력값을반전시키고카운터를초기화한다. LOOP 로돌아가반복실행한다. - 실험과제 - 해결방법 : 동작을켜질때 8단계, 꺼질때 8단계, 총 16단계로구분하는변수를두고, 켜는동작은단순히왼쪽시프트연산의결과로최하위부터 0이채워지는원리를이용해켜도록만들고, 끄는동작시엔오른쪽시프트로밀려나생긴최상위비트의자리에 OR연산을통해 1을채우는코드를작성하여하나씩끄도록만들었다. - 결과 : 약 0.5초마다 LED가하나씩켜졌다가모두다켜진후다시꺼지는동작을확인함.

- 소스코드 C 언어소스코드 #include <avr/io.h> int main(void) { unsigned char LED_ON = 0xFF; unsigned int i = 0, j = 0; DDRB = 0B11110000; DDRD = 0B00110000; DDRE = 0B00001100; PORTD = 0XFF; PORTE = 0XFF; while(1) { if(i > 55000) { j = j % 16; if (j < 8) LED_ON = LED_ON << 0x1; else LED_ON = (LED_ON >> 0x1) 0b10000000; i = 0; j++; PORTB = LED_ON & 0b11110000; PORTD = (LED_ON & 0b00001100) << 0x2; PORTE = (LED_ON & 0b00000011) << 0x2; i++; 어셈블리어소스코드.include "m128def.inc" LED 의출력값. OFF 로초기화한다. i = 딜레이카운트를위한변수. j = LED 동작구분을위한변수. PortB 의 7~4 를출력으로사용하도록한다. PortD 의 5~4 를출력으로사용하도록한다. PortE 의 3~2 를출력으로사용하도록한다. PortB 를초기화한다. PortD 를초기화한다. PortE 를초기화한다. 프로그램종료없이계속반복실행한다. i 가증가하여시간이지연되면다음코드실행 j 를 0~15 사이의값으로고정 j 가 0~7 사이의값이라면 LED 를하나씩켠다. ( 왼쪽시프트시최하위는 0 으로채워지기때문 ) j 가 8~15 사이의값이라면 LED 를하나씩끈다. 이전값을오른쪽시프트로밀어내고최상위비트를 1 로채운다. 그후, 카운터를초기화하고켜지거나꺼진횟수 (j) 를증가시킨다. 각포트에맞는값을뽑아내출력한다. PortD 와 E 는출력할핀이출력값보다 2 자리앞에존재하기때문에왼쪽으로두번시프트한다. 그후, 딜레이계산을위해 i 를증가시킨다..def AH=R17.def AL=R16.def CNTA=R20.def CNTB=R19.def CNTC=R18.def CNTH=R21.def LED_ON=R22.def ON_OFF=R23.cseg.org 0x000 LDI AH, high(ramend) LDI AL, low(ramend) R17 레지스터를 AH 로매핑한다. R16 레지스터를 AL 로매핑한다. 딜레이카운트 (2~0 중 2) 를위한레지스터. 딜레이카운트 (2~0 중 1) 를위한레지스터. 딜레이카운트 (2~0 중 0) 를위한레지스터. 딜레이카운트의비교값을저장하기위한레지스터. LED 출력값을저장하기위한레지스터. 현재동작을구분하기위한레지스터 (1: 켜기, 0: 끄기 ) 프로그램의시작점프로그램메모리의 0x0 번지에서부터코드를시작한다. 현재프로그램의스택을설정한다. OUT SPH, AH OUT SPL, AL LDI AL, 0B11110000 LED 와연결된각포트의출력위치를설정한다.

OUT DDRB, AL LDI AL, 0B00110000 OUT DDRD, AL LDI AL, 0B00001100 OUT DDRE, AL LOOP: LDI CNTH, 0X07 LDI AH, 0X1 LDI LED_ON, 0XFF MOV ON_OFF, AH ADD CNTC, AH ADD CNTB, AH INC CNTA CP CNTA, CNTH BRNE LOOP CP ON_OFF, AH BRNE LEDOFF 딜레이카운터를초기화한다. 딜레이는 255 * 255 * 3, 즉 3 비트가필요하기때문에세개의레지스터를사용한다. 카운터의비교값을설정한다. (0X07 = 7) 이후 AH 는 1 증가 ADD 연산의피연산자로이용된다. LED 의초기출력값을 OFF 로설정한다. 회로의초기동작을 LED 켜기로설정한다. 반복문을위한레이블딜레이카운터를증가시킨다. 레지스터의최대값 (255) 를넘을경우캐리가발생하기때문에 LOOP 로돌아가지않고다음코드를실행하여다음레지스터를증가시킨다. 마찬가지로두번째레지스터도캐리가발생할경우카운터의최상위값을저장한레지스터를증가시키고, 그값이 CNTH 와같을때까지반복 ( 현재설정은 3 회 ) 한다. CNTA 와 CNTH 가같을경우다음코드를실행한다. 현재동작이 ON 인지 OFF 인지에따라해당동작을처리하는코드로분기한다. LEDON: MOV ON_OFF, AH LSL LED_ON BRCS LEDCTR DEC ON_OFF LEDOFF: LSR LED_ON ORI LED_ON, 0B10000000 BRCS LEDON LEDCTR: MOV AL, LED_ON ANDI AL, 0B11110000 OUT PORTB, LED_ON MOV AL, LED_ON LSL AL LSL AL MOV R24, AL ANDI R24, 0B00110000 OUT PORTD, R24 ANDI AL, 0B00001100 OUT PORTE, AL JMP LOOP LED 를하나씩켜는코드현재동작을 ON 으로설정한다. LED 출력값을왼쪽으로시프트한다. 꺼진상태에서는시프트시 1 이캐리로옮겨지지만모두켜지면최상위가 0 이므로캐리가발생하지않는다. LED 가모두다켜진게아니라면해당값을출력하는코드로분기한다. 모두켜졌을시동작을 OFF(0) 으로설정한다. LED 를하나씩끄는코드 LED 출력값을오른쪽으로시프트한다. 최상위비트를 1 로채운다. (LED 를끈다 ) 켜진상태에서는오른쪽시프트시 0 이캐리로옮겨지지만모두꺼지면최하위가 1 이므로캐리가발생한다. LED 가모두꺼졌다면다시 LED 를켜는코드로분기한다. LED 출력을처리하는코드카운터를초기화한다. 출력값을임시로 AL 에복사한다. 해당포트에출력할값만을선택한다. 해당포트에출력한다. PortD 와 E 는각각출력할포트와출력값이두자리만큼차이나기때문에왼쪽으로두번시프트한다. AL 을유지하기위해임시로 24 번레지스터에복사한뒤출력을처리한다. LOOP 로돌아가반복실행한다. 실험후느낀점 - 이번학기엔 ToastProg를사용해 AVR에프로그램을다운로드하는것으로알았지만, ToastProg와 ISP케이블의호환문제인지제대로동작하지않아한참헤메게되었다. 하지만예비조사과정에서알게된 AVRStudio에도다운로드프로그램이내장되어있다는걸기억해내고, 무사히실험을진행할수있어다행이었다. 또한예비리포트의중요성을깨닳게되었다. - LED를조작하는단순한동작을위해, 실험킷과 AVR의회로도를뒤져가며핀매핑과점퍼세팅, LED연결정보등찾아보는과정에서, 킷의전체회로가아니라킷내의각소자들의연결점만나와있어약간의어려움을겪었다. 하지만이번실험으로조금익숙해져다음실험에서는크게문제되지않을것이다.