1초 마다 LED와 오실로스코프에 결과 반영
프로그램
#include <mega128.h>
volatile unsigned char count = 0 , interrupt_count = 0;
void initialize_timer();
interrupt [TIM0_OVF] void timer0_ovf(void)
{
interrupt_count--;
if(!interrupt_count){
interrupt_count = 100;
count ++;
if(count>9)
count = 0;
PORTD = (count << 4);
}
}
void main(void)
{
initialize_timer();
interrupt_count=100;
DDRD = 0xf0;
while(1);
}
void initialize_timer(void)
{
TCNT0 = 0x70;
TCCR0 = 0x07;
TIMSK = 0x01;
#asm("sei");
타이머카운터에대한 소스인데 책보고 대충짯는데 설명을 할수가 없네요 ㅠㅠ
전체적으로 보면 인터럽트 발생할때마다 프로그램 구조를 보면 대충 10ms 마다 인터럽트가 발생 하겠군요.
10ms x 100 니까 1000ms = 1초 겠죠
그때마다 portd 로 현재의 count 값을 출력 한다.......그렇게 설명하면 되겠습니다.
타이머 관련해서는 첨부된 문서를 참조하세요......
#include <mega128.h>
volatile unsigned char count = 0 , interrupt_count = 0; <== 외부메모리 Mapped I/O도 아닌데 굳이 volatile을 쓸 필요는...없다봅니다.
void initialize_timer(); <=== 함수원형 선언인데 main 함수보다 아래에 있어서 미리 선언 하는 겁니다. main() 위에 있다면 할필요 없습니다.
interrupt [TIM0_OVF] void timer0_ovf(void) <== Timer 0 에 대한 인터럽트 서비스 루틴 함수 지시어 입니다.
{
interrupt_count--; <== 인터럽트 발생할 때마다 -1 하라는 뜻이죠...
if(!interrupt_count){ <=== 0이라면....
interrupt_count = 100; <=== 다시 이 변수를 100으로 초기화 하라는 뜻이겠죠...
count ++; <=== 얘는 interrupt_count <-- 가 100->0 으로 될때마다 +1 이 되네요..
if(count>9) <=== 마찬가지로 9보다 크다면...그러니까 10이 되겠네요..
count = 0; <=== 다시 0으로 초기화 하네요...
PORTD = (count << 4); <==== 10보다 작다면 PORTD 에 count <<4 좌로 쉬프트한값 그러니까. count x 16 한값을 출력하네요.. (여기서는 아래에 PortD 의 상위만 출력으로 정해놔서 그런가 봅니다)
}
}
void main(void)
{
initialize_timer(); <== 타이머 초기화 함수 콜....
interrupt_count=100; <=== 얘를 100으로 초기화 하네요..
DDRD = 0xf0; <== PORTD 의 상위 니블(7:4)을 출력으로 설정 하네요..
while(1); <== 무한루프로 빠지네요... 타이머 인터럽트가 있으니 상관없습니다.
}
void initialize_timer(void) <== 타이머 초기화 함수네요...
{
TCNT0 = 0x70; <== 카운터 초기값을 0x70으로 만드네요.....
TCCR0 = 0x07; <== Clock Select 인데요 데이타 쉬트를 보면 External Clock source on T0 pin, Clock on rising edge 라네요...
간단히 말하면 외부 클록 소스를 사용하고 Rising Edge에서 검출하네요 (그리고 다른것들은 기본값이니까 Overflow 되면 인터럽트 발생합니다)
TIMSK = 0x01; <== 인터럽트 플래그 Enable 시키네요..
#asm("sei"); <== 인터럽트 활성화