Ngắt onchange RB với PIC16F877A

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • exellence
    Thành viên chính thức
    • Aug 2010
    • 56

    #1

    Ngắt onchange RB với PIC16F877A

    E làm ngắt Rb bằng con Pic16f877a thì nó bị ngắt liên tục mặc dù đã xóa cờ ngắt, cứ ấn nút cái là nó xảy ra ngắt liên tục, ko hiểu cách khắc phục kiều gì. theo e là chip nó ngắt liên tục do nó thầy RB có sự thay đổi liên tục. các bác giúp em với

    Code:
    #include <16f877A.h>
    #device *= 16  ADC = 8
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #byte intcon=0x000B
    #bit RBIF=intcon.0 //dinh nghia co ngat RB
    #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #INT_RB
    void ngat_RB()
    {
    if((RBIF)&&(RBIE)) 
    {
    output_e(0b001);
    output_e(0b101);
    }
    RBIF=0;
    }
    
    void main() 
    { 
    SET_TRIS_B(0b11111111);
    SET_TRIS_A(0b111111);
    SET_TRIS_E(0b000);
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RB|H_TO_L);
    while(1) 
       {
       output_e(0b000);
       }
    }
  • sang_dientu
    Thành viên tích cực
    • Oct 2009
    • 1563

    #2
    Nguyên văn bởi exellence Xem bài viết
    E làm ngắt Rb bằng con Pic16f877a thì nó bị ngắt liên tục mặc dù đã xóa cờ ngắt, cứ ấn nút cái là nó xảy ra ngắt liên tục, ko hiểu cách khắc phục kiều gì. theo e là chip nó ngắt liên tục do nó thầy RB có sự thay đổi liên tục. các bác giúp em với

    Code:
    #include <16f877A.h>
    #device *= 16  ADC = 8
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #byte intcon=0x000B
    #bit RBIF=intcon.0 //dinh nghia co ngat RB
    #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #INT_RB
    void ngat_RB()
    {
    if((RBIF)&&(RBIE)) 
    {
    output_e(0b001);
    output_e(0b101);
    }
    RBIF=0;
    }
    
    void main() 
    { 
    SET_TRIS_B(0b11111111);
    SET_TRIS_A(0b111111);
    SET_TRIS_E(0b000);
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RB|H_TO_L);
    while(1) 
       {
       output_e(0b000);
       }
    }
    bạn nên cho nó chống rung nữa
    email:
    chỉ được liên lạc từ 19h00 - 21h30



    Comment

    • e_fan
      Thành viên tích cực
      • Oct 2006
      • 105

      #3
      Bạn lấy đầu vào ngắt qua 1 phím bấm nhưng không có phần xử lý chống rung cho phím,search trên forum về cách xử lý chống rung cho phím bấm nhá.

      Comment

      • ksclc07i
        Thành viên chính thức
        • Jul 2011
        • 44

        #4
        Bạn thử code này xem
        Code:
        #use delay(clock=20000000)
        #use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
        #include <def_877A.h>
        
        /*** Khai bao cac ngat ***/
        //Ngat Ngoai - RB0
        #int_EXT
        void EXT_isr(void) 
        {
        
        }
        //Ngat RB - Ngat tu ban phim 
        #int_RB
        void RB_isr(void) 
        {
           if(!rb4) //Chan RB4
           {
        
              return;
           }
           if(!rb5)//RB5
           {
        
              return;
           }
           if(!rb6)//RB6
           {
        
              return;
           }
           if(!rb7)//RB7
           {
        
           }
        }
        
        
        /*** Chuong trinh chinh ***/
        //Chuong trinh khoi tao
        void init(void)
        {
           
           EXT_INT_EDGE(H_TO_L);      //Ngat ngoai khi co suon xuong
           enable_interrupts(INT_RB); //Cho phep ngat RB4:RB7
           enable_interrupts(INT_EXT);//Cho phep ngat ngoai RB0
           enable_interrupts(GLOBAL); //Cho phep ngat
        }
        
        /*** Khai bao chuong trinh con ***/
        void main()
        {     
           init();
           while(true)
           { 
            
           }
        }

        Comment

        • duong_act
          Thành viên tích cực
          • Nov 2008
          • 4903

          #5
          Bạn nên đọc PORTB khi có ngắt.

          Comment

          • exellence
            Thành viên chính thức
            • Aug 2010
            • 56

            #6
            Nguyên văn bởi duong_act Xem bài viết
            Bạn nên đọc PORTB khi có ngắt.
            e không hiểu. đọc đề làm gì hả a. a nó rõ hơn dc ko

            Comment

            • exellence
              Thành viên chính thức
              • Aug 2010
              • 56

              #7
              Nguyên văn bởi e_fan Xem bài viết
              Bạn lấy đầu vào ngắt qua 1 phím bấm nhưng không có phần xử lý chống rung cho phím,search trên forum về cách xử lý chống rung cho phím bấm nhá.
              m nghĩ đây là ngắt cứng chứ ko phải ngắt mềm nên ko cần chống rung phím

              Comment

              • minh_cly
                Thành viên tích cực
                • Mar 2011
                • 595

                #8
                Một nút bấm khi bạn bấm ko phải là tạo ra 1 xung, có thể tạo ra hàng chục xung vì nút nhấn khi nhấn xuống cũng ko phải tiếp xúc hoàn toàn, nó cũg gồ ghề, lồi lõm, có lúc dẫn có lúc ko (nhưng phần lớn là dẫn), nên phải phải chống rung nữa, chỉ khi ngắt RB của bạn nối vs các lk điện tử ko phải là nút nhấn thì lúc đó ngắt RB mới chíng xác.
                Computer Science major - Vietnamese-German University
                Sponsored by

                Comment

                • exellence
                  Thành viên chính thức
                  • Aug 2010
                  • 56

                  #9
                  mình đã thử chống rung rồi vẫn ko dc. nó bị chết trong chương trình ngắt ko thoát ra dc

                  Comment

                  • tan955
                    Thành viên chính thức
                    • Jul 2012
                    • 70

                    #10
                    sao lại xóa cờ ngắt vì mấy cái ngắt cứng nó tự xóa mà ! bạn xóa hết những lệnh tào lao trong ngắt xem sao
                    còn nữa
                    while(1)
                    {
                    output_e(0b000);
                    }
                    bạn luôn xóa Porte mà ;
                    nên như thế lày xem
                    output_e(0b000);
                    while(1)
                    {

                    }
                    lập trình vi điều khiển 8051 - avr - pic- thiết kế mạch điện tử

                    Học Hiểu Nguyên Tắc - Tuân Theo Nguyên Tắc - Giải Trừ Nguyên Tắc

                    Comment

                    • tan955
                      Thành viên chính thức
                      • Jul 2012
                      • 70

                      #11
                      còn trong ngắt thì nên như này
                      void ngat_RB()
                      {
                      static int8 test;
                      output_e(test++);

                      }
                      lập trình vi điều khiển 8051 - avr - pic- thiết kế mạch điện tử

                      Học Hiểu Nguyên Tắc - Tuân Theo Nguyên Tắc - Giải Trừ Nguyên Tắc

                      Comment

                      • hoang_3i
                        Thành viên tích cực
                        • Jun 2012
                        • 455

                        #12
                        Nguyên văn bởi exellence Xem bài viết
                        mình đã thử chống rung rồi vẫn ko dc. nó bị chết trong chương trình ngắt ko thoát ra dc
                        1.Bệnh này không phải do rung. Giả sử có rung thì rung 1 lúc rồi cũng phải thoát ra khỏi ngắt chứ đúng không?.

                        2. chương trình của bạn chết dí trong ngắt -> hãy đặt câu hỏi tại sao?. chỉ có 1 lý do duy nhất đó là luôn có sự thay đổi trên 1 trong các chân từ RB4 -> RB7.

                        3. thuốc chữa rất đơn giản là trên các chân từ RB4 -> RB7 bạn hãy nối 1 con trở 10K với dương nguồn, hoặc nối xuống đất.
                        (^_^) hoangnv.3i@gmail.com

                        Comment

                        • ksclc07i
                          Thành viên chính thức
                          • Jul 2011
                          • 44

                          #13
                          Bạn xem file này nhé, mình mô phỏng và chạy thật rội
                          rb.rar

                          Comment

                          • duong_act
                            Thành viên tích cực
                            • Nov 2008
                            • 4903

                            #14
                            Đây là 1 đoạn chương trình mình viết bằng CCS với chức năng đếm số lần ấn nút rồi hiển thị ra PORTD:
                            Code:
                            #include <16F877A.h>
                            #fuses hs
                            #ocs 20M
                            
                            int m=0;
                            
                            #int_rb
                            void rb_isr(int temp)
                            {
                               temp=input_b();   // Doc PORTB
                               if(input(PIN_B5)==1){    // Nut duoc nhan se co muc LOGIC la 1.
                               m++;
                               output_d(m);}
                            }
                            
                            void main()
                            {
                               enable_interrupts(global);
                               enable_interrupts(int_rb);
                               set_tris_b(0xF0);
                               set_tris_d(0x00);
                               output_d(0x00);
                               while(true)
                               {
                               }
                            }

                            Comment

                            Về tác giả

                            Collapse

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

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

                            Collapse

                            Đang tải...