DK-128 실습 타이머카운터 사용법 아이티즌 기술연구소 2009.12.08
DK-128 메인보드 – 연산, 제어 확장보드 - 입출력 Serial port Parallel port FND LED high low FND low high LED low high EEPROM & Sensor ATmega 4K EEPROM Tact Switch EEPROM Power 1:TWI clock, 2:TWI data, 상위5~8:Infrared sensor
DK-128의 결선 8 line j19 red - j15 + black j18 j16 - + 8 line 1 1 2 61 1 25 j16 54 - + 35 42 8 line
LED OUT ATMEGA128 ADC=아날로그신호입력 Port A : I/O, 상위어드레스(ALE의한제어) 아날로그전원 프로그램 쓰기 LED OUT 전원 Port E : I/O, 외부인터럽트, ISP 프로그래밍 데이터/주소 모드 ATMEGA128 전원 Port B : I/O, 타이머, 카운터, PWM, SPI 외부데이터메모리 접근 모드 Oscillator Port D : I/O, TWI, UART직렬통신 Real time clock시 Oscillator
사용 헤더파일 및 환경 설정 값 Avr/io.h Avr/signal.h Avr/interrupt.h CPU clock= 16,000,000 Hz Ticks per sec = 1,000 Prescaler = 64 // 클럭의 배수 – 크기,오버헤드 SIGNAL(SIG_OVERFLOW0) : timer0의 오버플로우함수
1. TCCR0 (T/C Control Register) Prescaler(배수) 설정: 64 (계산식 편하게) 16MHz의 모든 클럭을 세기에는 데이터크기와 성능의 문제가 있어 배수를 이용. 비트 7 6 5 4 3 2 1 FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00 모드 W R/W 초기값 CS02 CS01 CS00 Prescaler 값 타이머/카운터 정지 1 Prescaler 사용하지 않음 8 32 64 128 256 1024
2. TCNT0 (Timer Counter Register) 하드웨어에 의해서 증가되는 레지스터 사용자는 초기화 시킬 때만 사용 OCR0 레지스터와 비교 인터럽트 할 경우 자동 초기화 비트 7 6 5 4 3 2 1 TCNT0[7:0] 모드 R/W 초기값 TCNT0 = 256 – (CPU_CLOCK/ TICKS_PER_SEC/ PRESCALER) 1초 1000번 배수 TCNT0 = 6 CPU_CLOCK = 16,000,000 TICKS_PER_SEC = 1,000 PRESCALER = 64 - TCNT0 레지스터는 1byte 크기 타이머카운터는 6부터 시작해 256이 되면 오버플로우가 발생하고 6으로 초기화 1/1000초(250회)마다 1회씩 오버플로우 발생
3. TIMSK (Interrupt Mask Register) 주기적인 인터럽트 처리 OCIE0: 매치 인터럽트 활성화 (0B00000010) TOIE0: 오버플로우 인터럽트 활성화 (0B00000001) 상태레지스터(SREG)의 I비트 1 설정 sei(); 비트 7 6 5 4 3 2 1 OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0 모드 R/W 초기값
1초마다 LED 깜빡이는 프로그램 구현 시작 1초대기 시작 1 클럭 경과 시간변수 = 0 LED 초기화 64클럭 경과? 참 64클럭 경과? 거짓 TCCR0 설정 시간변수 < 1초 TCNT0 초기화 참 호출 거짓 TIMSK 설정 TCNT0 1 증가 1초대기 종료 시간변수 인터럽트활성화 거짓 TCNT0 Overflow? 오버플로우신호 복귀 LED 반전 참 시간변수 1증가 1초 대기 호출 SIG_OVERFLOW0 발생 무한 TCNT0 초기화 종료 신호처리종료 사용자 프로그램 흐름 시스템 흐름
실습 예제 1/3
실습 예제 2/3
실습 예제 3/3 앞에 선언한 함수를 구현하기 1초 마다 LED를 토글시키는 프로그램