Thông báo

Collapse
No announcement yet.

vấn đề ưu tiên ngắt của pic 18f trong mikroC

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

  • vấn đề ưu tiên ngắt của pic 18f trong mikroC

    Mình có 1 đoạn code trong thư viện mikroc viết như sau:
    Code:
    void interrupt(void){           //high priority interrupt routine
     GIE_bit = 0;                   //disable global interrupts
     if (INT0IF_bit){               //if interrupt on RB0/INT0 pin
            xu ly A.....
          }
        }
        INT0IF_bit = 0;             //clear flag bit
      }
      GIE_bit = 1;                  //enable interrupts
    }
    
    void interrupt_low(void){      //low priority interrupt routine
       GIE_bit = 0;                 //disable global interrupts
       if (TMR0IF_bit){   //if TMR0 overflow interrupt
        TMR0H         = 0x0B;
        TMR0L         = 0xDC;
         xu ly B....
    
        TMR0IF_bit = 0;            //clear overflow flag bit
      }
      
        GIE_bit = 1;                 //enable interrupts
    }
    ++các bạn để ý phần màu đỏ và xanh.nếu GIE_bit = 0; thì mình hiểu là các ngắt khác bị dis hết (gồm ngắt adc,timer.....)
    như vậy thì ko hợp lý lắm.
    ++ngoài ra nếu phần màu xanh GIE_bit = 0; thì nó sẽ thực hiện xong phần( void interrupt_low(void) rồi mới đến phần (void interrupt(hight)) ) dù cho tại lúc đang thực hien ( void interrupt_low(void) có ngắt ở (void interrupt(hight))xen vào
    như vậy vô hình dung ngắt ưu tiên ko có tác dụng . mà chỉ là ngắt lần lượt.
    các bạn có kinh nghiệm sử dụng mikro for pic cho góp ý cho mình với để thực hiện được chức năng ngắt ưu tiên trong pic18.

    thank you!

  • #2
    1 chu kì máy bao gồm nhiều pha đọc lệnh, xử lý lệnh...v...v.. và pha kiểm tra ngắt. Khi cpu đang ở pha kiểm tra ngắt, nếu đồng thời có nhiều cờ ngắt đang treo thì nó sẽ ưu tiên thực hiện ngắt nào có độ ưu tiên cao hơn. Khi CPU thực hiện ngắt nào thì cờ ngắt đó tự động bị xóa, nhưng các cờ ngắt khác vẫn còn nguyên giá trị, do đó nếu như trong hàm ngắt không thực hiện globe_interrups_enable = 0 thì sẽ xảy ra tình trạng ngắt trong ngắt. Nếu không thể chắc chắn rằng khi đang thực hiện ngắt này thì ngắt khác xảy ra, tốt hơn hết là nên globe_interrups_enable = 0, nếu không chương trình nó sẽ chạy loạn, kết quả ra bị sai.

    Comment


    • #3
      Nguyên văn bởi NinoNguyen_ Xem bài viết
      1 chu kì máy bao gồm nhiều pha đọc lệnh, xử lý lệnh...v...v.. và pha kiểm tra ngắt. Khi cpu đang ở pha kiểm tra ngắt, nếu đồng thời có nhiều cờ ngắt đang treo thì nó sẽ ưu tiên thực hiện ngắt nào có độ ưu tiên cao hơn
      Mình giả sử nhé:
      ***KHAI NIỆM NGẮT ƯU TIÊN ( mình sử dụng pic18 mới có chức năng này. còn pic16 ko có chức năng này)
      +Nếu A là ngắt ưu tiên ,B là ngắt ko ưu tiên thì khi đang xử lý ngắt B mà có ngắt ở A. thì con trỏ chuơng trình sẽ ưu tiên nhảy vào xử lý ngắt A xong rùi mới quay lại xử lý ngắt B tiếp.
      ***YÊU CẦU BÀI TOÁN:
      +Ngắt ưu tiên là :UART ( khi vào ngắt UART thì globe_interrups_enable = 0 và khi thực hiện xong ngắt UART thì globe_interrups_enable = 1)
      +ngắt ko ưu tiên là :TIMER1(khi vào ngắt TIMER1 thì globe_interrups_enable = 0 và khi thực hiện xong ngắt TIMER thì globe_interrups_enable = 1)
      ***TÌNH HUỐNG:
      + khi chuơng trình nhảy vào ngắt không ưu tiên TIMER1 thì globe_interrups_enable = 0. có nghĩa là tất cả các ngắt khác đều bị disable bao gồm cả ngắt ưu tiên UART
      =>sai với KHÁI NIỆM NGẮT ƯU ở trên.
      Nguyên văn bởi NinoNguyen_ Xem bài viết
      Nếu không thể chắc chắn rằng khi đang thực hiện ngắt này thì ngắt khác xảy ra, tốt hơn hết là nên globe_interrups_enable = 0, nếu không chương trình nó sẽ chạy loạn, kết quả ra bị sai
      Mình nghĩ pic18 có rất nhiều ngắt cả on chip và ngoại vi.nếu thực hiện nhiều tác vụ 1 lúc thì sẽ có nhiều cờ ngắt dựng lên cùng 1 lúc.
      có ngắt thì mình đặt trong chuơng trình ngắt có cái thì ko đặt chuơng ở chuơng trình ngắt mà lại sử dụng cách hỏi vòng.
      nếu trong chuơng trình ngắt mà globe_interrups_enable = 0. thì tất cả các ngoại vi của mình dừng lại hết kể cả những ngoại vi hỏi vòng.... đó là điều ko mong muốn

      Comment


      • #4
        Điều khiển ngắt là cách làm khéo léo , thường trong hàm ngắt chỉ để các cờ hoặc các biến đếm ( có tốc độ , thao tác xử lý nhanh ) .... Chứ chẳng thằng nào tương cả chương trình xử lý to đùng vào đó ( trừ những ông không biết lập trình ) !

        --- Mỗi nguồn ngắt đều có cách khống chế riêng , ta khống chế từ nguồn ngắt ( bit enable ) VD như ngắt ngoài có INT0IE , ngắt timer thì có "Timer on"
        VD: TMR1ON_bit=0; ===> timer hết chạy ===> các ngắt ưu tiên khác vẫn ngắt như thường !
        chứ chẳng thằng nào muốn xử lý nhiều ngắt lại đi " khóa " ngắt toàn cục GIE_bit ( thì coi như cắt tất ... còn đâu mà ngắt khác )!

        --- Muốn ưu tiên ngắt thì phải tác động vào bit ưu tiên , enable nó : IPEN_bit =1; hay RCON.IPEN=1;
        các sự kiện có liên quan đến thời gian trễ dài như UART , Timer thường đặt ở Low level .
        Khi lập trình thì cứ cái nào có delay lớn phải để ở ngắt mức thấp thơn . VD chỉ có ngắt Timer và UART thì timer nên đặt mức ưu tiên cao , UART mức thấp.

        vì sao thì khi làm nhiều sẽ đúc rút ra kinh nghiệm ! Các ngắt ngoài được cpu mặc định ưu tiên hơn cả .
        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

        Comment


        • #5
          Việc để xảy ra ngắt trong ngắt là việc không mang muốn. Tuy nhiên ngắt có mức ưu tiên cao hơn chưa chắc đã là ngắt chiếm ít thời gian thực hiện hơn. Thế nên việc quản lý ngắt là tương đối khó. Có thể phải hi sinh cái nó để được cái kia. Còn để giải thích cho bạn octo, bạn đem 1 cái ví dụ ra rồi dựa vào đó để nói là
          =>sai với KHÁI NIỆM NGẮT ƯU ở trên.
          tôi cũng đến chịu bạn. Người lập trình là người quyết định chương trình sẽ chạy như thế nào, thử hỏi bạn nếu không có các dòng lệnh xanh đỏ ở trên thì chương trình sẽ thế nào? Cái dòng lênh xanh đỏ đó là do nhà sản xuất viết vào, còn về phần bạn, bạn có viết vào chương trình của mình không?

          Comment


          • #6
            Nguyên văn bởi queduong Xem bài viết
            Điều khiển ngắt là cách làm khéo léo , thường trong hàm ngắt chỉ để các cờ hoặc các biến đếm ( có tốc độ , thao tác xử lý nhanh ) .... Chứ chẳng thằng nào tương cả chương trình xử lý to đùng vào đó ( trừ những ông không biết lập trình ) !

            --- Mỗi nguồn ngắt đều có cách khống chế riêng , ta khống chế từ nguồn ngắt ( bit enable ) VD như ngắt ngoài có INT0IE , ngắt timer thì có "Timer on"
            VD: TMR1ON_bit=0; ===> timer hết chạy ===> các ngắt ưu tiên khác vẫn ngắt như thường !
            chứ chẳng thằng nào muốn xử lý nhiều ngắt lại đi " khóa " ngắt toàn cục GIE_bit ( thì coi như cắt tất ... còn đâu mà ngắt khác )!

            --- Muốn ưu tiên ngắt thì phải tác động vào bit ưu tiên , enable nó : IPEN_bit =1; hay RCON.IPEN=1;
            các sự kiện có liên quan đến thời gian trễ dài như UART , Timer thường đặt ở Low level .
            Khi lập trình thì cứ cái nào có delay lớn phải để ở ngắt mức thấp thơn . VD chỉ có ngắt Timer và UART thì timer nên đặt mức ưu tiên cao , UART mức thấp.

            vì sao thì khi làm nhiều sẽ đúc rút ra kinh nghiệm ! Các ngắt ngoài được cpu mặc định ưu tiên hơn cả .
            bác xem bố cục sử dụng 2 ngắt trong đó có ngắt ưu tiên và không ưu tiên trong trường hợp nào là chuẩn:
            +TRƯỜNG HỢP A:Có sử dụng GIE_bit khóa toàn cục ( cái này thì mình tham khảo ở trang mikroc)
            void interrupt(void){ //high priority interrupt routine
            GIE_bit = 0; //disable global interrupts
            xu ly ngay A1,A2................
            GIE_bit = 1; //enable interrupts
            }
            void interrupt_low(void){ //low priority interrupt routine
            GIE_bit = 0; //disable global interrupts
            xu ly ngay A3,A4................
            GIE_bit = 1; //enable interrupts
            }
            +TRƯỜNG HỢP B: ko sử dụng khóa toàn cục
            void interrupt(void){ //high priority interrupt routine

            xu ly ngay B1,B2................

            }
            void interrupt_low(void){ //low priority interrupt routine

            xu ly ngay B3,B4................

            }

            vậy 1 fom chuẩn cho sử dụng 2 ngắt trong đó có ngắt ưu tiên và không ưu tiên trong cùng 1 chương trình thì mình sử dụng trường hợp A hay B?
            +theo như các bác thì sẽ là B
            +còn theo như tài liệu tham khảo mikroc là A.
            vậy chọn cái nào?

            Comment


            • #7
              Nguyên văn bởi NinoNguyen_ Xem bài viết
              Việc để xảy ra ngắt trong ngắt là việc không mang muốn. Tuy nhiên ngắt có mức ưu tiên cao hơn chưa chắc đã là ngắt chiếm ít thời gian thực hiện hơn. Thế nên việc quản lý ngắt là tương đối khó. Có thể phải hi sinh cái nó để được cái kia. Còn để giải thích cho bạn octo, bạn đem 1 cái ví dụ ra rồi dựa vào đó để nói là tôi cũng đến chịu bạn. Người lập trình là người quyết định chương trình sẽ chạy như thế nào, thử hỏi bạn nếu không có các dòng lệnh xanh đỏ ở trên thì chương trình sẽ thế nào? Cái dòng lênh xanh đỏ đó là do nhà sản xuất viết vào, còn về phần bạn, bạn có viết vào chương trình của mình không?
              Mình chỉ bảo là nếu sử dụng khóa toàn cục GIE_bit = 0; trong chương trình ngắt thì sẽ là disalibe tất cả các ngắt khác dẫn đến ko còn cái nào ưu tiên nữa vì phải thưc hiện xong nó mới bật lại GIE_bit = 1; cho các ngắt khác.
              mình chỉ phân vân giữa có sử dụng bít khóa toàn cục GIE_bit trong chương trình ngắt hay ko thui?

              Comment


              • #8
                Mình chỉ bảo là nếu sử dụng khóa toàn cục GIE_bit = 0; trong chương trình ngắt thì sẽ là disalibe tất cả các ngắt khác dẫn đến ko còn cái nào ưu tiên nữa vì phải thưc hiện xong nó mới bật lại GIE_bit = 1; cho các ngắt khác.
                mình chỉ phân vân giữa có sử dụng bít khóa toàn cục GIE_bit trong chương trình ngắt hay ko thui?
                À cái này do người lập trình tự quyết định. Phải chủ động viết code chứ đừng dập khuôn máy móc bạn ạ.

                Comment


                • #9
                  Câu trả lời đã có ở bài #4 rồi !
                  Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

                  Comment


                  • #10
                    Vậy chốt lại chủ điểm là sử dụng phuơng án B
                    nếu bạn nào phân vân như mình thì hãy chọn phuơng án B nhé.
                    cám ơn mọi người đã quan tâm

                    Comment

                    Về tác giả

                    Collapse

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

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

                    Collapse

                    Đang tải...
                    X