thắc mắc timer

denchetmatthoi

Trứng gà
anh chị cho em hỏi sau khi hok về timer em có chút thắc mắc không biết sao em nạp đoạn co de trên thì đèn chỉ nháy 1 lần rồi không nháy nữa , và cho em hỏi mình sử dụng ngắt timer TAIE sao còn sử dụng ngắt CCIE trong thanh ghi TAxCCTL, và khi vào ngát có cần xóa cờ ngắt CCIFG trong thanh ghi TAxCCTL không , em cám ơn !
#include<msp430g2553.h>
void main(void)
{
WDTCTL = WDTPW +WDTHOLD ;
P1DIR |= 0XFF;
P1OUT |= BIT0;
TA0CTL = TASSEL_2 + ID_3 + TAIE + MC_3;
TACCR0 = 31250;
TA0CCTL0 = CCIE;
TA0CCTL0 &= ~CCIFG;
_BIS_SR(LPM0_bits+GIE);
}
#pragma vector = TIMER0_A0_VECTOR
__interrupt void khanh(void)
{
TA0CCTL0 ^= CCIFG;
P1OUT ^= BIT0;
}
 

hoangphuoc

Thành Viên PIF
1/Trong hàm ngắt bạn thêm vào dòng này thử nhé :
Code:
if (TA0IV == 0x02) {
TA0CCTL0 ^= CCIFG;
P1OUT ^= BIT0;
}
bạn đọc lại ví dụ sẽ hiểu rõ hơn chỗ này.
2/ Khi vào trong chương trình ngắt thì cờ ngắt tự reset.
3/ TAIE là ngắt tràn cho timer. Còn CCIE là cho phép ngắt khi timer tới giá trị CCRx tương ứng.
Ví dụ như trong chương trình này bạn cho TACCR0=31250 thì sẽ nhảy vào ngắt.
 

denchetmatthoi

Trứng gà
dạ cho em hỏi thêm là trong doạn code lựa chọn nguồn xung thì : dòng
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If cal constants erased,
}
có ý nghĩa là gì và không có nó có ảnh hưởng gf không, em cũng dọc trên mạng mak không hiểu rõ chỗ này lcho lắm!
#include "msp430g2553.h"

/* Khai báo loại chip đang dùng
* Thư viện này chứa các khai báo tên #define cho địa
* chỉ các thanh ghi
*/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // watchdog timer setup
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If cal constants erased,
} // trap CPU!!
BCSCTL1 = 0x80; // Set range = 0x80 ; RSEL = 0;
// DCOCTL = 0xC0; // DCO=3; MOD = 0
DCOCTL |= DCO1 + DCO0 + MOD0; // DCO=3; MOD = 0
//=======> f = 0.12Mhz
P1DIR = 0x40; // I/O setup
P1OUT = 0;
BCSCTL2 |= SELM_0 + DIVM_3; // select DCOCLK ; divide = 8
// ===> f = 0.12 / 8 MHz
while(1)
{
P1OUT = ~P1OUT; // LED on
// ta có f =1/15000 Hz để có xung 1s thì ta
//khởi tạo delay với số chu kì là15000.
_delay_cycles(15000); // delay 15000 cycles
// tuong ung neu de divider = 1 (DIVM_0) thi so delay cycle = 120000
//==========> f_out = 1Hz
}
}
 

honghiep

Cố Vấn CLB
Staff member
Bạn nên sử dụng TA0CCTL0 &= ~CCIFG; thay vì TA0CCTL0 ^= CCIFG; nhé. Nếu không chắc chắn về việc có cần xóa cờ ngắt hay không thì chỉ việc xóa quách nó đi cho chắc :gach
 
Top