<BDC7C7E83220B0E1B0FABAB8B0EDBCAD202833C1D6C2F7292E687770>

Similar documents
<BDC7C7E83120B0E1B0FABAB8B0EDBCAD202832C1D6C2F7292E687770>

<BDC7C7E83320BFB9BAF1BAB8B0EDBCAD2E687770>

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

<BDC7C7E83520BFB9BAF1BAB8B0EDBCAD2E687770>

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

11장 포인터

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

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

Microsoft PowerPoint - chap06-2pointer.ppt

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

<BDC7C7E83120BFB9BAF1BAB8B0EDBCAD2E687770>

Microsoft PowerPoint - ch07 - 포인터 pm0415

목차 포인터의개요 배열과포인터 포인터의구조 실무응용예제 C 2

ATmega128

슬라이드 1

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

8장 조합논리 회로의 응용

[ 마이크로프로세서 1] 2 주차 3 차시. 포인터와구조체 2 주차 3 차시포인터와구조체 학습목표 1. C 언어에서가장어려운포인터와구조체를설명할수있다. 2. Call By Value 와 Call By Reference 를구분할수있다. 학습내용 1 : 함수 (Functi

Microsoft PowerPoint - chap05-제어문.pptx

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

Microsoft PowerPoint - 제11장 포인터

PowerPoint Presentation

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

API 매뉴얼

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

ch15

쉽게 풀어쓴 C 프로그래밍

OCW_C언어 기초

< E20C6DFBFFEBEEE20C0DBBCBAC0BB20C0A7C7D12043BEF0BEEE20492E707074>

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

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

K&R2 Reference Manual 번역본

<BDC7C7E83820BFB9BAF1BAB8B0EDBCAD2E687770>

<322EBCF8C8AF28BFACBDC0B9AEC1A6292E687770>

Microsoft PowerPoint - C++ 5 .pptx

제 14 장포인터활용 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

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

쉽게 풀어쓴 C 프로그래밍

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

Microsoft PowerPoint - chap-03.pptx

<4D F736F F F696E74202D20C1A635C0E520BCF6BDC4B0FABFACBBEAC0DA>

<4D F736F F F696E74202D20C1A63134C0E520C6F7C0CEC5CD5FC8B0BFEB>

Microsoft PowerPoint - Lesson2.pptx

Microsoft PowerPoint - hy2-12.pptx

Microsoft PowerPoint - es-arduino-lecture-03

설계란 무엇인가?

쉽게 풀어쓴 C 프로그래밍

Computer Architecture

BMP 파일 처리

Microsoft PowerPoint - 1-2장 디지털_데이터 .ppt

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap-05.pptx

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202834C1D6C2F7207E2038C1D6C2F729>

C 프로그래밊 개요

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

제 11 장포인터 유준범 (JUNBEOM YOO) Ver 본강의자료는생능출판사의 PPT 강의자료 를기반으로제작되었습니다.

슬라이드 1

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A638C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

untitled

<4D F736F F F696E74202D20C1A633C0E52043C7C1B7CEB1D7B7A5B1B8BCBABFE4BCD2>

설계란 무엇인가?

PowerPoint 프레젠테이션

Microsoft PowerPoint - chap04-연산자.pptx

Microsoft PowerPoint - [2009] 02.pptx

금오공대 컴퓨터공학전공 강의자료

PowerPoint 프레젠테이션

KNK_C_05_Pointers_Arrays_structures_summary_v02

// 변수선언 unsigned char i; unsigned char FONT[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xD8, 0x80, 0x98}; //PORTA 를출력으로설정하고초기값은모두 0 PORTA = 0x00; DD

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

C 언어의구성요소인상수, 변수, 입 출력함수에 대하여학습

Data Structure

프로그램의실행화면 주석 (comment) 두수의합 : 300 /* 두개의숫자의합을계산하는프로그램 */ 주석은코드를설명하는글입니다. 주석 3 가지방법의주석 주석의예 /* 한줄로된주석 */ /* 저자 : 홍길동날짜 : 2013.

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

<4D F736F F F696E74202D20BBB7BBB7C7D15F FBEDFB0A3B1B3C0B05FC1A634C0CFC2F72E BC8A3C8AF20B8F0B5E55D>

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

<4D F736F F F696E74202D B3E22032C7D0B1E220C0A9B5B5BFECB0D4C0D3C7C1B7CEB1D7B7A1B9D620C1A638B0AD202D20C7C1B7B9C0D320BCD3B5B5C0C720C1B6C0FD>

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

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

Microsoft PowerPoint - Chapter_02.pptx

Microsoft PowerPoint - chap-11.pptx

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

chap 5: Trees

[8051] 강의자료.PDF

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 - C프로그래밍-chap03.ppt [호환 모드]

슬라이드 1

Microsoft PowerPoint - chap06-1Array.ppt

Microsoft Word - logic2005.doc

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

API 매뉴얼

PowerPoint 프레젠테이션

Microsoft PowerPoint - 강의자료8_Chap9 [호환 모드]

Microsoft PowerPoint - Chapter_04.pptx

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

Chapter 06. 스택(Stack)

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

쉽게 풀어쓴 C 프로그래밍

Lab 3. 실습문제 (Single linked list)_해답.hwp

Microsoft PowerPoint - 2주차-1차시 (강의자료) ch01 - C Programming 기초 (part 2)

PowerPoint 프레젠테이션

Transcription:

제목 : 실험 #2 결과보고서 외부 LED & Dip 스위치제어 실험일 : 2013. 03. 19. (3 주차 ) 실험내용 - 예비과제 : 메모리맵드 IO를통해 Dip 스위치의값을읽고, On 상태의스위치가하나이상있다면외부 LED를점멸하는프로그램 - 실험과제 : 메모리맵드 IO를통해 Dip 스위치의값을읽고, Dip 스위치의조작을통한사칙연산결과를 LED를통해출력하는프로그램. 연산자는 0~3까지를덧셈, 뺄셈, 곱셈, 나눗셈으로정한다. 음수결과는 LED의부호위치를켜고, 결과의절대값으로표시한다. 피연산자1 연산자 피연산자2 - Dip 스위치설정 - 연산자부호연산결과 ( 곱셈시부호까지확장 ) - LED 설정 1 ( 나눗셈이외의연산 ) - 연산자 몫 나머지 - LED 설정2 ( 나눗셈연산 ) - 실험결과 - 예비과제 - 해결방법 : 실험키트의 Dip 스위치의값이 On 일때 0, Off 일때 1로, 예시와는반대로동작하기때문에 Dip 스위치가하나라도 On인지확인하기위해모두 Off 상태인 0xFF(=0b11111111) 과비교하도록작성하였다. 이번실험에서조작할외부 LED 역시이전실험에서쓰인 LED와는반대로설계되어 0일때불이꺼지고, 1일때불이켜진다. - 결과 : Dip 스위치가하나이상 On일때, 0.5초주기로모든 LED 켜졌다가꺼지는동작을확인함. - 소스코드 C 언어소스코드 #include <avr/io.h> #include <avr/delay.h> #define LED_CS (*(volatile unsigned char *)0x4800) #define DIP_SW_CS (*(volatile unsigned char *)0x8000) 딜레이함수를사용하기위한헤더파일선언

int main(void){ MCUCR = 0x80 ; while(1){ if (DIP_SW_CS < 0xFF) { LED_CS = 0xFF; _delay_ms(500); LED_CS = 0x00; _delay_ms(500); else LED_CS = 0x00; 어셈블리어소스코드.include "m128def.inc".def AH = R16.def AL = R17.def CNT0 = R18.def CNT1 = R19.def CNT2 = R20.def LED_ON = R21.equ LED_CS = 0x4800.equ DIP_SW_CS = 0x8000.cseg.org 0x0000 LDI AH, HIGH(RAMEND) LDI AL, LOW(RAMEND) OUT SPH, AH OUT SPL, AL LDI AH, 0x80 OUT MCUCR, AH 외부메모리에접근하기위해 MCUCR 레지스터의 SRE 비트를 1 로설정한다. Dip 스위치가모두 Off 인상태가아니라면 LED 매핑주소에 0xFF 를내보내 LED 를모두켜도록한뒤 500ms 의지연시간을가진다. 그후 0x00 을내보내모든 LED 를끄도록하여점멸효과를구현한다. Dip 스위치가모두 Off 라면 LED 를모두끈다. R17 레지스터를 AH 로매핑한다. R16 레지스터를 AL 로매핑한다. 딜레이카운트 (2~0 중 2) 를위한레지스터. 딜레이카운트 (2~0 중 1) 를위한레지스터. 딜레이카운트 (2~0 중 0) 를위한레지스터. LED 출력값을저장하기위한레지스터. 프로그램의시작점프로그램메모리의 0x0 번지에서부터코드를시작한다. 현재프로그램의스택을설정한다. 외부메모리에접근하기위해 MCUCR 레지스터의 SRE 비트를 1 로설정한다. LOOP: BLINK: CLR CNT0 CLR CNT1 CLR CNT2 CLR LED_ON LDI AL, 0x01 LDS AH, DIP_SW_CS CPI AH, 0xFF BRNE BLINK EOR AH, AH STS LED_CS, AH RJMP LOOP ADD CNT0, AL BRCC LOOP ADD CNT1, AL BRCC LOOP ADD CNT2, AL CPI CNT2, 0x3 BRNE LOOP SER CNT2 EOR LED_ON, CNT2 STS LED_CS, LED_ON CLR CNT0 CLR CNT1 CLR CNT2 RJMP LOOP 딜레이카운터와 LED 값을초기화한다. 딜레이는 255 * 255 * 3, 즉 3 비트가필요하기때문에세개의레지스터를사용한다. 이후 AL 은 1 증가 ADD 연산의피연산자로이용된다. (INC 는 Carry 가발생하지않기때문에 ADD 사용 ) 반복문을위한레이블 Dip 스위치값을읽어온다. 모두 Off 인지확인후, 하나이상 On 이라면 BLINK 레이블로이동한다. 모두 Off 라면 LED 역시모두끄도록, LED 와매핑된주소에 0 을내보낸다. 반복문의처음으로돌아간다. LED 점멸을위한레이블딜레이카운터를증가시킨다. 레지스터의최대값 (255) 를넘을경우캐리가발생하기때문에 LOOP 로돌아가지않고다음코드를실행하여다음레지스터를증가시킨다. 마찬가지로두번째레지스터도캐리가발생할경우카운터의최상위값을저장한레지스터를증가시키고, 그값이 3 과같을때까지반복하며딜레이를발생시킨다. 카운트후필요없어진카운터레지스터를 LED 값반전을위해 0xFF 로만들고 XOR 연산을통해 LED 값을반전시킨다. LED 와매핑된주소에 LED 값을내보내점멸효과를구현한다. 딜레이카운터를초기화한다. LOOP 로돌아가반복실행한다.

- 실험과제 - 해결방법 : Dip 스위치에서읽어온값을비트연산을통해피연산자1, 2와연산자로분리한뒤, 연산자에따라각각의연산을수행뒤결과를저장하고, 최종적으로다시비트연산을통해 8비트공간에순서에맞도록배열한뒤 LED로출력하도록작성하였다. - 결과 : 각각의연산결과에따라설정한 LED 값이올바르게출력됨을확인하였다. < 4 + 6 = 10 > < 4 6 = -2 > < 6 * 4 = 24 > < 6 / 4 = 1...2 > - 소스코드 C 언어소스코드 #include <avr/io.h> #define LED_CS (*(volatile unsigned char *)0x4800) #define DIP_SW_CS (*(volatile unsigned char *)0x8000) int main() { unsigned char dipsw = 0x00; unsigned char A = 0, B = 0, OP = 0; char RST = 0; MCUCR = 0x80; while(1) { dipsw = DIP_SW_CS ^ 0xFF; A = dipsw >> 5; B = dipsw & 0x07; OP = (dipsw & 0b00011000) >> 3; switch (OP) { case 0x00: // + RST = A + B; case 0x01: // - RST = A B; Dip 스위치값을저장할변수피연산자들의값을저장할변수연산결과를저장할변수연산자, 부호, 나머지값을저장할변수외부메모리에접근하기위해 MCUCR 레지스터의 SRE 비트를 1 로설정한다. 실험킷은 On 일때 0 이입력되기때문에, 코드작성의편의를위해 Dip 스위치값을반전한다. 상위 3 비트를피연산자 1 에저장한다. 하위 3 비트를피연산자 2 에저장한다. 가운데 2 비트를연산자에저장한다. 연산자에따라 switch 하여해당연산을수행한다. 뺄셈결과가음수일경우

if (RST < 0) RST = (RST * -1) 0x20; case 0x02: // * RST = A * B; case 0x03: // / RST = (A / B) << 3 (A % B); LED_CS = (OP << 6) RST; 어셈블리어소스코드.include "m128def.inc".def AH = R16.def AL = R17.def OPR1 = R18.def OPR2 = R19.def OP = R20.equ LED_CS = 0x4800.equ DIP_SW_CS = 0x8000.cseg.org 0x0000 LDI AH, HIGH(RAMEND) LDI AL, LOW(RAMEND) OUT SPH, AH OUT SPL, AL LDI AH, 0x80 OUT MCUCR, AH GET_DIPSW: LDS AH, DIP_SW_CS SER AL EOR AH, AL MOV OPR1, AH SWAP OPR1 R1 ANDI OPR1, 0x07 MOV OPR2, AH ANDI OPR2, 0x07 MOV OP, AH ANDI OP, 0x03 CLR AH OP_SUM: CPI OP, 0x00 BRNE OP_SUB ADD OPR1, OPR2 OP_SUB: CPI OP, 0x01 BRNE OP_MUL SUB OPR1, OPR2 SBRS OPR1, 7 결과를양수로만들고부호를 1 로설정한다. 나눗셈시, 몫의값을 3 비트올려몫의저장위치로옮기고, 하위에나머지값을넣어준다. 연산자를최상위로옮기고, 연산결과를더해 LED 에출력한다. R17 레지스터를 AH 로매핑한다. R16 레지스터를 AL 로매핑한다. 피연산자 1 을저장하기위한레지스터피연산자 2 를저장하기위한레지스터연산자를저장하기위한레지스터 프로그램의시작점프로그램메모리의 0x0 번지에서부터코드를시작한다. 현재프로그램의스택을설정한다. 외부메모리에접근하기위해 MCUCR 레지스터의 SRE 비트를 1 로설정한다. 반복동작을위한레이블. Dip 스위치값을읽어오는루틴 Dip 스위치의값을읽어온다. XOR 연산을통한값반전을위해 AL 을 0xFF 로설정한다. 실험킷은 On 일때 0 이입력되기때문에, 코드작성의편의를위해 Dip 스위치값을반전한다. 쉬프트횟수를줄이기위해상하위니블을교환한다. 나머지 1 비트를쉬프트하여위치를맞춘다. 레지스터에피연산자 1 의값만을남긴다. 하위 3 비트를피연산자 2 에저장한다. 가운데 2 비트를연산자로사용하기위해오른쪽으로 3 비트쉬프트하여값의위치를맞춘다. 레지스터에연산자값만을남긴다. 연산에사용하기위해 AH 를 0 으로초기화한다. 덧셈연산을위한레이블 현재수행할연산이덧셈이아니라면뺄셈연산으로이동 덧셈연산수행 뺄셈연산을위한레이블 현재수행할연산이뺄셈이아니라면곱셈연산으로이동 뺄셈연산수행결과가음수가아닐경우바로

SER AH EOR OPR1, AH INC OPR1 ORI OPR1, 0x20 OP_MUL: CPI OP, 0x02 BRNE OP_DIV OP_DIV: MUL OPR1, OPR2 MOV OPR1, R0 CP OPR1, OPR2 BRLO SET_LED_DIV SUB OPR1, OPR2 INC AH RJMP OP_DIV SET_LED_DIV: SWAP AH LSR AH OR OPR1, AH SET_LED: SWAP OP LSL OP LSL OP OR OPR1, OP STS LED_CS, OPR1 RJMP GET_DIPSW 결과가음수일경우 2 의보수연산을위해 AH 를 0xFF 로설정연산결과를반전반전한값에 1 을더해양수값얻음부호출력위치에 1 을설정해음수결과임을표시 곱셈연산을위한레이블 현재수행할연산이곱셈이아니라면나눗셈연산으로이동 곱셈연산수행곱셈결과는 (R1:R0) 에저장되기때문에 OPR1 로결과값복사. 나눗셈연산을위한레이블. 나눗셈명령이없어서직접구현피연산자 2 가피연산자 1 보다커서뺄수없다면 (= 나눌수없다면 ) 출력값을만들기위해 SET_LED_DIV 로이동피연산자 1 이크다면피연산자 2 를빼고몫 (AH 에저장 ) 을증가시킨다. 나눌수없을때까지반복 나눗셈결과값을만들기위한레이블 5~3 비트에몫의자리를맞추기위해, 또쉬프트횟수를줄이기위해니블교환후나머지 1 비트를오른쪽으로쉬프트. 하위에나머지값을추가하여결과값완성. LED 출력을위한레이블연산자를최상위자리로맞출때, 쉬프트횟수를줄이기위해니블교환후나머지 2 비트를왼쪽으로쉬프트. 출력할결과값에연산자값추가 최종적으로완성된출력값을 LED 에출력 Dip 스위치를읽는루틴으로돌아가전체반복실행 실험후느낀점 - Dip 스위치등의동작이디지털시스템, 임베디드시스템실험에서썼던장비들과는반대로동작하도록회로가구성되어있어초반에약간의혼동을겪었다. 회로도를자세히봤더라면진작에알수있었을텐데하고후회되었지만실험을무사히완수할수있어다행이다. - 실험과제코드작성중, 계산결과를저장하는변수를습관적으로 unsigned로선언해음수결과가되는뺄셈연산에서잘못된결과를출력하였다. 다행히오류를수정하였지만, 앞으로는조심해야하겠다. - 다른조원이도움을요청해그조의코드를살펴봤는데언뜻별다른이상이없는듯보였다. 하지만출력만을위한 LED_CS에서값을읽어 OR연산을수행하도록되어있는것을알아채고해당코드를수정하니역시정상적인결과를보였다. 포트매핑과는달리메모리매핑을통한 IO에서는입출력방향이잘와닫지않는듯하다. 조심해야할부분이다.