Vấn đề về ngắt của stm32

Em chào các anh ạ! Em đang học cách lập trình với stm32 ạ. Em đang tự viết chương trình sử dụng ngắt ngoài để thiết lập chế độ cho 1 cụm 4 led. Em đang có hướng làm là:

  • Sử dụng 1 biết stage để chọn trạng thái với các TH tương ứng với giá trị của stage là:
    • stage = 0 : tắt tất cả LED
    • stage = 1 : LED chạy từ trái sang phải
    • stage = 2 : LED chạy từ phải sang trái
    • stage = 3 : Sáng so le
  • Em sử dụng ngắt ngoài để thay đổi giá trị của stage như là : EXTI 0 để gán stage = 0;
    EXTI 1 để tăng giá trị của stage; EXTI 2 để giảm giá trị của stage;
  • Để kiểm tra giá trị của stage, em sử dụng switch case, sau đó em thử sử dụng if

Nhưng em có 1 vấn đề là nếu em kiểm tra giá trị của stage trong hàm while(1) ở trong hàm main, thì khi có tác động của ngắt ngoài, LED sẽ phải hoàn thành hết chu trình của mình rồi mới có thể áp dụng trạng thái tiếp theo.

Tức là nếu LED em đang chạy từ trái sang phải, em ấn nút để sử dụng EXTI0, gán stage= 0, vậy cụm LED sẽ chạy hết từ LED 1 đến LED 4 rồi mới dừng lại. Em đang chưa nghĩ ra cách nào để cho nó dừng luôn được ạ.

Các anh giúp em với ạ ! Em cảm ơn nhiều ạ

Vấn đề nằm ở chỗ main kiểm tra state sau đó chạy hết thuật toán và không kiểm tra lại state.

Hướng giải quyết.
Lồng ghép việc kiểm tra state khi nháy led. Phát hiện được state thay đổi thì thoát thuật toán.

3 Likes

Em cảm ơn ạ! Em hiểu ý anh rồi ạ. Nhưng em vẫn còn thắc mắc là, mình giải quyết vấn đề theo cách đó, vậy để khi mình thực hiện ngắt, cụm led thay đổi luôn thì mình phải thêm bước kiểm tra state vào. Vậy thì nó sẽ kiểm tra khá nhiều lần. Em nghĩ không ảnh hưởng nhiều lắm tới chương trình, nhưng như vậy sẽ làm cho câu lệnh trở nên dài hơn. Vậy với việc dùng ngắt ngoài để điều khiển state của 1 cụm led, anh có cách nào khác để nó hoạt động mạch lạc hơn không ạ ? Kiểu như ấn nút cái trạng thái đổi luôn ý ạ?

Nó không dài hơn bao nhiêu tuỳ cách viết.
Mình thì cần thêm 1-2 dòng là xong.
Đó là cách mạch lạc nhất rồi.
Nó phản ứng chậm là do thuật toán chưa tốt.
Ví dụ dùng delay 1000 để chuyển trạng thái led thì nó sẽ đáp ứng rất chậm.
Nhưng băm cái delay đó ra 1000 khoảng nhỏ và xen lệnh kiểm tra state vào giữa thì nó sẽ chậm tối đa 1ms mà thôi. Gần như tức thời.

3 Likes

Dạ vâng ạ em cảm ơn anh ạ !

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?