[help] Đếm xung dùng ngắt ngoài msp430g2553

tuandanh.bk10

Trứng gà
các anh chị cho em hỏi tí, em sử dụng ngắt ngoài để đếm xung (encoder) tại chân P1.5, mỗi khi có xung lên thì biến i lên 1 đồng thời đèn P1.0 đổi trạng thái. nhưng có điều lạ là kể cả khi em không cấp xung thì mà chạm tay (hay 1 vật kim loại j khác) vào chân P1.5 thì biến i và đèn led vẫn nhấp nháy với tần số rất cao mà không biết vì sao. với 1 cái nữa là khi em đặt break point để xem giá trị biến i thì đèn led với biến i có tăng nhưng chậm hơn ban đầu.
đây là code của em, có j sai sót mong mọi người góp ý giúp. em xin cảm ơn :2cool_burn_joss_stick::2cool_burn_joss_stick:
Code:
#include <msp430g2553.h>
 
unsigned int i=0;
 
void main(void)
{
    WDTCTL =WDTHOLD +WDTPW;
    BCSCTL1 = CALBC1_1MHZ;                    // Set DCO
    DCOCTL = CALDCO_1MHZ;
 
// set P1.0 GPIO
    P1SEL &=~BIT0;
    P1SEL2 &=~BIT0;
    P1DIR |= BIT0;
    P1OUT &= ~BIT0;
   
//set P1.5 INPUT Pulse
    P1REN |= BIT5;                                // dien tro keo len
    P1IE |= BIT5;                                //interrupt enable
    P1IES &= ~BIT5;                                // interrupt low-high
 
    P1IFG &= ~BIT5;                                // set interrupt flag to 0 in the beginning
 
    _BIS_SR(LPM4_bits + GIE);                   
 
 
}
#pragma vector = PORT1_VECTOR
__interrupt void PORT1 (void)
{
    i =i+1;
    P1OUT ^= BIT0;
    P1IFG &= ~BIT5;
}
 

honghiep

Cố Vấn CLB
Staff member
Việc khi bạn chạm tay vào LED nháy, biến i tăng với tần số cao là do nhiễu. Mặc dù trong code có trở kéo xuống ở chân P1.5 nhưng vì là trở kéo nội, giá trị lớn nên không tránh được nhiễu.
Còn việc khi đặt breakpoint LED, i tăng chậm là do trong quá trình debug, MCU phải làm thêm một số công việc khác phục vụ cho việc debug nên không realtime. Vì vậy chương trình sẽ chậm hơn khi không ở chế độ debug
 

tuandanh.bk10

Trứng gà
Việc khi bạn chạm tay vào LED nháy, biến i tăng với tần số cao là do nhiễu. Mặc dù trong code có trở kéo xuống ở chân P1.5 nhưng vì là trở kéo nội, giá trị lớn nên không tránh được nhiễu.
Còn việc khi đặt breakpoint LED, i tăng chậm là do trong quá trình debug, MCU phải làm thêm một số công việc khác phục vụ cho việc debug nên không realtime. Vì vậy chương trình sẽ chậm hơn khi không ở chế độ debug
vậy có cách nào khắc phục không ạ. vì khi em cấp xung thì led cũng nháy và i cũng tăng y như khi em chạm tay vào vậy nên em không biết nó đang đếm xung em cấp hay do nhiễu gây ra nữa. khi em chuyển sang cấp xung bằng nút nhấn thì nó chạy bình thường.
 

honghiep

Cố Vấn CLB
Staff member
Để hạn chế nhiễu, bạn có thể gắn trở kéo ngoài. Giá trị trở kéo khoảng vài kOhm, kéo lên
 
H

huunho

Guest
bạn tạo trễ để tránh nhiễu là ok nhất, không phải dùng trở kéo ngoài
 
H

huunho

Guest
mình đã làm nhiều nút ấn thành công bằng cách tạo trễ để chống nhiễu. bạn tạo trễ khoảng 100ms
 

tranhieu_hcmut

Cố Vấn CLB
Staff member
+ Đếm xung encoder thì e ko nên dùng ngắt ngoài. Ví dụ encoder 300 xung thì encoder quay hết một vòng, nó phải vào ngắt tận 300 lần :gach, e nên dùng Timer counter để làm việc này thì tốt hơn nhiều.
+ Về việc chống nhiễu & "hiển thị LED" thì e làm như mạch sau, sử dụng thêm 1 IC smith trigger (74HC14)

Chúc e thành công :1cool_byebye:(lâu lâu lại chém gió):2cool_sexy_girl:
 

tuandanh.bk10

Trứng gà
anh chị cho em hỏi thêm là trong đoạn code trên mỗi khi có xung encoder ngõ vào thì led sẽ nhấp nháy, nhưng không hiểu sao xung encoder thì rất nhanh trong khi led của em lại sáng tắt với tần số rất thấp, có phải do tần số ngắt ngòai quá nhanh nên vxl không kịp xử lý lệnh không ạ??
 

mafiaWolf

Chủ tịch Hội phụ nữ PIF
anh chị cho em hỏi thêm là trong đoạn code trên mỗi khi có xung encoder ngõ vào thì led sẽ nhấp nháy, nhưng không hiểu sao xung encoder thì rất nhanh trong khi led của em lại sáng tắt với tần số rất thấp, có phải do tần số ngắt ngòai quá nhanh nên vxl không kịp xử lý lệnh không ạ??
Có thể do nó nháy nhanh nhưng mắt mình thấy chậm (như cánh quạt trần) :)
 
Top