MSP430 Timer A 1 인터럽트 이용한 1초 만들기
MSP430에서 타이머 기능은 여러가지가 있지만 간단히 타이머 인터럽트를 이용하여 1초마다 LED점등하도록 해서 테스트 해 보기로 한다.
일단 데이터 시트에서 타이머 블록도를 보면 아래 그림과 같다. 인터럽트 소스로는 ACLK, SMCLK, 포트가 있다. 이중에 기능에 맞게 사용하면 되는데 ACLK같은 경우 32.768khz 이기 때문에 시간체크 하면 좋을것 같고 1ms 정도로 인터럽트를 만들려면 SMCLK가 좋을것 같다.
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
클럭 소스가 설정되면 이제 Count Mode를 설정해야 하는데 Stop, , Up to CCR0, Continous up, Up/Down의 모드가 있고 이중 디폴트모드인 CCR0까지 카운트 하는 MC_1로 설정해서 테스트 한다.
인터럽트 구동후 CCR0레지스터값이되면 다시 그 카운트 수만큼 증가 시켜서 원하는 주기를 만들 수 있다.
8Mhz 외부 클럭을 SMCLK로 이용할때
1클럭 시간 : 1/800000 = 0.125us
1ms를 위한 클럭수 : 1ms / 0.125us = 8000
따라서 8000만큼 CCR0를 업데이트 하면 1ms인터럽트가 구동이 된다.
MSP430 레지스터 설정 관련 링크
MSP430 타아미 인터럽트 1초 만들기 예제 소스
MSP430에서 타이머 기능은 여러가지가 있지만 간단히 타이머 인터럽트를 이용하여 1초마다 LED점등하도록 해서 테스트 해 보기로 한다.
일단 데이터 시트에서 타이머 블록도를 보면 아래 그림과 같다. 인터럽트 소스로는 ACLK, SMCLK, 포트가 있다. 이중에 기능에 맞게 사용하면 되는데 ACLK같은 경우 32.768khz 이기 때문에 시간체크 하면 좋을것 같고 1ms 정도로 인터럽트를 만들려면 SMCLK가 좋을것 같다.
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
클럭 소스가 설정되면 이제 Count Mode를 설정해야 하는데 Stop, , Up to CCR0, Continous up, Up/Down의 모드가 있고 이중 디폴트모드인 CCR0까지 카운트 하는 MC_1로 설정해서 테스트 한다.
인터럽트 구동후 CCR0레지스터값이되면 다시 그 카운트 수만큼 증가 시켜서 원하는 주기를 만들 수 있다.
8Mhz 외부 클럭을 SMCLK로 이용할때
1클럭 시간 : 1/800000 = 0.125us
1ms를 위한 클럭수 : 1ms / 0.125us = 8000
따라서 8000만큼 CCR0를 업데이트 하면 1ms인터럽트가 구동이 된다.
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
Timer0Handler();
CCR0 += 8000; //1ms@8Mhz
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
Timer0Handler();
CCR0 += 8000; //1ms@8Mhz
}
MSP430 레지스터 설정 관련 링크
MSP430 타아미 인터럽트 1초 만들기 예제 소스
void Timer0Handler(void);
volatile unsigned int m_TimeTick_1ms = 0;
void Timer0Handler(void)
{
m_TimeTick_1ms++;
Led2Toggle();
}
//-----------------------------------------------------------------------------
void Timer0Init(void)
{
CCTL0 = CCIE; // CCR0 interrupt enabled
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
Timer0Handler();
// CCR0 += 16000; //1ms@16Mhz
CCR0 += 8000; //1ms@8Mhz
}
//-----------------------------------------------------------------------------
volatile unsigned int m_TimeTick_1ms = 0;
void Timer0Handler(void)
{
m_TimeTick_1ms++;
Led2Toggle();
}
//-----------------------------------------------------------------------------
void Timer0Init(void)
{
CCTL0 = CCIE; // CCR0 interrupt enabled
TACTL = TASSEL_2 + MC_2; // SMCLK, contmode
}
// Timer A0 interrupt service routine
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
Timer0Handler();
// CCR0 += 16000; //1ms@16Mhz
CCR0 += 8000; //1ms@8Mhz
}
//-----------------------------------------------------------------------------
void main(void)
{
SystemInit();
unsigned int i;
Led1Init();
Led1On();
Led2Init();
Timer0Init();
enable();
while(1)
{
//1초마다 한번씩 LED점등
{
SystemInit();
unsigned int i;
Led1Init();
Led1On();
Led2Init();
Timer0Init();
enable();
while(1)
{
//1초마다 한번씩 LED점등
if(m_TimeTick_1ms>999)
{
Led1Toggle();
m_TimeTick_1ms = 0;
}
}
}
{
Led1Toggle();
m_TimeTick_1ms = 0;
}
}
}
반응형