Thông báo

Collapse
No announcement yet.

Vấn đề về ngắt RB

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

  • Vấn đề về ngắt RB

    Em viết chương trình cho nút bấm RB4-RB7 hiển thị led từ con 1 đến 8 dùng ngắt RB
    Nhưng mô phỏng thì ok nhưng khi nạp vào mạch thật thì không chạy được. Em đã kiểm tra lại các nút bấm bằng cách cho nút bấm vào portD thì lại được. Lần này bí quá mong anh em giúp đỡ với.


    #include <16f887.h>
    #fuses XT,NOLVP,NOWDT
    #use delay(clock=4000000)
    #use fast_io(b)
    #use fast_io(d)
    #byte portB=0x06
    #byte portC=0x07
    #byte portD=0x08
    #byte intcon=0x000B
    #bit RD0=portd.0
    #bit RD1=portd.1
    #bit RD2=portd.2
    #bit RD3=portd.3

    #bit RB4=portB.4
    #bit RB5=portB.5
    #bit RB6=portB.6
    #bit RB7=portB.7
    #bit RBIF=intcon.0 //dinh nghia co ngat RB
    #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
    byte CONST so[] = {1,2,4,8,16,32,64,128,255};
    int8 n=0,dv=0,hc=0;

    #INT_RB
    void ngat_RB()
    {
    if((RBIF)&&(RBIE)) {
    if (RB4==0) {if (n<7) {n=n+1;}}
    if (RB5==0) {if (n>0) {n=n-1;}}
    if (RB6==0) {n=8;}



    }
    RBIF=0;
    }



    void main()
    {
    enable_interrupts(global);
    enable_interrupts(int_RB);//Cho phep ngat RB
    ext_int_edge(H_to_L);
    set_tris_D(0x00);
    set_tris_B(0xFF);
    while (1) {
    output_D(so[n]);
    delay_ms(200);
    output_D(0);
    delay_ms(200);

    }
    }

  • #2
    Nguyên văn bởi emperordx Xem bài viết
    Em viết chương trình cho nút bấm RB4-RB7 hiển thị led từ con 1 đến 8 dùng ngắt RB
    Nhưng mô phỏng thì ok nhưng khi nạp vào mạch thật thì không chạy được. Em đã kiểm tra lại các nút bấm bằng cách cho nút bấm vào portD thì lại được. Lần này bí quá mong anh em giúp đỡ với.
    các chân bạn có nối trở lên Vcc ko
    email:
    chỉ được liên lạc từ 19h00 - 21h30



    Comment


    • #3
      Nguyên văn bởi sang_dientu Xem bài viết
      các chân bạn có nối trở lên Vcc ko
      Các chân port B đều có pull up nội (bit 7 <RBPU> của thanh ghi OPTION). Bạn nên set cái đó.
      Còn không bạn có thể dùng polling thay cho ngắt.
      Computer Science major - Vietnamese-German University
      Sponsored by

      Comment


      • #4
        coi đúng dao động với mạch thật chưa nếu đúng rùi coi lại coi RB treo trở chưa!
        email
        nick: bangbigboy_bigboy
        sdt :01203380789

        Comment


        • #5
          Nguyên văn bởi hieuthai2011 Xem bài viết
          coi đúng dao động với mạch thật chưa nếu đúng rùi coi lại coi RB treo trở chưa!
          Em đã kiểm tra kỹ lắm rồi.Mô phỏng em test thì đúng, nút bấm trong mạch thật ko có gì sai vì đã đem thử ở portD


          Các chân port B đều có pull up nội (bit 7 <RBPU> của thanh ghi OPTION). Bạn nên set cái đó.
          Còn không bạn có thể dùng polling thay cho ngắt.
          là sao bác?? cái này em chưa hiểu lắm và cũng chưa từng nghe tới, bác giải thích hộ em với nhé, em làm hoài cái ngắt mà ko đc, chán quá

          Comment


          • #6
            Nguyên văn bởi emperordx Xem bài viết
            Em đã kiểm tra kỹ lắm rồi.Mô phỏng em test thì đúng, nút bấm trong mạch thật ko có gì sai vì đã đem thử ở portD

            ngăt nó khoang hoang toàn với input bình thường bạn à. bạn xem thử khai báo đầy đủ ngắt chưa. và PIC có chạy không. hay bị đứng ở đâu đó. coi thử cờ ngắt có được bật xuống không.

            (vì mình dùng HTpic nên không rỏ code ni lắm)
            email:
            chỉ được liên lạc từ 19h00 - 21h30



            Comment


            • #7
              Đây là một trong nhiều lý do khiến việc mô phỏng chả có ý nghĩa gì : một thiết kế có thể chạy mô phỏng tốt nhưng khác xa datasheet, khác xa thực tế, tất nhiên không chạy thực.

              Thứ nhất, nếu vẫn cắm mạch nạp ở RB7 và RB6 thì 2 sợi này không chạy input được, phải rút hẳn mạch nạp ra.

              Thứ nhì, RB5 và RB4 có tính năng AN, khi đặt cổng B là input thì tự động chúng trở thành analog input. Phải đặt chúng là digital input bằng cách can thiệp vào thanh ghi ANSELH tắt chức năng analog ở sợi cổng đi.

              Thứ ba, phải treo trở bên ngoài cổng lên VCC hoặc bật tính năng weak pull up cho cổng thì chạy mới đúng được.
              Phần mềm tự do hoặc không dùng máy tính nữa !.

              Comment


              • #8
                Nguyên văn bởi bqviet Xem bài viết
                Đây là một trong nhiều lý do khiến việc mô phỏng chả có ý nghĩa gì : một thiết kế có thể chạy mô phỏng tốt nhưng khác xa datasheet, khác xa thực tế, tất nhiên không chạy thực.

                Thứ nhất, nếu vẫn cắm mạch nạp ở RB7 và RB6 thì 2 sợi này không chạy input được, phải rút hẳn mạch nạp ra.

                Thứ nhì, RB5 và RB4 có tính năng AN, khi đặt cổng B là input thì tự động chúng trở thành analog input. Phải đặt chúng là digital input bằng cách can thiệp vào thanh ghi ANSELH tắt chức năng analog ở sợi cổng đi.

                Thứ ba, phải treo trở bên ngoài cổng lên VCC hoặc bật tính năng weak pull up cho cổng thì chạy mới đúng được.
                Vấn đề thứ nhất và thứ 3 thì em làm đúng. Mạch em thì em đã kiểm tra kỹ và chắc là ko sai đc.
                Còn về thanh ghi ANSELH là sao ạ? anh nói vấn đề này giúp em và tắt nó như thế nào thì được.Vì em cũng chỉ mới tập tành viết thôi. Em cảm ơn

                Comment


                • #9
                  Nguyên văn bởi emperordx Xem bài viết
                  Vấn đề thứ nhất và thứ 3 thì em làm đúng. Mạch em thì em đã kiểm tra kỹ và chắc là ko sai đc.
                  Còn về thanh ghi ANSELH là sao ạ? anh nói vấn đề này giúp em và tắt nó như thế nào thì được.Vì em cũng chỉ mới tập tành viết thôi. Em cảm ơn
                  ngoài các vấn đề đã nêu ở trên để ngắt RB của 16f887 làm việc được dùng thêm lệnh sau: enable_interrupts(int_RBx);
                  code:
                  Code:
                  #include <16f887.h>
                  #fuses XT,NOLVP,NOWDT
                  #use delay(clock=4000000)
                  #use fast_io(b)
                  #use fast_io(d)
                  #byte portB=0x06
                  #byte portC=0x07
                  #byte portD=0x08
                  #byte intcon=0x000B
                  #bit RD0=portd.0
                  #bit RD1=portd.1
                  #bit RD2=portd.2
                  #bit RD3=portd.3
                  
                  #bit RB4=portB.4
                  #bit RB5=portB.5
                  #bit RB6=portB.6
                  #bit RB7=portB.7
                  #bit RBIF=intcon.0 //dinh nghia co ngat RB
                  #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
                  byte CONST so[] = {1,2,4,8,16,32,64,128,255};
                  int8 n=0,dv=0,hc=0;
                  
                  #INT_RB
                  void ngat_RB()
                  {
                  if((RBIF)&&(RBIE)) {
                  if (RB4==0) {if (n<7) {n=n+1;}}
                  if (RB5==0) {if (n>0) {n=n-1;}}
                  if (RB6==0) {n=8;}
                  }
                  RBIF=0;
                  }
                  
                  
                  
                  void main()
                  {
                  
                  set_tris_D(0x00);
                  set_tris_B(0xFF);
                  SETUP_ADC_PORTS(NO_ANALOGS);//giải quyết Vấn đề thứ 2
                  enable_interrupts(global);
                  enable_interrupts(int_RB);//Cho phep ngat RB
                  enable_interrupts(int_RB4);
                  enable_interrupts(int_RB5);
                  enable_interrupts(int_RB6);
                  ext_int_edge(H_to_L);
                  while (1) {
                  output_D(so[n]);
                  delay_ms(200);
                  output_D(0);
                  delay_ms(200);
                  
                  }
                  }
                  |

                  Comment


                  • #10
                    Xin chân thành cảm ơn các bác đã giúp em, vấn đề của em đã được giải quyết xong, tuy nhiên em thấy cần phải thêm delay sau khi kiểm tra nút bấm để nút bấm hoạt động tốt hơn.

                    Comment


                    • #11
                      Nguyên văn bởi emperordx Xem bài viết
                      Xin chân thành cảm ơn các bác đã giúp em, vấn đề của em đã được giải quyết xong, tuy nhiên em thấy cần phải thêm delay sau khi kiểm tra nút bấm để nút bấm hoạt động tốt hơn.
                      thêm delay hoặc tiếng bep để chống rung phím
                      email:
                      chỉ được liên lạc từ 19h00 - 21h30



                      Comment


                      • #12
                        dùng vòng lặp while để chống rung phím tốt hơn và dễ hơn dùng delay

                        Comment

                        Về tác giả

                        Collapse

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

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

                        Collapse

                        Đang tải...
                        X