타이머/카운터 및 인터럽트
본 자료는 8페이지 의 미리보기를 제공합니다. 이미지를 클릭하여 주세요.
닫기
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
해당 자료는 8페이지 까지만 미리보기를 제공합니다.
8페이지 이후부터 다운로드 후 확인할 수 있습니다.

본문내용

C mode(4), don't output OC1A
OUT TCCR1A,AL ; AL 값을 I/0 레지스터 TCCR1A에 저장한다. TCCR1A 레지스터는 타이머 카운터 1/3의 동작모드를 설정하고 출력 비교 단자의 파형 발생에 관한 동작을 지정하는 기능을 수행하게 된다.
LDI AL,0b00001100 ; interrupt = 16MHz/256/(1+624) = 100Hz
OUT TCCR1B,AL ; AL 값을 I/0 레지스터 TCCR1B에 저장한다. TCCR1B 레지스터는 타이머 카운터 1/3의 동작모드를 설정하고 출력 비교 단자의 파형 발생에 관한 동작을 지정하는 기능을 수행하게 된다.
LDI AL,0b00000000
STS TCCR1C,AL ; AL 값을 I/0 레지스터 TCCR1C에 저장한다. TCCR1C 레지스터는 타이머 카운터 1/3의 동작모드를 설정하고 출력 비교 단자의 파형 발생에 관한 동작을 지정하는 기능을 수행하게 된다.
LDI AL,high(624)
OUT OCR1AH,AL
LDI AL,low(624)
OUT OCR1AL,AL ; 각 AH, AL 값을 OCR1AH,AL에 저장하는 과정인데, 이 레지스터 는 TCNTn 값과 비교하여 OCnx 단자에 출력신호를 발생하기 위한 16비트 값을 저장하는 레지스터이다.
LDI AL,0x00 ; clear Timer/Counter1
OUT TCNT1H,AL .
OUT TCNT1L,AL ; 위에서도 언급했듯이 OCnx 단자에 출력시키기 위해 비교의 대상이 된다. 즉, 이 과정을 통해서 타이머/카운터 1이 클리어 된다
LDI AL,0b00010000 ; enable Timer/Counter1 OC1A interrupt
OUT TIMSK,AL ; TIMSK 레지스터에 지정된 AL값을 입력. 이 레지스터는 타이머/ 카운터1이 발생하는 인터럽트를 개별적으로 허용하는 기능을 수행 한다. 우리는 여기서 AL의 5번째 비트 값이 1임에 주목하는데, 이 비트는 OCIE1A 레지스터로 이것이 1로 설정되고 상태 레지스터 SREG I비트가 1이 되면, 타이머/카운터 1의 출력비교 인터럽트 A 가 허용 상태로 됨을 의미한다.
LDI AL,0b00000000
STS ETIMSK,AL ; ETIMSK가 모두 0의 값으로 입력. 이 레지스터는 발생하는 인터 럽트를 개별적으로 허용하는 기능을 수행한다.
LDI AL,0b00000000 ; clear all interrupt flags
OUT TIFR,AL ; TIER이 모두 0의 값으로 된다. 이 것은 발생하는 인터럽트 플랙 을 저장하는 레지스터인데, 지금은 모두 0으로 되어 모든 것이 클 리어 되어있는 상태가 된다.
LDI AL,0b00000000
STS ETIFR,AL ; 타이머/카운터1,3이 발생하는 인터럽트 플랙을 저장한다.
RET
;====================================================================
;Interrupt Service Routine of OC1A
;====================================================================
TIMER1_COMPA:
PUSH AL ; AL에는 최근에 ETIFR에 넣기 위해 설정한 0x00이 있다.
이 값을 스택에 저장.
IN AL,SREG ; AL에 SREG를 저장한다.
PUSH AL ; 이것을 다시 스택에 저장한다.
ADIW R26,1 ; R26(1/100초)를 1씩 증가 시킨다
CPI R27,high(6000); second = 60 ?
; R27와 high(6000)를 비교한다.
BRNE TIMER1_RET
CPI R26,low(6000)
BRNE TIMER1_RET
CLRR27; if yes, second = 0
CLRR26
INCR28; and increment minute
CPIR28,60; minute = 60 ?
BRNETIMER1_RET
CLRR28; if yes, minute = 0
INCR29; and increment hour
CPIR29,100; hour = 100 ?
BRNETIMER1_RET
CLRR29; if yes, hour = 0
; 즉, R27과 high(6000), R26과 low(6000)을 비교해서 같으면, min 레지스터가 60이면 분이 0이 되고, 시간이 1 증가한다. 또한 시간이 100이면 시간이 0이 되고 TIMER1_RET로 가게 된다. 그 이외의 경우에도 TIMER1_RET가 된다.
TIMER1_RET:
CALLDSP_TIME; display time
POP AL ; restore registers
OUT SREG,AL
POP AL ; DSP_TIME을 CALL하고, 시간을 다 출력하고 AL값을 POP로
꺼내서 SREG를 복구시키고, 다시 AL을 꺼낸다.
RETI ; 인터럽트 신호가 떨어진 다음으로 가게 된다.
;====================================================================
;Include User Subroutine File
;====================================================================
.include "OK128SUB.INC"; include OK-128 subroutine file
☞ 이 예제에서는 전체 프로그램의 구조를 파악하는 것이 중요하다. 메인 프로그램에서는 키입력을 검출하여 그에 따른 동작을 지시하는 것만을 수행하며, 스톱워치의 동작은 모두 인터럽드 서비스 루틴에서 처리 된다. 이 때문에 스톱워치를 LCD 모듈에 표시하는 루틴은 상당히 긴데도 구하고 인터럽트 서비스 루틴내에서 처리하였다.
LCD 모듈에 시간을 표시할 때 2자리의 10진수를 표시하는 서브루틴 LCD_2DIGIT응 만들어 사용하였다. 여기서는 10자리가 0이더라도 이를 공백(space) 문자로 처리하지 않고 0으로 표하는 것이 좋은데 인클루드 파일 OK128SUB.INC에 포함되어 있는 서브루틴 LCD_2DEC는 그렇지 않으므로 이와 같이 별도로 서브루틴을 만들어 사용하였다.

키워드

  • 가격3,500
  • 페이지수24페이지
  • 등록일2009.02.23
  • 저작시기2008.9
  • 파일형식한글(hwp)
  • 자료번호#520059
본 자료는 최근 2주간 다운받은 회원이 없습니다.
청소해
다운로드 장바구니