[PIC12F EVM] TIMER0 테스트
TIMER0의 기본 구조는 아래와 같이 입력 클럭을 4분주 하고 2클럭 마다 TMR0를 증가 시킨다.
만약 간단히 대략 1ms를 만들려 다음과 같이 계산할 수 있다.
8Mhz 입력 클럭일 경우 8분주 했을때 타이머 오버플로우 인터럽트 시간은 8Mhz/4/8 = 4us => 256클럭마다 한번씩 오버플로 발생하므로 1.024ms 이다.
TIMER0초기화
OPTION레지스터
타이머 인터럽트 함수
인터럽트가 발생하면 interrupt preprocess로 정의 한 함수가 수행되고 이 함수 내에서 원하는 플래그를 체크하여 처리 하면 된다. 이런 구조는 AVR(Tinty13)과 비교하면 성능상 문제는 있을것 같다.
TIMER0의 기본 구조는 아래와 같이 입력 클럭을 4분주 하고 2클럭 마다 TMR0를 증가 시킨다.
만약 간단히 대략 1ms를 만들려 다음과 같이 계산할 수 있다.
8Mhz 입력 클럭일 경우 8분주 했을때 타이머 오버플로우 인터럽트 시간은 8Mhz/4/8 = 4us => 256클럭마다 한번씩 오버플로 발생하므로 1.024ms 이다.
TIMER0초기화
OPTION레지스터
void InitTimer0(void)
{
OPTION = 0;
OPTION |= BIT1; //prescaler - 1/8
T0CS = 0; // Timer increments on instruction clock
T0IE = 1; // Enable interrupt on TMR0 overflow
GIE = 1; // Global interrupt enable
}
{
OPTION = 0;
OPTION |= BIT1; //prescaler - 1/8
T0CS = 0; // Timer increments on instruction clock
T0IE = 1; // Enable interrupt on TMR0 overflow
GIE = 1; // Global interrupt enable
}
타이머 인터럽트 함수
인터럽트가 발생하면 interrupt preprocess로 정의 한 함수가 수행되고 이 함수 내에서 원하는 플래그를 체크하여 처리 하면 된다. 이런 구조는 AVR(Tinty13)과 비교하면 성능상 문제는 있을것 같다.
void interrupt timer1_isr(void)
{
if(T0IF)
{
//1ms
//Led1Toggle();
gTimerTick1_ms++;
T0IF = 0;
}
}
{
if(T0IF)
{
//1ms
//Led1Toggle();
gTimerTick1_ms++;
T0IF = 0;
}
}
PIC12F683 Timer Interrupt 예제
타이머 인터럽트를 이용하여 1초 마다 LED점등하는 예제
void main(void)
{
//시스템 초기화
SystemInit();
//LED초기화
Led1Init();
//Timer0 초기화
InitTimer0();
while(1)
{
//Led1Toggle();
if(gTimerTick1_ms>1000)
{
gTimerTick1_ms = 0;
//Led1Toggle();
}
}
}
{
//시스템 초기화
SystemInit();
//LED초기화
Led1Init();
//Timer0 초기화
InitTimer0();
while(1)
{
//Led1Toggle();
if(gTimerTick1_ms>1000)
{
gTimerTick1_ms = 0;
//Led1Toggle();
}
}
}
반응형