Thông báo

Collapse
No announcement yet.

Ngắt onchange RB với PIC16F877A

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

  • 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);
       }
    }

  • #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


    • #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


      • #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


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

          Comment


          • #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


            • #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


              • #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


                • #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


                  • #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


                    • #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


                      • #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


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

                          Comment


                          • #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...
                            X