Thông báo

Collapse
No announcement yet.

Chủ đề -Nhờ các a.chị đi trước Giải đáp thắc mắc cho newbie khi đọc tài liệu k hiểu

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

  • Chủ đề -Nhờ các a.chị đi trước Giải đáp thắc mắc cho newbie khi đọc tài liệu k hiểu

    Ae newbie khi đọc tài liêu có đoạn nào k hiểu post vào đây nhờ các pro giảng giải cho nhé
    Em xin phép mở màn với 2 câu hỏi về ngắt 8051



    Last edited by coofhair; 18-02-2010, 16:13.

  • #2
    đề nghị bác chủ topic học từ từ , đọc hiểu đến chỗ nào , viết code + nạp board cho chạy thử code , sau đó so sánh (cần thiết thì ghi ra tờ giấy các trừong hợp thử khác nhau) để thấy bản chất vấn đề

    t xin đả thông chút xíu kinh mạch cho bác :
    1) Tài liệu này viết là dành cho ngôn ngữ C ( có lẽ viết trên nền trình dịch Keil C ) . Do đó trình dịch tự xóa cờ ngắt mỗi khi vào phục vụ ngắt . Còn nếu viết = ASM thì k có chiện đó đâu nhá , phải tự xóa cờ ngắt = phần mềm (lệnh clear bit) . Đó chính là lí do vì sao có sự mâu thuẫn . Để chắc ăn , cứ vào phục vụ ngắt là ta xóa các cờ (cả viết C hoặc ASM) . ok roy nhé

    2) ngắt int0 (ngắt ngoài 0) là ngắt ưu tiên cao nhất . Điều đó cũng có nghĩa nếu đang chạy ngắt timer0 mà xảy ra ngắt ngoài 0 , thì chưong trình sẽ nhảy vào phục vụ ngắt ngoài 0 ; sau đó mới thoát ra vô thực hiện tiếp ngắt timer0 . Vì có sự nhảy vào nhảy ra toán loạn như thế , nên khi viết code cần phân bố hợp lí .

    Vd khi đã vào ngắt timer0 roy , k mún xảy ra ngắt nào nữa thì cấm ngắt (IE=0) .

    Cẩn thận với các ngắt nhá , tràn stack là heo en cả lũ

    Comment


    • #3
      Bác đả thế chưa thông ạ
      1-tài liệu này là về cấu trúc phần cứng đương nhiên là viết mã=asm rồi, nhưng khó hiểu 1 cái là tất cả các cờ ngoại trừ nối tiếp,timer2 có tự động xóa khi cpu thực hiện ngắt hay không, nếu nó tự xóa thì ta quan tâm xóa nữa làm gì.....???
      Nếu cái gì cũng để chắc ăn như thế cũng không hẳn là tốt, thừa mã lệnh vô ích, code dài tốc độ chậm đi, khi viết = asm những điều đó làm ta phải tính toán

      2- Nói như bác và theo em đọc ở tài liệu thì đó chỉ là trường hợp 2 ngắt xảy ra đồng thời và CPU xử sự theo cái gọi là ưu tiên cứng
      IE0>TF0>IE1>TF1>RI TI>EF2, EXF2
      Nhưng điều em đang mơ hồ là khi 2 ngắt xảy ra xen kẽ thì sao liên quan giữa ưu tiên cứng và thanh ghi IP do người lập trình đặt thế nào
      Có 1 VD thế này:
      Cho phép 2 ngắt timer0 và cổng nối tiếp (bit tương ứng ở IE=1), EA=1
      đặt các bit trong IP
      PT0=0 PS=1 ( ngắt cổng nối tiếp ưu tiên hơn do mình đặt)

      --------- 2 ngắt cùng xảy ra timer0 thắng (ưu tiên cứng)
      ---------cổng nối tiếp trước, timer0 có xảy ra trong lúc cpu đang xử lý cổng nối tiếp thì timer0 cũng k xen được vào
      ----------Timer0 trước, cpu đang xử lý timer0 xảy ra cổng nối tiếp nó dừng time0 lại chuyển qua cổng nối tiếp, xong tiếp túc timer0
      ----------------------------
      Vậy quá trình ưu tiên ngắt hoàn toàn do mình làm chủ đặt ở thanh ghi IP phải không ạ, thế ở IP tất cả đều bằng 1 và quá trình xảy ra ngắt xen kẽ nhau thì sao ạ, có cái nào chen vào được cái nào k?
      Last edited by coofhair; 19-02-2010, 18:01.

      Comment


      • #4
        Mình xin trả lời bạn, nếu có thiếu sót gì thì mong mọi người bổ sung thêm:
        1. Khi ISR của ngắt được thực thi thì cờ ngắt tương ứng sẽ tự động bị xóa về 0 bằng phần cứng ( ngoại trừ cờ ngắt TI và RI phải được xóa về 0 bằng phần mềm - tức là 2 cờ ngắt của port nối tiếp). Do đó bạn không cần phải thêm câu lệnh xóa cờ ngắt chi cho tốn thời gian thực hiện lệnh, ngoại trừ 2 cờ ngắt của serial.

        2. Khi bạn đã thiết lập cho thanh ghi IP ( tức là ưu tiên ngắt) những ngắt nào được ưu tiên cứng trước sẽ thực hiện trước.
        VD:
        Bạn có 3 ngắt cần thực hiện: ngắt Timer0, ngắt ngoài 0 và ngắt ngoài 1:
        Giả sử cả 3 ngắt cùng xuất hiện 1 lúc:
        Trong thanh ghi IP bạn cho PX0=0 (bit ngắt ngoài 0), PT0=1 (bit ngắt Timer0), PX1=0 (bit ngắt ngoài 1).
        - Do ưu tiên ngắt IP nên ngắt Timer0 được thực thi trước, sau đó tới ngắt ngoài 0, cuối cùng tới ngắt ngoài 1 ( do ưu tiên phần cứng)

        Trường hợp 2: PX0=1, PT0=1, PX1=0
        - Do ưu tiên ngắt IP nên ngắt Timer0 và ngắt ngoài 0 được ưu tiên trước. Lúc này ta lại xét tới ưu tiên cứng, do đó ngắt ngoài 0 được thực hiện trước, sau đó là tới ngắt Timer0, cuối cùng là ngắt ngoài 1.

        Trường hợp 3: PX0=0, PT0=0, PX1=1
        - Lúc này hẳn nhiên là ngắt ngoài 1 được ưu tiên trước, còn lại 2 ngắt kia thì ngắt nào được ưu tiên cứng sẽ thực hiện kế tiếp.

        Mình ví dụ vậy thì chắc bạn có thể hình dung được các trường hợp khác và với các thanh ghi khác phải không?

        Nếu có gì sai mong các bạn khác bổ sung thêm.

        Thân
        "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
        Lê lết, lay lất sống qua ngày! >:)

        Comment


        • #5
          So sánh 1 và 2 của bác BabyKid và 2 vd em trích ra từ tài liệu thì hoàn toàn mâu thuẫn nhau.
          Vậy em biết đâu là đúng đây...........?
          Trích từ tài liệu:
          Vd1:
          Trước khi cho phép ngắt time0 mà time0 đã chạy và tràn(dù là tràn 1 hay nhiều lần) thì cờ TF0=1, nếu sau đó ta cho phép ngắt time0 thì sẽ GÂY RA NGẮT NGAY do cờ tràn đang bằng 1( sự kiện tràn trong trường hợp này là tràn quá khứ, k phải sự kiện ta quan tâm đến) Vì vậy hãy xoa cờ TF0 trước khi cho phép ngắt tràn time0
          Vd2:
          Cho phép 2 ngắt timer0 và cổng nối tiếp (bit tương ứng ở IE=1), EA=1
          đặt các bit trong IP
          PT0=0 PS=1 ( ngắt cổng nối tiếp ưu tiên hơn do mình đặt)

          --------- 2 ngắt cùng xảy ra timer0 thắng (ưu tiên cứng)( Theo bác BabyKid thì serial thắng vì ta đã đặt PS=1 trong IP). Mâu thuẫn chỗ này
          ---------cổng nối tiếp trước, timer0 có xảy ra trong lúc cpu đang xử lý cổng nối tiếp thì timer0 cũng k xen được vào
          ----------Timer0 trước, cpu đang xử lý timer0 xảy ra cổng nối tiếp nó dừng time0 lại chuyển qua cổng nối tiếp, xong tiếp tục quay về xử lý timer0

          Comment


          • #6
            Tài liệu ở đây ạ
            http://dientuvietnam.net/forums/showthread.php?t=2968
            Lam quen voi vi dieu khien 8051 - cau truc phan cung va cach lap trinh phan mem.pdf

            Comment


            • #7
              He he, cái thứ nhất thì mình xin trả lời như vầy.
              Bạn nói rằng trước khi cho phép ngắt timer thì phải xóa cờ TF0 là chính xác, vì phải tránh trường hợp nhận nhầm cờ ngắt do hành động trong quá khứ gây ra. Còn khi bạn đã cho phép ngắt thì sau khi nhận tín hiệu ngắt, MCU sẽ thực hiện ISR và xóa đi cờ ngắt của timer. Có thể do cách viết trong tài liệu làm bạn hiểu nhầm, chứ thật chất là đúng. Bạn phải phân biệt giữa 2 trường hợp trước khi cho phép ngắt và sau khi cho phép ngắt. Trước khi cho phép ngắt thì ta phải tự xóa cờ ngắt, còn sau khi cho phép ngắt thì phần cứng đã lo hộ ta phần xóa cờ ngắt rồi.

              Còn phần thứ 2 thì mình cũng không biết cách giải thích cho bạn sao nữa. Chứ trong lúc học thì thầy của mình đã nói vậy, mà mình làm thực tế thì cũng thấy như vậy.

              Còn hông thì bạn có thể viết 1 đoạn code để kiểm tra lại các ngắt, cách phần cứng thực hiện ưu tiên ngắt như thế nào. Chỉ có cách thể hiện thực tế là cho ta rõ nhất.
              Last edited by BabyKid; 19-02-2010, 21:56.
              "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
              Lê lết, lay lất sống qua ngày! >:)

              Comment


              • #8
                Nguyên văn bởi coofhair Xem bài viết
                Bác đả thế chưa thông ạ
                1-tài liệu này là về cấu trúc phần cứng đương nhiên là viết mã=asm rồi, nhưng khó hiểu 1 cái là tất cả các cờ ngoại trừ nối tiếp,timer2 có tự động xóa khi cpu thực hiện ngắt hay không, nếu nó tự xóa thì ta quan tâm xóa nữa làm gì.....???
                Nếu cái gì cũng để chắc ăn như thế cũng không hẳn là tốt, thừa mã lệnh vô ích, code dài tốc độ chậm đi, khi viết = asm những điều đó làm ta phải tính toán

                2- Nói như bác và theo em đọc ở tài liệu thì đó chỉ là trường hợp 2 ngắt xảy ra đồng thời và CPU xử sự theo cái gọi là ưu tiên cứng
                IE0>TF0>IE1>TF1>RI TI>EF2, EXF2
                Nhưng điều em đang mơ hồ là khi 2 ngắt xảy ra xen kẽ thì sao liên quan giữa ưu tiên cứng và thanh ghi IP do người lập trình đặt thế nào
                Có 1 VD thế này:
                Cho phép 2 ngắt timer0 và cổng nối tiếp (bit tương ứng ở IE=1), EA=1
                đặt các bit trong IP
                PT0=0 PS=1 ( ngắt cổng nối tiếp ưu tiên hơn do mình đặt)

                --------- 2 ngắt cùng xảy ra timer0 thắng (ưu tiên cứng)
                ---------cổng nối tiếp trước, timer0 có xảy ra trong lúc cpu đang xử lý cổng nối tiếp thì timer0 cũng k xen được vào
                ----------Timer0 trước, cpu đang xử lý timer0 xảy ra cổng nối tiếp nó dừng time0 lại chuyển qua cổng nối tiếp, xong tiếp túc timer0
                ----------------------------
                Vậy quá trình ưu tiên ngắt hoàn toàn do mình làm chủ đặt ở thanh ghi IP phải không ạ, thế ở IP tất cả đều bằng 1 và quá trình xảy ra ngắt xen kẽ nhau thì sao ạ, có cái nào chen vào được cái nào k?

                đúng là bác này bị mấy thầy ở trường tung hỏa mù ..nên hơi rối mù ...

                1) Tốc độ VDK của bác là bao nhiu , tính = micro giây đó nhá ... ==> bác có mất hàng trăm lần chỉ cho việc xóa cờ , roy delay thêm 100us cũng chẳng xi nhê j , huống hồ là vào trình ngắt ta xóa cờ để cho chắc . Encoder quay , sensor liên tục đọc ... thế mà tui vẫn còn thời gian delay 10ms cho việc chống nảy (nếu chạm công tắc hành trình) . Với 10ms = 10 000us = 10 000 lệnh như thế thì hóa ra bác lói t làm cho code chậm lại ah .....xin thưa , k có j là code thừa và vô ích cả

                Hỏi thử giữa việc chắn chắc và mơ hồ thì bác nên chọn phưong án nào ....với 1 ng chưa nắm rõ ngắt như bác

                t đã lưu ý bác roy ... rất may là tài liệu bác đọc nói về phần cứng viết = ASM nên vô tình u đúng , k có nghĩa cứ mổ xẻ phần cứng VDK là bắt buộc phải dùng ASM .

                2) Nếu k khai báo , k bật bit nào trong thanh ưu tiên ngắt IP ,thì thứ tự là ngắt ngoài 0 > timer0>ngắt ngoài 1> timer1...
                Còn nếu khai báo ưu tiên ngắt ,
                vd ngắt nối tiếp > ngắt timer 0 . thì khi ngắt timer 0 đang hoạt động , nếu có ngắt nt xảy ra , VDK sẽ thực hiện code của ngắt nt ; sau đó mới tiếp tục ngắt timer0 .
                Còn nếu ngắt nt đang hoạt động mà có ngắt timer 0 thì ngắt nt vẫn hoạt động . Hết thì chuyển sang phục vụ ngắt timer 0 .

                Bác có hỏi quá trình ngắt đang xen nhau ???? Vậy thì thực hiện ngắt làm chi cho tràn stack , trong hàm main ( ) của u làm chi ???? Đưa tất cả ra hàm main () , hỏi vòng hết .... Chỉ thực sự dùng ngắt khi cần thực hiện gần như // 2 công việc .
                Nếu bí quá , dùng nhìu ngắt thì cẩn thận , vô trình ngắt nào , cấm ngắt hết toàn bộ , xử lí xong mới bật lại ngắt . Nếu không , ngắt chồng ngắt thì tràn stack chắc cú

                Comment


                • #9
                  Thank các bác ạ, vây là vd này trog tài liệu phải sửa lại cho đúng Vd: cho phép timer0, serial. Đặt PT0=0, PS=1, Khi 2 ngắt xảy ra đồng thời ngắt timer0 thắng. Phải được sửa lại là “ngắt serial thắng“. E bị hỏa mù là do cái vd này

                  Comment


                  • #10
                    Hà hà, đã đụng tới VĐK thì phải làm song song vừa lý thuyết, vừa thực hành mới khá được. Có nhiều lúc trong lý thuyết nói thế này mà khi ra làm trên mạch thực tế lại không như vậy. Có học phải có hành, hành xong lại học tiếp
                    "Cái quý nhất của con người ta là sự sống. Đời người chỉ sống có một lần.Phải sống sao cho khỏi xót xa ân hận..."
                    Lê lết, lay lất sống qua ngày! >:)

                    Comment


                    • #11
                      chà chủ topic này coi bộ có duyên nhỉ, được toàn cao nhân chỉ điểm không hà.
                      kiểu nào rồi cũng thành cao thủ thôi (giống Quách Tỉnh)

                      Comment


                      • #12
                        Nguyên văn bởi tranpic Xem bài viết
                        chà chủ topic này coi bộ có duyên nhỉ, được toàn cao nhân chỉ điểm không hà.
                        kiểu nào rồi cũng thành cao thủ thôi (giống Quách Tỉnh)
                        k dám k dám....bác Dương Khang lại nhà ạ
                        Last edited by coofhair; 21-02-2010, 21:02.

                        Comment


                        • #13
                          Nguyên văn bởi tranpic Xem bài viết
                          chà chủ topic này coi bộ có duyên nhỉ, được toàn cao nhân chỉ điểm không hà.
                          kiểu nào rồi cũng thành cao thủ thôi (giống Quách Tỉnh)
                          k dám k dám....bác Dương Khang lại nhà ạ, em có trâu bò 1 tí nhưng thật thà k giấu dốt bác ợ, con đường nào rồi cũng về Hn nhưng nếu có người đi trước chỉ cho cái họ đã đi qua thì mình sẽ đi nhanh hơn...đơn giản thôi nhỉ

                          Comment


                          • #14
                            theo em thi nên tìm một chương trình cụ thể rồi chịu khó ngồi phân tích chổ nào ko hieu thi hopi nhu vay de hoc hơn. ngồi dọc chay ly thuyet thi con lau moi nho duoc.
                            " Muốn biết phải hỏi, muốn giỏi phải học "

                            Comment


                            • #15
                              Phải làm một việc cụ thể rồi viết ứng dụng thì mới nhanh hiểu.

                              Comment

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X