Thông báo

Collapse
No announcement yet.

Vì sao phải sử dụng ngắt?

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

  • #16
    Nguyên văn bởi Puppy Xem bài viết
    Em còn hơi mơ hồ nên hỏi vậy?
    Vì sao phải sử dụng ngắt? có thể dùng phím thay cho ngắt ngoài được không? những trường hợp nào thì dùng ngắt?
    Ngắt là cơ chế mà CPU cho phép thiết bị ngoại vi thông báo cho nó biết về tình trạng sẵn sàng chao đổi dữ liệu của mình.
    Tại sao lại dùng ngắt
    Tại 1 thời điểm CPU chỉ có thể thực hiện được 1 lệnh duy nhất đồng nghĩa nó chỉ làm được một hành động vì vậy để vào ra dữ liệu với các thiết bị ngoại vi nó dùng 3 cách:
    Cách 1: Pulling -> Hỏi xem thiết bị ngoại vi đã sẵn sàng chao đổi dữ liệu hay chưa
    Cách 2: Cho phép thiết j ngoại vi báo với CPU về khả năng sẵn sàng chao đổi dữ liệu của mình .
    Cách 3: cơ chế truy nhập trực tiếp bộ nhớ (DMA).
    He he he !!!

    Comment


    • #17
      Nguyên văn bởi ngohaibac Xem bài viết
      Đề nghị bạn Puppy đọc kĩ lại các bài viết trong box này trước khi đặt nhiều câu hỏi quá amatuer nhé.

      Bạn nên nghiên cứu lại về cấu trúc, các timer, .. cách dùng ngắt của 8051 đi nhé.

      Trong ngắt mà lại còn dùng tiếp delay thì cũng hơi có vấn đề nho nhỏ là cũng chưa tiết kiệm CPU đâu. Ví dụ ngắt bạn dùng có chu kì là 1s mà thời gian thực hiện hàm ngắt lại gần 1s (do có thêm delay) thì dùng ngắt làm gì?? và CPU còn thực hiện thêm dc gì nữa không nhỉ?

      Bạn nên tạo một ngắt timer 1ms rồi dùng biến static đếm sự kiện ngắt và thực hiện các việc khác nhau theo bội của 1ms nhé. Như thế có thể làm được khá nhiều việc.

      Bạn nên đọc kĩ nhé. Vì vấn đề này có nhiều người bàn trong box này rùi. Bạn mà cứ hỏi như thế sẽ đến lúc không có ai muốn trả lời cho bạn đâu. Hãy luôn suy nghĩ và suy nghĩ, hãy đọc cẩn thận vào.

      Chúc bạn thành công.
      Sao bác lại nói em thế, em đã bảo là em đang mơ hồ mà. Em tin là trong forum này cũng nhiều người amatuer như em, nhưng ngại không hỏi, bây giờ em hỏi để mọi người cùng hiểu đó mà . Giải thích như bác thì em hiểu rồi. vì thế em mới hỏi trong trường hợp nào thì dùng ngắt. bây giờ thì em đã hiểu.
      cảm ơn bác.
      Last edited by Puppy; 24-12-2006, 14:26.

      Comment


      • #18
        Bạn cho mình xin lỗi nếu mình nói có gì không đúng nhé.

        Ai cũng từ bắt đầu mà lên cả. Và bạn biết không nếu bạn muốn hiểu mọi vấn đề thì hãy tập tư duy và suy nghĩ những kiến thức trong những quyển sách tiếng Việt đơn giản đã.

        Mình đã học 8051 và hiện nay không viết chương trình nào về con này cả. Minh chỉ xin đưa ra một vài phương pháp học con này.

        1/ Đọc quyển "Cấu trúc và lập trình họ 8051" của ông gì đó, lúc đầu không hiểu, cứ đọc, cứ đọc đi. Và mình gặp khái niệm "ngắt" tự hỏi nó thế nào mà quan trọng vậy?

        Mình mới quay lại xem quyển "Kỹ thuật lập trình C" của Phạm Văn Ất, phần ngắt mềm và ngắt cứng trong Windows. Và tớ học về ngắt trong đó, và thử lập trình trên Turbo C những ngắt bàn phím, màn hình ,.. (0x21,..). Vì nó dùng thanh ghi giống như ASM đó và bạn hiểu được cách viết và gọi chương trình ASM.

        Sau đó, quay lại quyển sách 8051 vừa rùi và học từ từ, chẳng cần lập trình cũng dc chỉ cần hiểu đã.

        2/ Bạn phải hiểu hết mấy cái Timer, .. xem thanh ghi nào tác động đến nó thì nhớ lấy để còn biết thiết lập tham số. Mà chẳng cần nhớ, chỉ cần down một file về cấu trúc và tệp lệnh của 8051 của bất cứ thằng nào Philip, Atmel,.. là nó nói rõ còn hơn nữa.

        3/ Đọc quyển C Primer51. Quyển này cũng hay lắm. Kết hợp vào site www.keil.com.

        Trên đây là một vài điều nho nhỏ mà mình muốn bày tỏ cùng bạn cũng như các bạn mới học.

        Và mình cũng mong rằng ai trả lời hãy trả lời thật chi tiết cho các bạn tránh mơ hồ nhé.

        Chúc các ban thành công. Merry christmas :d.
        Technical sale at WT Microelectronics S'pore
        Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
        Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

        Comment


        • #19
          Nguyên văn bởi gutentag Xem bài viết
          chắc chỉ bốc phét thôi ,nói không phải "sky bỏ qua nhé"
          Không bốc phét đâu! tớ chứng minh đây:
          _ Ngắt có thể hiểu như một bộ quét nội của CPU, việc quét được CPU thực hiện nên sẽ có tốc độ cao.
          _ Nếu tôi không cần tốc độ cao, tôi làm như sau:
          [code:]

          REPEAT:
          JNB ChoNhan, Main_Ext ; Côø haï thì khoâng baét phím
          JB Chon, Main_L1 ; Kieåm tra nhaán phím SEL
          CALL PROC_KB_HIT ; Goïi thuû tuïc haï côø cho pheùp baét phím vaø khôûi taïo boä ñònh thôøi
          CALL PROC_ADJ ; Goïi thuû tuïc thieát laäp thoâng soá
          Main_L1:
          JB OK, Main_L2 ; Kieåm tra nhaán OK
          CALL PROC_KB_HIT ; Goïi thuû tuïc haï côø cho pheùp baét phím vaø khôûi taïo boä ñònh thôøi
          CPL VungXem ; Ñaûo vuøng hieån thò
          JMP Main_Ext ;
          Main_L2:
          JB Tang, Main_L3 ; Kieåm tra nhaán OK
          CALL PROC_KB_HIT ; Goïi thuû tuïc haï côø cho pheùp baét phím vaø khôûi taïo boä ñònh thôøi
          CPL ChoDoiVung ;
          JMP Main_Ext ;
          Main_L3:
          JB Giam, Main_Ext ; Kieåm tra nhaán OK
          CALL PROC_KB_HIT ; Goïi thuû tuïc haï côø cho pheùp baét phím vaø khôûi taïo boä ñònh thôøi
          CPL ChoDoiVung ;
          Main_Ext:
          CALL GTR_PROC ; Goïi thuû tuïc thu thaäp döõ lieäu
          CALL INS_PROC ; Goïi chöông trình kieåm tra
          CALL ALM_PROC ; Goïi thuû tuïc baùo ñoäng
          SJMP REPEAT ; Laëp laïi chöông trình
          [/code]

          Trên đây là tôi viết cho Keydown, nếu các bạn muốn viết KeyUp hay KeyPress thì các bạn phối hợp với cờ nhớ và quét.

          Phương pháp này có những giới hạn là thời gian thực hiện một vòng quét sẽ thay đổi, nên việc tính nó chỉ có thể xác định được khoảng nào thôi.
          Nếu quét LED thì bạn phải chấp nhận kết quả không tốt khi nhấn phím, còn khi chạy ổn định thì không vấn đề gì.

          Tôi post bài này nhằm mục đích chứng minh giải thuật, hoàn toàn không khuyên các bạn dùng phương pháp này để thay thế ngắt vì dùng ngắt là giải pháp tốt nhất.
          Chào đoàn kết.
          Attached Files
          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


          • #20
            hi`hi`, nói tóm lại thế các đại gia như Intel nghiên cứu ra ngắt không phải để chơi!

            Comment


            • #21
              Nguyên văn bởi gutentag Xem bài viết
              chắc chỉ bốc phét thôi ,nói không phải "sky bỏ qua nhé"
              bốc phét là cái chắc khakha
              thế bác biết ý nghĩa của việc sử dụng ngắt là thế nào không mà nói kỳ cục vậy.
              Các bác nói nặng lời rồi.
              Tôi nói thay thế ở đây là trường hợp cụ thể nào đó mà ta có thể làm được. Và các trường hợp đó là do giải thuật của mình nghỉ ra thôi, Nếu các bác không biết thì hỏi tôi trả lời, sao lại nặng lời thế.
              Ví du: Chương trình hiễn thị đồng hồ trên led 7 đoạn dùng phương pháp quét, và có 3 phím tăng, giảm, chức năng:
              Giải thuật: đọc giá trị -> xuất led -> đọc phím -> xử lý phím -> quay lại.
              Tại chương trình đọc phím: Nếu phím nhấn thì ô nhớ nào đó =00h, nha ra thì =01h, trạng thái bình thường là trước khi nhấn =0ffh. Vậy khi xét 1 phím nào đó thì xem trước đó nó là mấy. Nếu =00h thì khi nha phím ra thì cho lên 1. Nếu =0ffh thì khi nhấn vào thì cho là 0.
              Sau đó chương trình xử lý phím thì chỉ xét nếu là 1 thì gọi làm công việc của phím nhấn đó thôi. rồi sau đó đặt lên 0ffh.
              Đây là 1 giải thuật tôi chợt nghi ra thôi, có gì không đồng ý thì các bác tự sưa nhé.
              Nhưng chắc chắn là sẽ có giải thuật thay thế được ngắt ở một phạm vi nhất đinh nào đó.
              Gia su: ở 1 hệ thống chạy với thời gian thực, và xuất led nếu các bác dùng ngắt nhiều quá, mổi lần ngắt thì trê 1 ít thời gian, quá nhiều lần như vậy thì không chấp nhận được.
              Sau này nếu gặp những trường hợp đó thì chắc các bác senho71 đến BIG_SKY.

              Comment


              • #22
                Nguyên văn bởi big_sky Xem bài viết
                Các bác nói nặng lời rồi.
                Gia su: ở 1 hệ thống chạy với thời gian thực, và xuất led nếu các bác dùng ngắt nhiều quá, mổi lần ngắt thì trê 1 ít thời gian, quá nhiều lần như vậy thì không chấp nhận được.
                BIG_SKY.
                Chết chết, bác nên xem lại đoạn này nhé!
                Về nguyên tắc, dùng ngắt hay dùng quét đều mất thời gian thực thi tác vụ như nhau.
                Phương pháp quét sẽ đáp ứng rất chậm nếu tổng số dòng lệnh tăng cao -> mất chính xác.

                Nếu viết thời gian thực bác dùng ngắt mới chính xác được (nếu dùng timer làm đồng hồ), vì như tôi đã nói quét sẽ có thời gian thực hiện thay đổi. (tốt nhất là viết cho Timer0 chạy ở chế độ tự nạp là chính xác nhất)

                Chào đoàn kết.
                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


                • #23
                  Vây nếu có 100 phím nhấn thì sao bác HPECOM?

                  Comment


                  • #24
                    Nguyên văn bởi HPECOM Xem bài viết
                    Phương pháp này có những giới hạn là thời gian thực hiện một vòng quét sẽ thay đổi, nên việc tính nó chỉ có thể xác định được khoảng nào thôi.
                    Nếu quét LED thì bạn phải chấp nhận kết quả không tốt khi nhấn phím, còn khi chạy ổn định thì không vấn đề gì.
                    Mỗi người thì đúng sai hai mặt của nó.
                    Tôi có thể chứng minh dùng các quét không ảnh hưởng đến thời gian thực hiện vòng quét hì sao? Và có thể nhấn phím liên tục mà không ảnh hưởng đến xuất led thì sao? Tức là vừa quét led vừa nhận phím mà không ảnh hưởng đến nhau đấy.

                    Comment


                    • #25
                      Bạn hoàn toàn có thể quét bao nhiêu phím bằng ngắt mà chẳng được mà hoàn toàn không dùng một delay nào bạn ạ.

                      Bạn hãy tư duy theo lập trình có timeout nhé. Mình sẽ dùng ngắt để tạo timer 1ms. Ví dụ cứ sau 100ms thì mình sẽ quét hỏi vòng từng phím một, nếu phím nào bị ấn thì ta set một biến cờ lên. Sau đó, đến ngắt timer tiếp theo chắc khoảng 15ms thì lại quét lại phím vừa có cờ phất lên nếu nó lại là phím ấn thì kết luận nó là phím ấn. Còn không thì chứng tỏ nó k ấn mà do phím bị rung rinh thôi .

                      Còn nếu quyết định là phím giữ (hold) thì lại cho nó thêm 15 hoặc 20ms nữa đi rùi xem lại là quyết định được ngay mà. Các lệnh dụng trong mỗi ngắt đó tốn thòi gian CPU rất ít (kiểm tra xem nhé).

                      Do đó, dù có quét phím hay quét led thì cũng thế, thời gian ngoài kiểm tra phím, hiển thị led sẽ dùng làm các ngắt khác hoặc thực hiện tính toán trong hàm main thôi.

                      Chúc các bạn thành công.
                      Technical sale at WT Microelectronics S'pore
                      Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
                      Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

                      Comment


                      • #26
                        Không bốc phét đâu! tớ chứng minh đây:
                        _ Ngắt có thể hiểu như một bộ quét nội của CPU, việc quét được CPU thực hiện nên sẽ có tốc độ cao.
                        _ Nếu tôi không cần tốc độ cao, tôi làm như sau:
                        Phương pháp này có những giới hạn là thời gian thực hiện một vòng quét sẽ thay đổi, nên việc tính nó chỉ có thể xác định được khoảng nào thôi.
                        Nếu quét LED thì bạn phải chấp nhận kết quả không tốt khi nhấn phím, còn khi chạy ổn định thì không vấn đề gì.

                        Tôi post bài này nhằm mục đích chứng minh giải thuật, hoàn toàn không khuyên các bạn dùng phương pháp này để thay thế ngắt vì dùng ngắt là giải pháp tốt nhất.
                        Chào đoàn kết
                        theo mình thấy thì chươ trình với kĩ thuật lập trình trên thuc ra là sự phân chia thơì gian cho cpu hoat động. ta chi có thể dùng nếu khoảng thời gian thực thi một ctrinh con được gọi ko wa lớn và ...giả sử khi bạn can phải nhận xung kích khởi từ 1 nguồn nào đó , tín hiệu đó rất wan trọng thời gian kích thì rất nhanh nếu bỏ wa chỉ mot tin hiệu sẽ làm hỏng mọi chuyện.neu khi tin hiệu kích xảy ra mà ta đang mải mê trong 1 ctr nao do????????? nói chung là tuy điều kiện cụ thể mà ta có hướg xử lí thích hợp thôi.ta nên "dĩ hòa vi quý" là tốt nhât.

                        Comment


                        • #27
                          Không bốc phét đâu! tớ chứng minh đây:
                          _ Ngắt có thể hiểu như một bộ quét nội của CPU, việc quét được CPU thực hiện nên sẽ có tốc độ cao.
                          _ Nếu tôi không cần tốc độ cao, tôi làm như sau:
                          Phương pháp này có những giới hạn là thời gian thực hiện một vòng quét sẽ thay đổi, nên việc tính nó chỉ có thể xác định được khoảng nào thôi.
                          Nếu quét LED thì bạn phải chấp nhận kết quả không tốt khi nhấn phím, còn khi chạy ổn định thì không vấn đề gì.

                          Tôi post bài này nhằm mục đích chứng minh giải thuật, hoàn toàn không khuyên các bạn dùng phương pháp này để thay thế ngắt vì dùng ngắt là giải pháp tốt nhất.
                          Chào đoàn kết
                          theo mình thấy thì chươ trình với kĩ thuật lập trình trên thuc ra là sự phân chia thơì gian cho cpu hoat động. ta chi có thể dùng nếu khoảng thời gian thực thi một ctrinh con được gọi ko wa lớn và ...giả sử khi bạn can phải nhận xung kích khởi từ 1 nguồn nào đó , tín hiệu đó rất wan trọng thời gian kích thì rất nhanh nếu bỏ wa chỉ mot tin hiệu sẽ làm hỏng mọi chuyện.neu khi tin hiệu kích xảy ra mà ta đang mải mê trong 1 ctr nao do????????? nói chung là tuy điều kiện cụ thể mà ta có hướg xử lí thích hợp thôi.ta nên "dĩ hòa vi quý" là tốt nhât.

                          Comment


                          • #28
                            à mình có nghi ra một cách khác đó là đợi thằng ATmel nó sản xuất ra con 89XX dual core khi đó sẽ có nhiều lựa chọn hơn cho anh em làm điện tử nhỉ! Thân

                            Comment


                            • #29
                              Nguyên văn bởi ngohaibac Xem bài viết
                              Bạn hoàn toàn có thể quét bao nhiêu phím bằng ngắt mà chẳng được mà hoàn toàn không dùng một delay nào bạn ạ.

                              Bạn hãy tư duy theo lập trình có timeout nhé. Mình sẽ dùng ngắt để tạo timer 1ms. Ví dụ cứ sau 100ms thì mình sẽ quét hỏi vòng từng phím một, nếu phím nào bị ấn thì ta set một biến cờ lên. Sau đó, đến ngắt timer tiếp theo chắc khoảng 15ms thì lại quét lại phím vừa có cờ phất lên nếu nó lại là phím ấn thì kết luận nó là phím ấn. Còn không thì chứng tỏ nó k ấn mà do phím bị rung rinh thôi .

                              Còn nếu quyết định là phím giữ (hold) thì lại cho nó thêm 15 hoặc 20ms nữa đi rùi xem lại là quyết định được ngay mà. Các lệnh dụng trong mỗi ngắt đó tốn thòi gian CPU rất ít (kiểm tra xem nhé).
                              Trong trường hợp này thì tôi cũng không dùng ngắt. Tôi tạo 1 timer 1ms, sau 100ms (100 phím) thì quét phím, tức là cứ 100ms phím đó lại được quét nưa, Còn cách nhận biết thì y như bác.
                              Như vậy có phải là đúng lời hứa không dùng ngắt của tôi chứ.

                              Comment


                              • #30
                                Chào bạn, bài của mình mình viết thiếu. Mình tạo ngắt Timer 1ms đó bạn. Còn bạn không cần dùng ngắt mà chỉ dùng trong main thì mình nghĩ rất là khó để có thể tính toán chính xác được thời gian để viết chương trình đó bạn. Bạn có dùng delay không? Nếu không dùng delay thì mới tiết kiệm được thời gian.Và làm cách nào kiểm tra chính xác được thời gian chạy của Timer nếu k delay? Và các sự kiện phát sinh khác thì sao?

                                Nếu được bạn hãy nêu giải thuật và một chương trình kiểm tra phím, vừa quét led cho tớ xem nhé. Mình nghĩ tần số quét của 2 cái này có thể khác nhau tùy vào mình.

                                Mình không tham gia vào vụ cãi nhau đâu. Mình học hỏi bạn thật sự đó. Giúp mình nhé? Biết đâu, đây chính là cách lập trình Multi task trong main nhỉ?? Mình chưa suy nghĩ sâu về giải thuật ở trong Main nên chưa ngộ ra.

                                Chúc các bạn thành công.
                                Technical sale at WT Microelectronics S'pore
                                Hỗ trợ dự án sử dụng các hãng Texas Instrument, STMicro, Freescale, Fairchild, International Rectifier, Ublox, Lumiled, Maxim
                                Liên hệ: 0915.560.511 hoặc ngo.haibac@wtmec.com

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X