RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

vidu ve ngat ngoai

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • maruko
    Đệ tử 1 túi
    • Aug 2011
    • 24

    #1

    vidu ve ngat ngoai

    các bác ơi. em có sửa lại code 1 ví dụ đơn giản về ngắt ngoài . sau khi suẳ chuơng trình cứ báo lỗi mà em k biết lỗi đó do đâu.
    nhờ các bác testgiups em với. em cảm ơn




    #include <16f877a.h>
    #include <def_877a.h>
    #device *=16
    #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
    //#define led PIN_D1

    //#use fast_io(b)
    //#use fast_io(d)


    boolean i = 1;
    #int_ext
    void ext_int_isr()
    {
    if(i == 1)
    {
    //output_high(led);
    potrd =255;
    i = 0;
    }
    else
    {
    //output_low(led);
    portd=0;
    i = 1;
    }
    }

    void main()
    {

    // set_tris_b(0x01);
    //set_tris_d(0x00);
    TRISB =0x00;
    TRISd =0x00;
    portd=0x00;

    port_b_pullups(true);
    enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
    enable_interrupts(global); // Cho phep ngat toan cuc
    while(1);
    }
  • goldstar09
    Đệ tử 1 túi
    • Aug 2009
    • 18

    #2
    Chào bạn.

    Bạn đang dùng chức năng ngắt trên chân RB0?(ngắt ngoài). Không rõ bạn nhận được lỗi như thế nào từ trình biên dịch CCS?
    Bạn khai báo biến i là biến kiểu boolean, tức là chỉ có hai giá trị 0, 1. Nhưng mình không thấy bạn tham chiếu giá trị i này vào đâu cả, cho nên có lẽ câu lệnh kiểm tra (i==1) không có ý nghĩa là chương trình đã vào hàm xử lý ngắt. Bạn lại định nghĩa các chân portB là ngõ ra??, theo mình các chân này phải là đầu vào số, như vậy bạn mới có thể đọc và kiểm tra được mức logic trên các chân này chứ. Thông cảm nếu nói sai!

    Thân.
    Last edited by goldstar09; 13-08-2011, 09:05 AM.

    Comment

    • maruko
      Đệ tử 1 túi
      • Aug 2011
      • 24

      #3
      vâng ! em đang dùng chức năng ngắt trên chân RB0?(ngắt ngoài)
      code của em la :

      #include <16f877a.h>
      #include <def_877a.h>
      #device *=16
      #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
      //#define led PIN_D1
      boolean i = 1;
      #int_ext
      void ext_int_isr()
      {
      if(i == 1)
      {

      potrd =255;
      i = 0;
      }
      else
      {

      portd=0;
      i = 1;
      }
      }

      void main()
      {
      TRISB =0xff;
      TRISd =0x00;
      port_b_pullups(true);
      enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
      enable_interrupts(global); // Cho phep ngat toan cuc
      while(1);
      }


      trình dịch cứ báo lỗi ở phần TRISTD VÀ TRISTB mặc dù em đã khai báo thư viện #include <def_877a.h> rồi .lỗi như trong file ảnh em gửi ấy. các bác suẳ lỗi giúp em với. em cảm ơn các bác nhiều
      Attached Files

      Comment

      • hcmut.khoamaisi
        Đệ tử 4 túi
        • Dec 2009
        • 79

        #4
        Bạn đã add file def_877a.h vào mục device của PIC chưa?Mấy lỗi này theo mình nghĩ là toàn do thư viện thôi hà !!! bạn thử sửa bỏ 2 dòng :
        TRISB =0xff;
        TRISd =0x00;
        Thay vào đó là dùng 2 lệnh:
        set_tris_b(0xff);
        set_tris_d(0x00);
        My blog: http://autumnneverreturn.blogspot.com/
        Đối thủ khó chiến thắng nhất là bản thân !!!

        Comment

        • ocean_86
          Đệ tử 1 túi
          • Mar 2010
          • 12

          #5
          Nguyên văn bởi maruko View Post
          các bác ơi. em có sửa lại code 1 ví dụ đơn giản về ngắt ngoài . sau khi suẳ chuơng trình cứ báo lỗi mà em k biết lỗi đó do đâu.
          nhờ các bác testgiups em với. em cảm ơn




          #include <16f877a.h>
          #include <def_877a.h>
          #device *=16
          #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT
          //#define led PIN_D1

          //#use fast_io(b)
          //#use fast_io(d)


          boolean i = 1;
          #int_ext
          void ext_int_isr()
          {
          if(i == 1)
          {
          //output_high(led);
          potrd =255;
          i = 0;
          }
          else
          {
          //output_low(led);
          portd=0;
          i = 1;
          }
          }

          void main()
          {

          // set_tris_b(0x01);
          //set_tris_d(0x00);
          TRISB =0x00;
          TRISd =0x00;
          portd=0x00;

          port_b_pullups(true);
          enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
          enable_interrupts(global); // Cho phep ngat toan cuc
          while(1);
          }
          chào bạn
          bạn thử bỏ dòng này đi xem #include <def_877a.h>
          và mình không hiểu cách viết này có đúng không bạn enable_interrupts(INT_EXT_H2L);
          sau while(1) hình như không có dấu chấm.
          bạn kiểm tra lại nha
          chúc thành công

          Comment

          • maruko
            Đệ tử 1 túi
            • Aug 2011
            • 24

            #6
            các bác ơi, sửa giúp em đoạn code này với . code chạy rồi nhưng khi nạp vào mạch mô phỏng thì k thấy chạy các bác ah
            em dùng ngắt ngoài trên chân RB1 nối với phím bấm và 1led nối với RD1
            khi chạy mô phỏng thì bật lên cái led sáng ngay.ấn phím thì k thấy led tắt. mặc dù em ấn phím có thấy sự thay đổi trạng thái trên chân RB1
            các bác xem giúp em với
            #include <16f877a.h>
            #use delay(clock = 20Mhz)
            //#device *=16
            #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT


            #use fast_io (b)
            #use fast_io (D)


            boolean i = 1;

            #int_ext
            void ext_int_isr(){
            if(i == 1){
            i=input(PIN_b1);
            output_high(pin_d1);

            i = 0;
            }
            else{
            output_low(pin_d1);

            i = 1;
            }
            }

            void main(){

            set_tris_b(0xff);
            set_tris_D(0x00);

            port_b_pullups(true);
            enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
            enable_interrupts(global); // Cho phep ngat toan cuc
            while(1);
            }
            thank các bác nhiều

            Comment

            • pstin
              Đệ tử 7 túi
              • Jul 2010
              • 190

              #7
              Thấy lạ lạ!!!!!!!!. Lúc đầu i=1 thì thực hiện lệnh if và led sáng, rồi cho i=0, vòng chương trình tiếp theo thực hiện lệnh else và tắt led, và set i=1, lặp lại mãi như vậy. Theo tui nghĩ led sẽ chớp tắt liên tục tốc độ quá nhanh và bạn thấy led luôn sáng!!!!!!!!.
              Thử sửa:
              #include <16f877a.h>
              #use delay(clock = 20Mhz)
              //#device *=16
              #FUSES NOWDT, XT, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT,NOLVP, NOCPD, NOWRT


              #use fast_io (b)
              #use fast_io (D)


              boolean i = 1;

              #int_ext
              void ext_int_isr(){
              i=input(PIN_b1);
              if(i == 1){
              output_high(pin_d1);
              }
              else{
              output_low(pin_d1);
              }
              }

              void main(){

              set_tris_b(0xff);
              set_tris_D(0x00);

              port_b_pullups(true);
              enable_interrupts(INT_EXT_H2L); // Cho phep ngat ngoai
              enable_interrupts(global); // Cho phep ngat toan cuc
              while(1);
              }

              Tui thì khai báo nút nhấn trong chương trình chính luôn, và việc nhấn phím thì rất đơn giản.
              Chúc vui!!!!!!!!

              Comment

              Working...