MSP430 ตอนที่ 2 Timer

Sirichat Sangjuiwong
MCUREGIS
Published in
2 min readMay 18, 2019

ในบทความนี้จะเป็นตัวอย่างการใช้งาน Timer A ของ MSP430FR5729 มาทำการ Toggle GPIO ทุกๆ 1 ms โดยจาก Timer_A Block Diagram ใน user guides ของ MSP430FR5729 นั้น จะเริ่มจากเลือก Clock Source เข้ามาแล้วทำการหารความถี่ให้ได้ตามที่ต้องการ จากนั้นเลือกโหมดการนับ แล้วก็เปิดการใช้งาน Interrupt เพื่อ Toggle GPIO ทุกครั้งที่มี Flag เกิดขึ้น

ตัวอย่างการ Toggle GPIO ทุกๆ 1 ms โดยการ Initial Timer และ GPIO ในหัวข้อ 1.0 ถึง 1.6 จะอยู่ใน main ฟังก์ชัน ส่วน 1.7 จะเป็น Interrupt Service Routine

1.0 ทำการเซ็ท Direction ของ GPIO Pin 3.3 ให้เป็น Output และเซ็ทค่าเป็น 1P3DIR |= 0x01<<3;
P3OUT |= 0x01<<3;
1.1 ทำการ Stop Timer ไว้ก่อนTA0CTL &= ~TACLR;1.2 ทำการเลือก Clock Source ในที่นี้ผมใช้ SMCLK ที่เซ็ทไว้ 8 MHz มาใช้TA0CTL &= ~(0x03<<8);
TA0CTL |= 0x02<<8;
1.3 ทำการเลือกโหมดของ Timer เป็น Up ModeTA0CTL &= ~(0x03<<4);
TA0CTL |= 0x01<<4;
1.4 ในส่วนของการหารความถี่นั้นจะมีอยู่ 2 ส่วนคือ ID คือหารด้วย 1,2,4 หรือ 8
จากนั้นจะนำความถี่ที่ได้หลังจากผ่าน ID มาแล้วไปหารต่อด้วย IDX ตรงนี้จะสามารถหารได้ด้วย 1 ถึง 8 ก็แล้วแต่คุณเลยว่าจะหารอะไรก่อนหลังยังไง แต่จะต้องเป็นไปตามสมการนี้
ID*IDX = Clock Source * Td / count_value count_value คือ จำนวนการนับ มีค่าตั้งแต่ 0 ถึง 65535
Td คือ เวลาเมื่อนับตั้งแต่ 0 ถึง count_value
ในที่นี้ผมเซ็ท ID = 4 และ IDX = 1 เท่ากับว่า Timer ของผมจะนับครั้งละ 4/8 us
นับไป 2000 ครั้งก็จะครบ 1 ms
// ID Devider 4
TA0CTL &= ~(0x03<<6);
TA0CTL |= 0x02<<6;
// IDX Devider 1
TA0EX0 &= ~0x07;
1.5 ทำการ Enable Interrupt เมื่อนับถึงค่าที่ต้องการให้กระโดดเข้าไปที่ Interrupt Service RoutineTA0CCTL0 |= CCIE; // Enable CCIFG1.6 Start Timer ด้วยการใส่ Count Value ลงไปให้ Timer นับตั้งแต่ 0 ถึง 2000
หากต้องการ Stop ให้ใส่ 0
TA0CCR0 = 2000;1.7 Interrupt Service Routine ของ Timer A เมื่อนับครบ 2000 จะกระโดดเข้ามาในนี้โดยเราให้ทำการ Toggle GPIO Pin 3.3#pragma vector = TIMER0_A0_VECTOR
__interrupt void TA0(void)
{
P3OUT ^= 0x01<<3;
}

--

--