키입력프로그램, 시간지연루틴, 레지스터의 비트처리
본 자료는 3페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
해당 자료는 3페이지 까지만 미리보기를 제공합니다.
3페이지 이후부터 다운로드 후 확인할 수 있습니다.

본문내용

아주 중요한 의미가 있다. 메인 루틴과 인터럽트 서비스 루틴에서 시간지연 서브루틴을 중복하여 사용하더라도 아무문제가 없도록 해주기 때문이다.
3)레지스터의 비트처리
AVR 마이크로 컨트롤러는 일부명령에서 비트 단위의 처리 기능을 가지고 있지만 이것도 확장 I/O 레지스터에는 적용되지 않고, I/O 레지스터에서 read-modify-write기능을 수행하는 명령이 없으므로 원활하게 비트 단위의 처리를 수행하기는 어렵다. 이 때문에 AVR에서는 비트 단위의 처리를 수행하기 위한 여러 가지 프로그램 테크닉이 필요하다.
(1)어셈블리 언어의 경우
어셈블리 언어에서 비트 단위로 처리가 가능한 명령에는 몇가지가 있으나 비트 값에 따른 스킵 명령과 CBI/SBI 명령을 제외하고는 그다지 자주 사용되지 않는다. 범용 레지스터나 I/O레지스터 또는 확장 I/O 레지스터에서 read-modify-write 기능을 사용할 수 없다는 것도 불편한 점이다.
프로그램에서 많이 사용되는 일은 어떤 레지스터의 특정 비트를 세트 또는 리셋하는 일인데, AVR의 어셈블리 언어에서 이는 CBI/SBI 명령을 사용하면 된다. 단, 이 명령들은 I/O 레지스터에 대해서만 사용할 수 있으며, 확장 I/O 레지스터나 그 밖의 레지스터는 사용 할 수 없고 상태 레지스터에 대하여는 BCLR/BSET 명령이 따로 있다.
CBI PORTB, 4
SBI PORTB, 7
그러나, 프로그래머가 각 I/O 레지스터의 비트 번호를 기억하기 어려울 때는 다음과 같이 비트 번호를 상수로 정의 하면 편리하다.
.equ LED1 = 4
.equ LED2 = 5
.equ LED3 = 6
.equ LED4 = 7
CBI PORTB, LED1
SBI PORTB, LED4
대부분의 I/O 레지스터에서는 각 비트마다 고유한 역할을 가지고 있는데, 매크로 어셈블러에서는 사용자가 이렇게 I/O 레지스터의 각 비트를 편리하게 사용할 수 있도록 비트 번호를 일일이 기억하기 좋은 이름으로 정의해 놓은 인클루드 파일을 제공하고 있다. 따라서, 아래의 2명령은 서로 같은 의미가 된다.
SBI MCUCR, 7
SBI MCUCR, SRE
프로그램에서 또한 많이 사용하는 일은 어떤 I/O 레지스터의 값을 설정하는 일인데 이것도 위와 같은 비트 번호의 정의를 이용하면 편리하다. 즉,
LDI AL, 0b01000100
STS XMCRA, AL
으로 처리할 것을
LDI AL,(1< STS XMCRA, AL
와 같이 처리해도 같은 의미가 된다.
(a)순서도(기술로 대체)
①MCU를 초기화 한다.
②PORTB에 6번이나 4번을 1bit씩 왼쪽으로 이동시킨 후 저장한다.
③1,3번 LED가 점등된다.
④시간 지연이 된다.
⑤PORTB에 7번이나 5번을 1bit씩 왼쪽으로 이동시킨 후 저장한다.
⑥2,4번 LED가 점등된다.
⑦시간 지연이 된다.
⑧반복한다.
(b)기본적인 레지스터의 비트처리 프로그램예제
;[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
;[] []
;[]Exp02_4.asm : Bit Access []
;[] []
;[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]
;
;Designed and programmed by Duck-Yong Yoon in 2005.
;
;------------------------------------------------
;Include Header File
;------------------------------------------------
.include "MEGA128.INC"; include ATmega128 definition file
.include "OK128DEF.INC"; include OK-128 I/O definition file
;------------------------------------------------
;Initialize MCU
;------------------------------------------------
.cseg
.org0x0000
LDIAH,high(RAMEND)high(RAMEND)를 AH로 저장한다.
LDIAL,low(RAMEND) low(RAMEND)를 AL로 저장한다.
OUTSPH,AH AH값을 SPH로 out한다.(I/O)
OUTSPL,AL AL값을 SPL로 out한다.(I/O)
;------------------------------------------------
;Blink LED1/3 and LED2/4
;------------------------------------------------
LDIAL,0xFF0xFF를 AL로 저장한다.; initialize PORTB = output
OUTDDRB,AL AL을 DDRB로 저장한다.(I/O)
LOOP:CBIPORTB,PB7PORTB,PB7의 bit를 ‘0’으로 clear한다. ; LED1,3 on
CBIPORTB,PB5PORTB,PB5의 bit를 ‘0’으로 clear한다.
SBIPORTB,PB6PORTB,PB6의 bit를 ‘1’로 set한다.
SBIPORTB,PB4 PORTB,PB4의 bit를 ‘1’로 set한다.
CALLD500MS 현재 PC를 스택에 저장해 두고 D500MS로 간다.
LDIAL,(1< PB7나 PB5의 주소를 1bit 왼쪽으로 이동시키고 AL에 저장한다.
OUTPORTB,AL AL주소를 PORTB로 저장한다.
CALLD500MS 현재 PC를 스택에 저장해 두고 D500MS로 간다.
JMPLOOP LOOP label로 간다.
;------------------------------------------------
;Include User Subroutine File
;------------------------------------------------
.include "OK128SUB.INC"; include OK-128 subroutine file
  • 가격1,500
  • 페이지수10페이지
  • 등록일2009.02.23
  • 저작시기2008.10
  • 파일형식한글(hwp)
  • 자료번호#520057
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니