Thông báo

Collapse
No announcement yet.

Dùng phần mềm để chống xung nẩy cho ngắt ngoài!

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • #16
    trời kô bit là còn trang tiếp theo!

    Comment


    • #17
      Tu thấy 8051 nó "nhớ" dc ngắt ngoài khi đang xử lí ngắt ngoài, nhưng chỉ dc một lần thôi, tu thử rồi, thời gian lại quá nhanh (<20ms) do đó ứng dụng cho phím nhấn thì cũng dc chứ sao!
      !e

      Comment


      • #18
        Nguyên văn bởi zemen Xem bài viết
        Tu thấy 8051 nó "nhớ" dc ngắt ngoài khi đang xử lí ngắt ngoài, nhưng chỉ dc một lần thôi, tu thử rồi, thời gian lại quá nhanh (<20ms) do đó ứng dụng cho phím nhấn thì cũng dc chứ sao!
        Ý của zemen là sao nhỉ, chính ngắt ngoài, ví dụ ngắt ngoài 0 đi, ngắt chính nó à?

        Comment


        • #19
          à có lần tu dùng ngắt ngoài 0 (tác động bởi nhấn phím). Khi ngắt xảy ra tu delay_ms(20) rồi làm vài câu lệnh nhỏ khác. Sau khi thoát hàm ngắt để về chương trình chính, thì đôi khi nó lại gọi hàm ngắt ngoài 1 lần nữa
          !e

          Comment


          • #20
            Bạn làm như thế này nhé:

            - Khai báo 1 biến toàn cục 8 bit gọi là A chẳng hạn và 1 cờ F, được khởi tạo ban đầu F=0,A=0

            - Thiết lập một ngắt thời gian khoảng 5-10ms
            Chương trình ngắt thời gian nếu thấy F=1 sẽ dịch trái biến A 1 bit và thoát, nếu tất cả các bit của A =0 thì thực hiện các công việc của ngắt cứng và xóa cờ F=0.

            - Chương trình ngắt cứng chỉ làm hai việc set bit 0 của A=1 và set cờ F=1

            Như vậy ngắt cứng chỉ làm nhiệm vụ thiết lập cờ thôi, công việc chủ yếu sẽ thuộc về ngắt thời gian.
            Như vậy có thể chống được rung phím cỡ 80ms, nếu cần có thể tăng lên nữa.

            Chúc vui vẻ

            Comment


            • #21
              Nguyên văn bởi Tubes Xem bài viết
              Bạn làm như thế này nhé:

              - Khai báo 1 biến toàn cục 8 bit gọi là A chẳng hạn và 1 cờ F, được khởi tạo ban đầu F=0,A=0

              - Thiết lập một ngắt thời gian khoảng 5-10ms
              Chương trình ngắt thời gian nếu thấy F=1 sẽ dịch trái biến A 1 bit và thoát, nếu tất cả các bit của A =0 thì thực hiện các công việc của ngắt cứng và xóa cờ F=0.

              - Chương trình ngắt cứng chỉ làm hai việc set bit 0 của A=1 và set cờ F=1

              Như vậy ngắt cứng chỉ làm nhiệm vụ thiết lập cờ thôi, công việc chủ yếu sẽ thuộc về ngắt thời gian.
              Như vậy có thể chống được rung phím cỡ 80ms, nếu cần có thể tăng lên nữa.

              Chúc vui vẻ
              Hiểu ý của bạn rồi, để suy nghĩ lại!
              Last edited by vinh81; 14-06-2007, 21:15. Lý do: Nhầm

              Comment


              • #22
                Nguyên văn bởi Tubes Xem bài viết
                Bạn làm như thế này nhé:

                - Khai báo 1 biến toàn cục 8 bit gọi là A chẳng hạn và 1 cờ F, được khởi tạo ban đầu F=0,A=0

                - Thiết lập một ngắt thời gian khoảng 5-10ms
                Chương trình ngắt thời gian nếu thấy F=1 sẽ dịch trái biến A 1 bit và thoát, nếu tất cả các bit của A =0 thì thực hiện các công việc của ngắt cứng và xóa cờ F=0.

                - Chương trình ngắt cứng chỉ làm hai việc set bit 0 của A=1 và set cờ F=1

                Như vậy ngắt cứng chỉ làm nhiệm vụ thiết lập cờ thôi, công việc chủ yếu sẽ thuộc về ngắt thời gian.
                Như vậy có thể chống được rung phím cỡ 80ms, nếu cần có thể tăng lên nữa.

                Chúc vui vẻ
                Cách này không được, nó có 1 khuyết điểm: nếu tui đè phím cỡ 1/10s rồi thì trong thời gian đó sẽ hết xung nẩy nhưng khi buông phím ra lại có xung nẩy trở lại rồi mới hết xung nẩy. Chương trình của bạn sẽ cho công việc cần làm thực hiện 2 lần! Chương trình của bạn chỉ là dò khi nào hết nẩy trong 80ms mới làm!

                Comment


                • #23
                  Nguyên văn bởi zemen Xem bài viết
                  à có lần tu dùng ngắt ngoài 0 (tác động bởi nhấn phím). Khi ngắt xảy ra tu delay_ms(20) rồi làm vài câu lệnh nhỏ khác. Sau khi thoát hàm ngắt để về chương trình chính, thì đôi khi nó lại gọi hàm ngắt ngoài 1 lần nữa
                  Ui, bạn biết vì sao lúc bị lúc không không? Vì tay ấn phím lúc dài lúc ngắn. Bạn thử với cái trò đợi phím nhả xong, delay tiếp, thoát ngắt, xem nó có gọi ngắt lần nữa không?

                  Comment


                  • #24
                    Nguyên văn bởi vinh81 Xem bài viết
                    Cách này không được, nó có 1 khuyết điểm: nếu tui đè phím cỡ 1/10s rồi thì trong thời gian đó sẽ hết xung nẩy nhưng khi buông phím ra lại có xung nẩy trở lại rồi mới hết xung nẩy. Chương trình của bạn sẽ cho công việc cần làm thực hiện 2 lần! Chương trình của bạn chỉ là dò khi nào hết nẩy trong 80ms mới làm!
                    Quá đơn giản!, vấn đề chỉ còn liên quan đến trạng thái On/Off thôi, bạn có thể cải tiến bằng cách ngắt thời gian vừa kiểm tra A=0 & F=1 đồng thời kiểm tra trạng thái vào của ngắt cứng nữa, nếu Port=0 là đang bấm và chuỗi xung nảy vừa xử lý là quá trình bắt đầu bấm, nếu Port=1 là phím đang nhả và chuỗi xung nảy vừa xử lý là quá trình rung khi nhả phím

                    Đây là thuật toán chống rung hay nhất mà tôi được biết,
                    Tôi chọn 80ms là do phím thường sẽ rung khoảng 70-160ms, nếu bạn không muốn nó delay tới 80ms thì có thể giảm ngắt thời gian xuống 1ms. Khi đó có lẽ phải tăng A lên 16bit thì mới chính xác.
                    Thuật toán này hay ở chỗ tuy delay 80ms, nhưng nó có thể chống rung cho các xung >80ms ví dụ 160ms hoặc hơn nữa thậm chí chống cả nhiễu EMI.
                    Last edited by Tubes; 15-06-2007, 09:34.

                    Comment


                    • #25
                      Hi,
                      Theo tui thì dùng trễ thời gian rồi thực hiện chương trình là được rồi. Nếu ngắt lại bị lặp lại thì tăng thời gian trễ lên một chút cho đến khi được thì thôi. Nếu thời gian trễ quá lâu làm ảnh hưởng tới các chương trình khác thì nên dùng một tụ lọc trị số nhỏ nối song song với phím nhấn và làm giảm thời gian trễ xuống. Nếu không được nữa thì chuyển qua lập trình đa nhiệm.
                      Một cách khác nữa là cấu hình từ ngắt kích khởi cạnh qua kích khởi mức. Nói chung là nên làm cách nào đáp ứng được tác động thông thường nhất là được còn bác cố tình thao tác khác (vd: bấm lâu một chút xem sao,... để test) thì chắc chắn không bao giờ thỏa mãn được rồi.

                      Thân ái và đoàn kết.
                      Đường đến những ngày vinh quang không còn xa
                      Con đường chúng ta... chúng ta đã chọn.

                      Comment


                      • #26
                        Nguyên văn bởi Tubes Xem bài viết
                        Quá đơn giản!, vấn đề chỉ còn liên quan đến trạng thái On/Off thôi, bạn có thể cải tiến bằng cách ngắt thời gian vừa kiểm tra A=0 & F=1 đồng thời kiểm tra trạng thái vào của ngắt cứng nữa, nếu Port=0 là đang bấm và chuỗi xung nảy vừa xử lý là quá trình bắt đầu bấm, nếu Port=1 là phím đang nhả và chuỗi xung nảy vừa xử lý là quá trình rung khi nhả phím

                        Đây là thuật toán chống rung hay nhất mà tôi được biết,
                        Tôi chọn 80ms là do phím thường sẽ rung khoảng 70-160ms, nếu bạn không muốn nó delay tới 80ms thì có thể giảm ngắt thời gian xuống 1ms. Khi đó có lẽ phải tăng A lên 16bit thì mới chính xác.
                        Thuật toán này hay ở chỗ tuy delay 80ms, nhưng nó có thể chống rung cho các xung >80ms ví dụ 160ms hoặc hơn nữa thậm chí chống cả nhiễu EMI.
                        Hay! Học hỏi thêm một cách! Thực ra tui cũng có 1 cách, đã thử rồi hoàn toàn OK, cho dù có bấm phím kiểu gì đi nữa cũng hoàn toàn không nẩy!
                        Cho kiểm đủ 50 lần phím nhấn thì đợi tiếp đủ 50 lần phím nhả thì thực hiện chương trình!
                        Nếu chưa đủ 50 lần phím nhấn mà chân INT0 (hay INT1) lên 1 thì không làm gì vì đó là xung nẩy. Phải đợi phím nhả đủ 50 lần vì lúc nhả vẫn bị rung phím! Phải xử lý cả 2 lần rung phím khi nhấn và khi nhả! 50 lần đây chính là tui kiểm tra liên tục 50 lần, chứ không phải nhấn 50 lần
                        Dù sao thì cuối cùng cũng có người trả ời đúng câu hỏi của tui!

                        Comment


                        • #27
                          Xử lý phím bấm không phải đơn giản như mọi người nghĩ đâu.
                          Bạn nào nghĩ lắp thếm 1 tụ là có thể xử lý được nút bấm thì hoàn toàn nhầm đấy. Nếu dùng tụ thì phải lắp như sơ đồ gửi kèm.

                          Không phải tự dưng mà một số hãng lại đâm đầu vào sản xuất IC chống rung cho bàn phím đâu
                          Xem IC sau
                          MC14490-D.PDF
                          Attached Files

                          Comment


                          • #28
                            Chào cả nhà.
                            Tui làm cách này các bác xem có được không?
                            _ Khai báo 1 biến toàn cục mTDelay.
                            _ Trong ngắt INT0:
                            + Cấm ngắt INT0.
                            + Xử lý nhấn phím.
                            + mTDelay = 250. (giá trị này tùy thuộc thời gian bạn muốn dập phím)
                            _ Sử dụng Timer 0 (chế độ tự nạp và TH0=200) 250*200=50.000uS = 50mS.
                            _ Trong ngắt Timer0:
                            if(mTDelay >0)
                            { mTDelay--;
                            if(mTDelay<0)
                            { Cho phép ngắt ngoài hoạt động.}
                            }
                            Như vậy khi có phím nhấn thì những việc khác vẫn được thực hiện mà việc dập phím vẫn hoàn tất tốt. Bạn cần lưu ý một chút về thời gian dập phím, nếu nó quá ngắn so với thời gian xử lý nhấn phím thì có thể sẽ có sự cố.
                            Tôi nghĩ không lý do gì nó không chạy.
                            Last edited by HPECOM; 16-06-2007, 09:27.
                            Một bông hồng cho những ai đang còn mẹ,
                            Đang còn mẹ để lòng vui sướng hơn ..

                            Comment


                            • #29
                              Nguyên văn bởi HPECOM Xem bài viết
                              Chào cả nhà.
                              Tui làm cách này các bác xem có được không?
                              _ Khai báo 1 biến toàn cục mTDelay.
                              _ Trong ngắt INT0:
                              + Cấm ngắt INT0.
                              + Xử lý nhấn phím.
                              + mTDelay = 250. (giá trị này tùy thuộc thời gian bạn muốn dập phím)
                              _ Sử dụng Timer 0 (chế độ tự nạp và TH0=200) 250*200=50.000uS = 50mS.
                              _ Trong ngắt Timer0:
                              if(mTDelay >0)
                              { mTDelay--;
                              if(mTDelay<0)
                              { Cho phép ngắt ngoài hoạt động.}
                              }
                              Như vậy khi có phím nhấn thì những việc khác vẫn được thực hiện mà việc dập phím vẫn hoàn tất tốt. Bạn cần lưu ý một chút về thời gian dập phím, nếu nó quá ngắn so với thời gian xử lý nhấn phím thì có thể sẽ có sự cố.
                              Tôi nghĩ không lý do gì nó không chạy.
                              Nó không chạy! Có ngườii đưa ra cách này rồi! Tui cũng đã có nói ở trên rồi! Bro có delay 1s thì nó vẫn không chống được xung nẩy (tui bấm phím rất bình thường chứ không cố ý đè lâu hơn bình thường) Còn 2 cách đúng ở trên thì có ai nổi hứng đè lâu 5s, 10s nó vẫn không sao!

                              Comment


                              • #30
                                Hi,
                                Xin nói thêm một chút về cách đấu tụ song song với phím. Như sơ đồ ở trên thì đúng là quá chuẩn và trong các thiết bị chất lượng cao thì thường dùng như vậy. Tuy nhiên ta có thể bỏ bớt điện trở R2 và diode vì 2 linh kiện này chỉ có tác dụng chống hỏng tụ mà thôi (cái này cần dùng cho tụ hóa). Trong các mạch ta dùng, thường dùng tụ gốm trị số nhỏ (102, 103. 104) nên có thể không dùng R2 và diode cũng tốt không sao cả.
                                Từ trước đến giờ rất nhiều cách được nhiều bác đưa ra, dựa theo cách hoạt động của cái mạch của bác để chọn cái nào cho phù hợp. Ví dụ tôi dùng điều khiển từ xa, khi ta bấm 1 phím thì có tới 3 thậm chí 4 mã (của phím) gửi tới một lúc, nhưng ta chỉ lấy cái đầu tiên còn bỏ qua các mã tiếp theo trong một khoảng thời gian. Khoảng thời gian này gần bằng với khoảng thời gian giữa 2 lần bấm phím. Vì vậy khi ta giữ một phím khá lâu thì nó mới hiểu nhầm lần bấm thứ 2. Nếu các bác để ý thì bàn phím của máy tính cũng có khoảng thời gian giữa 2 lần bấm. Nếu ta đặt cái này lâu thì khi bấm và giữ phím 'a' sẽ xuất hiện một dãy chữ 'a' chậm hơn khi ta set khoảng thời gian này ngắn lại.

                                Chúc các bác thành công và xin chào thân ái, đoàn kết.
                                Đường đến những ngày vinh quang không còn xa
                                Con đường chúng ta... chúng ta đã chọn.

                                Comment

                                Về tác giả

                                Collapse

                                vinh81 Tìm hiểu thêm về vinh81

                                Bài viết mới nhất

                                Collapse

                                Đang tải...
                                X