**
** 8Bit_Timer0.h
**
** Version : 1.0
** Target : ATmega128
** Created : 2010.01.15
** Author : Chang-Su Lee (ELCO Kookmin Univ.)
** Reference : Datasheet
**
****************************************************/
#ifndef __8BIT_TIMER0_H__
#define __8BIT_TIMER0_H__
void Timer0_Normal_Init();
void Timer0_Normal_Control(unsigned char flag);
void Timer0_CTC_Init();
void Timer0_CTC_Control(unsigned char flag);
void Timer0_CTC_SetTimer(unsigned char Top);
void Timer0_PC_PWM_Init();
void Timer0_PC_PWM_SetDuty(unsigned char Duty);
void Timer0_Fast_PWM_Init();
void Timer0_Fast_PWM_SetDuty(unsigned char Duty);
#endif
/******************************************************
**
** 8Bit_Timer0.c
**
** Version : 1.0
** Target : ATmega128
** Created : 2010.01.15
** Author : Chang-Su Lee (ELCO Kookmin Univ.)
** Reference : Datasheet
**
******************************************************/
#include <avr/io.h>
#include "8Bit_Timer0.h"
/********************************************************
** 모드: Normal모드
** 기능: 카운트 값의 클리어가 카운팅 동작 중에는 이루어 지지 않기 때문에 항상 최대값 0xFF까지
** 카운팅을 수행한 후 다시 0x00부터 카운팅을 수행하게 된다. 또한 0xFF에서 0x00으로 바뀌는
** 순간에 Overflow인터럽트가 발생하게 된다.
********************************************************/
void Timer0_Normal_Init()
{
TCCR0 = 0x05; // FOC = 0, WGM00 = 0, COM01 = 0, COM00 = 0, WGM01 = 0, CS02 = 1, CS01 = 0, CS00 = 1
// CS02, CS01, CS00 비트의 값을 조정하여 클럭의 분주비를 변화할 수 있다.
ASSR = 0x00; // AS0 = 0, TCN0UB = 0, OCR0UB = 0, TCR0UB = 0
// 외부 클럭을 사용하여 카운팅할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 터이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
TIMSK &= 0xFE; // OCIE0 = 0(Compare Match 인터럽트 Enable 레지스터), TOIE0 = 0(Overflow 인터럽트 Enable 레지스터)
}
void Timer0_Normal_Enable(unsigned char flag) // Overflow 인터럽트
{
if( flag )
TIMSK |= 0x01; // Enable
else
TIMSK &= 0xFE; // Disable
}
/***************************************************************
** 모드: CTC(Clear Timer on Compare Match)모드
** 기능: 이 모드에서는 타이머/카운터 레지스터의 값이 출력비교 레지스터 OCRn의 값과 일치하면 그 다음
** 클럭 사이클에서 0으로 클리어된다. 따라서, 이모드에서는 클록 입력에 의하여 타이머/카운터
** 레지스터의 값이 항상 0x00~OCRn의 범위에서 계수동작이 반복되며, TCNT0의 값이 증가하다가 OCRn
** 레지스터 값과 같게 되면 그 다음 주기에 TIFR 레지스터에서 OCF0 = 1로 되면서 출력비교 인터럽트가
** 요청된다.
***************************************************************/
void Timer0_CTC_Init()
{
TCCR0 = 0x05; // FOC = 0, WGM00 = 1, COM01 = 0, COM00 = 0, WGM01 = 0, CS02 = 1, CS01 = 0, CS00 = 1
// CS02, CS01, CS00 비트의 값을 조정하여 클럭의 분주비를 변화할 수 있다.
ASSR = 0x00; // AS0 = 0, TCN0UB = 0, OCR0UB = 0, TCR0UB = 0
// 외부 클럭을 사용하여 카운팅할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 타이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
TIMSK &= 0xFD; // OCIE0 = 0(Compare Match 인터럽트 Enable 레지스터), TOIE0 = 0(Overflow 인터럽트 Enable 레지스터)
}
void Timer0_CTC_Control(unsigned char flag)
{
if( flag )
TIMSK |= 0x02; // Enable
else
TIMSK &= 0xFD; // Disable
}
void Timer0_CTC_SetTimer(unsigned char Top)
{
OCR0 = Top;
}
/***************************************************************
** 모드: Phase Correct PWM모드
** 기능: PC PWM 모드는 높은 분해능의 PWM 출력 파형을 발생하는데 유용하다. 이 동작 모드에서는 타이
** 머/카운터 레지스터의 계수동작이 상향 카운터로서 0x00~0xFF까지 증가하였다가 다시 하향 카운터
** 로서 0xFF~0x00으로 감소하는 동작을 반복적으로 수행한다.
***************************************************************/
void Timer0_PC_PWM_Init()
{
TCCR0 = 0x2D; // FOC = 0, WGM00 = 0, COM01 = 1, COM00 = 0, WGM01 = 1, CS02 = 1, CS01 = 0, CS00 = 1
// CS02, CS01, CS00 비트의 값을 조정하여 클럭의 분주비를 변화할 수 있다.
ASSR = 0x00; // AS0 = 0, TCN0UB = 0, OCR0UB = 0, TCR0UB = 0
// 외부 클럭을 사용할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 타이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
DDRB |= 0x10;
}
void Timer0_PC_PWM_SetDuty(unsigned char Duty)
{
OCR0 = Duty;
}
/***************************************************************
** 모드: Fast PWM모드
** 기능: Fast PWM모드는 높은 주파수의 PWM 출력 파형을 발생하는데 유용하다. 이 동작 모드에서는
** 타이머/카운터 레지스터 TCNT0의 계수동작이 항상 0x00~0xFF의 범위에서 증가
** 하는 방향으로만 반복적으로 수행되며, 이때 타이머/카운터 레지스터 TCNT0의 값은 항상 출력비교
** 레지스터 OCR0의 값과 비교되어 OC0의 출력신호를 변형시킨다.
***************************************************************/
void Timer0_Fast_PWM_Init()
{
TCCR0 = 0x6D; // FOC = 0, WGM00 = 1, COM01 = 1, COM00 = 0, WGM01 = 1, CS02 = 1, CS01 = 0, CS00 = 1
// CS02, CS01, CS00 비트의 값을 조정하여 클럭의 분주비를 변화할 수 있다.
ASSR = 0x00; // AS0 = 0, TCN0UB = 0, OCR0UB = 0, TCR0UB = 0
// 외부 클럭을 사용할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 터이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
DDRB |= 0x10;
}
void Timer0_Fast_PWM_SetDuty(unsigned char Duty)
{
OCR0 = Duty;
}
// 외부 클럭을 사용하여 카운팅할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 터이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
TIMSK &= 0xFE; // OCIE0 = 0(Compare Match 인터럽트 Enable 레지스터), TOIE0 = 0(Overflow 인터럽트 Enable 레지스터)
}
void Timer0_Normal_Enable(unsigned char flag) // Overflow 인터럽트
{
if( flag )
TIMSK |= 0x01; // Enable
else
TIMSK &= 0xFE; // Disable
}
/***************************************************************
** 모드: CTC(Clear Timer on Compare Match)모드
** 기능: 이 모드에서는 타이머/카운터 레지스터의 값이 출력비교 레지스터 OCRn의 값과 일치하면 그 다음
** 클럭 사이클에서 0으로 클리어된다. 따라서, 이모드에서는 클록 입력에 의하여 타이머/카운터
** 레지스터의 값이 항상 0x00~OCRn의 범위에서 계수동작이 반복되며, TCNT0의 값이 증가하다가 OCRn
** 레지스터 값과 같게 되면 그 다음 주기에 TIFR 레지스터에서 OCF0 = 1로 되면서 출력비교 인터럽트가
** 요청된다.
***************************************************************/
void Timer0_CTC_Init()
{
TCCR0 = 0x05; // FOC = 0, WGM00 = 1, COM01 = 0, COM00 = 0, WGM01 = 0, CS02 = 1, CS01 = 0, CS00 = 1
// CS02, CS01, CS00 비트의 값을 조정하여 클럭의 분주비를 변화할 수 있다.
ASSR = 0x00; // AS0 = 0, TCN0UB = 0, OCR0UB = 0, TCR0UB = 0
// 외부 클럭을 사용하여 카운팅할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 타이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
TIMSK &= 0xFD; // OCIE0 = 0(Compare Match 인터럽트 Enable 레지스터), TOIE0 = 0(Overflow 인터럽트 Enable 레지스터)
}
void Timer0_CTC_Control(unsigned char flag)
{
if( flag )
TIMSK |= 0x02; // Enable
else
TIMSK &= 0xFD; // Disable
}
void Timer0_CTC_SetTimer(unsigned char Top)
{
OCR0 = Top;
}
/***************************************************************
** 모드: Phase Correct PWM모드
** 기능: PC PWM 모드는 높은 분해능의 PWM 출력 파형을 발생하는데 유용하다. 이 동작 모드에서는 타이
** 머/카운터 레지스터의 계수동작이 상향 카운터로서 0x00~0xFF까지 증가하였다가 다시 하향 카운터
** 로서 0xFF~0x00으로 감소하는 동작을 반복적으로 수행한다.
***************************************************************/
void Timer0_PC_PWM_Init()
{
TCCR0 = 0x2D; // FOC = 0, WGM00 = 0, COM01 = 1, COM00 = 0, WGM01 = 1, CS02 = 1, CS01 = 0, CS00 = 1
// CS02, CS01, CS00 비트의 값을 조정하여 클럭의 분주비를 변화할 수 있다.
ASSR = 0x00; // AS0 = 0, TCN0UB = 0, OCR0UB = 0, TCR0UB = 0
// 외부 클럭을 사용할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 타이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
DDRB |= 0x10;
}
void Timer0_PC_PWM_SetDuty(unsigned char Duty)
{
OCR0 = Duty;
}
/***************************************************************
** 모드: Fast PWM모드
** 기능: Fast PWM모드는 높은 주파수의 PWM 출력 파형을 발생하는데 유용하다. 이 동작 모드에서는
** 타이머/카운터 레지스터 TCNT0의 계수동작이 항상 0x00~0xFF의 범위에서 증가
** 하는 방향으로만 반복적으로 수행되며, 이때 타이머/카운터 레지스터 TCNT0의 값은 항상 출력비교
** 레지스터 OCR0의 값과 비교되어 OC0의 출력신호를 변형시킨다.
***************************************************************/
void Timer0_Fast_PWM_Init()
{
TCCR0 = 0x6D; // FOC = 0, WGM00 = 1, COM01 = 1, COM00 = 0, WGM01 = 1, CS02 = 1, CS01 = 0, CS00 = 1
// CS02, CS01, CS00 비트의 값을 조정하여 클럭의 분주비를 변화할 수 있다.
ASSR = 0x00; // AS0 = 0, TCN0UB = 0, OCR0UB = 0, TCR0UB = 0
// 외부 클럭을 사용할 경우에만 이 레지스터를 조정한다.
TIFR = 0x00; // 인터럽트 플랙 레지스터로써 예외적인 경우를 제외하고는 안건드리는 것이 바람직하다.
SFIOR = 0x00; // 터이머0, 1, 2, 3의 프리스케일러를 리셋시키는 기능을 가진 레지스터이다.
DDRB |= 0x10;
}
void Timer0_Fast_PWM_SetDuty(unsigned char Duty)
{
OCR0 = Duty;
}
댓글 없음:
댓글 쓰기