[Help]Capture Timer

MMKC

Thành Viên PIF
Em muốn giao tiếp HC SR 04 ( cảm biến siêu âm ) lấy kết quả bằng cách đo xung dùng Capture nhưng không hiểu sao code em hình như chỉ lấy xung đc. đúng 1 lần, còn các lần còn lại không chịu capture nữa.
Em capture raising edge.
Em dùng Timer1_a1
Trig - P2.0
Echo - P2.1 ( TA1.1)
Code:
#include "msp430g2553.h"
#include "Basic_config.h"
 
unsigned int newcap;
void Config_init()
{
P2DIR &=~BIT1;
P2SEL |=BIT1;
P2SEL2 &=~BIT1;
 
P2DIR |=BIT0;
 
TA1CCTL1 |=CM_3 + CCIS_0 + SCS + CAP+CCIE;
TA1CTL = TASSEL_2 + MC_2 + ID_3;
 
WDTCTL = WDTPW + WDTHOLD;
}
 
void main()
{
Config_init();
 
while (1){
P2OUT &= ~BIT0;
delay_us(2);
P2OUT |=BIT0;
delay_us(10);
P2OUT &= ~BIT0;
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
 
}}
 
#pragma vector = TIMER1_A1_VECTOR
__interrupt void Timer1_A1 (void)
{
TA1CCTL1 &= ~CCIFG;
newcap = TA1CCR1;
}
 

honghiep

Cố Vấn CLB
Staff member
Em muốn giao tiếp HC SR 04 ( cảm biến siêu âm ) lấy kết quả bằng cách đo xung dùng Capture nhưng không hiểu sao code em hình như chỉ lấy xung đc. đúng 1 lần, còn các lần còn lại không chịu capture nữa.
Em capture raising edge.
Em dùng Timer1_a1
Trig - P2.0
Echo - P2.1 ( TA1.1)
Code:
#include "msp430g2553.h"
#include "Basic_config.h"
 
unsigned int newcap;
void Config_init()
{
P2DIR &=~BIT1;
P2SEL |=BIT1;
P2SEL2 &=~BIT1;
 
P2DIR |=BIT0;
 
TA1CCTL1 |=CM_3 + CCIS_0 + SCS + CAP+CCIE;
TA1CTL = TASSEL_2 + MC_2 + ID_3;
 
WDTCTL = WDTPW + WDTHOLD;
}
 
void main()
{
Config_init();
 
while (1){
P2OUT &= ~BIT0;
delay_us(2);
P2OUT |=BIT0;
delay_us(10);
P2OUT &= ~BIT0;
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
 
}}
 
#pragma vector = TIMER1_A1_VECTOR
__interrupt void Timer1_A1 (void)
{
TA1CCTL1 &= ~CCIFG;
newcap = TA1CCR1;
}
Theo mình thấy thì sau khi vào LPM, trong chương trình không có chỗ nào thoát LPM về chương trình chính cả. Bạn xem lại nhé
 

messier

Ban Chủ Nhiệm
Em muốn giao tiếp HC SR 04 ( cảm biến siêu âm ) lấy kết quả bằng cách đo xung dùng Capture nhưng không hiểu sao code em hình như chỉ lấy xung đc. đúng 1 lần, còn các lần còn lại không chịu capture nữa.
Em capture raising edge.
Em dùng Timer1_a1
Trig - P2.0
Echo - P2.1 ( TA1.1)
Code:
#include "msp430g2553.h"
#include "Basic_config.h"
 
unsigned int newcap;
void Config_init()
{
P2DIR &=~BIT1;
P2SEL |=BIT1;
P2SEL2 &=~BIT1;
 
P2DIR |=BIT0;
 
TA1CCTL1 |=CM_3 + CCIS_0 + SCS + CAP+CCIE;
TA1CTL = TASSEL_2 + MC_2 + ID_3;
 
WDTCTL = WDTPW + WDTHOLD;
}
 
void main()
{
Config_init();
 
while (1){
P2OUT &= ~BIT0;
delay_us(2);
P2OUT |=BIT0;
delay_us(10);
P2OUT &= ~BIT0;
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
 
}}
 
#pragma vector = TIMER1_A1_VECTOR
__interrupt void Timer1_A1 (void)
{
TA1CCTL1 &= ~CCIFG;
newcap = TA1CCR1;
}
Hình như bạn bị nhầm chút, đoạn code trên của bạn là capture trên cả rising edge và falling edge chân P2.1 (CM_3). Nếu bạn dùng rising edge thì chỉnh lại dùng CM_1. Nếu mạch ngoài không có trở kéo xuống thì nên có đoạn code để enable điện trở nội pull down: P2REN |= BIT1 và P2OUT &= ~BIT1; Phần còn lại mình không thấy có gì sai cả :D

PS: Bạn là Mai Mạnh Khánh Cường phải không?
 

MMKC

Thành Viên PIF
Code:
#include "msp430g2553.h"
#include "Basic_config.h"
 
unsigned int count,oldcap,distance;
void Config_init()
{
P2DIR &=~BIT1;
P2SEL |=BIT1;
P2SEL2 &=~BIT1;
 
P2DIR |=BIT0;
P2REN |= BIT1;
P2OUT &= ~BIT1;
 
TA1CCTL1 |=CM_1 + CCIS_0 + SCS + CAP+CCIE;
TA1CTL = TASSEL_2 + MC_2 + ID_3;
 
WDTCTL = WDTPW + WDTHOLD;
}
 
void main()
{
Config_init();
//__enable_interrupt();
while (1){
P2OUT &= ~BIT0;
delay_us(2);
P2OUT |=BIT0;
delay_us(10);
P2OUT &= ~BIT0;
delay_ms(3);
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
 
}}
 
#pragma vector = TIMER1_A1_VECTOR
__interrupt void Timer1_A1 (void)
{
TA1CCTL1 &= ~CCIFG;
distance = TA1CCR1 - oldcap;
oldcap = TA1CCR1;
//__bic_SR_register_on_exit(CPUOFF);
}
Đây là code tính xung ( capture pulse ) nhưng khi debug thì kết quả không ra đúng lắm
 

messier

Ban Chủ Nhiệm
cái __bis_SR_register(LPM0_bits + GIE) nghĩa là cho mcu vào chế độ LPM + cho phép ngắt thôi bạn, nó đâu có liên quan gì đến timer?? Khi nào cờ ngắt timer xuất hiện thì sẽ nhảy vào chương trình ngắt, xong rồi ngủ tiếp :5cool_beat_plaster:.
 
Top