TCB는 16bit 타이머이고 간단한 기능과 특징들이 정리되어 있습니다.
다음은 블럭다이어그램입니다.
CTRLA, CTRLB 레지스터를 이용해서 Clock과 Mode를 설정한다는 것을 유추할 수 있습니다.
다음은 타이머 클럭 로직입니다.
클럭은 CLK_PER나 CLK_TCAn을 이용해서 설정이 가능합니다.
일단 어떤 모드를 사용할지 정해야 하는데 저는 기본적인 Periodic Interupt Mode를 사용할 예정입니다.
모드에 대한 자세한 내용은 데이터시트를 보면 상세히 나와 있습니다.
한번 검토해 보는 것을 추천드립니다.
타이머 설정 코드를 보면
먼저 TCB0.CTRLA 에서 타이머 클럭 및 모드, 타이밍 등등을 미리 설정합니다.
void timerInit(void)
{
// millis Timers
TCB0.CTRLA = (0x00 << TCB_CLKSEL_gp); // DIV1 = CLK_PER = 20Mhz
TCB0.CTRLB = (0x00 << TCB_CNTMODE_gp); // Periodic Interrupt Mode
TCB0.INTCTRL = (1 << TCB_CAPT_bp); // Capture Interrupt Enable
TCB0.CCMP = (1000*(F_CPU/1000000)) - 1; // 1ms
TCB0.CTRLA |= (1 << TCB_ENABLE_bp); // Timer Start
}
그리고 인터럽트 구문과 millis()함수를 별도로 설정합니다.
static volatile uint32_t ms_cnt = 0;
ISR(TCB0_INT_vect)
{
ms_cnt++;
TCB0.INTFLAGS = (1 << TCB_CAPT_bp);
}
uint32_t millis(void)
{
uint32_t ret;
uint8_t old_sreg = SREG;
cli();
ret = ms_cnt;
SREG = old_sreg;
return ret;
}
main은 다음과 같이 만들어주면 PA1에 연결된 LED가 100ms로 토글 동작이 실행됩니다.
int main(void)
{
uint32_t pre_time;
deviceInit();
sei();
pre_time = millis();
while (1)
{
if(millis() - pre_time >= 100)
{
pre_time = millis();
PORTA.OUTTGL = PIN1_bm;
}
}
}
반응형
'b. 임베디드 > AVR' 카테고리의 다른 글
[ATtiny1616] 소프트웨어 리셋(Reset) 사용하기 (0) | 2022.05.07 |
---|---|
[ATtiny1616] Watchdog 사용하기 (0) | 2022.05.04 |
[ATtiny1616] TCA 타이머 사용하기 (0) | 2022.05.03 |
[ATtiny1616] ADC 함수 만들기 (0) | 2022.05.02 |
[ATtiny1616] GPIO 예제 (0) | 2022.04.28 |
[ATtiny1616] 메인 Clock 설정 (0) | 2022.04.27 |
[AVR128DA48] 타이머 TCB0 예제 (0) | 2022.04.06 |
[AVR128DA48] TWI (I2C) 동작 (PCA9685) (0) | 2022.04.05 |