Thông báo

Collapse
No announcement yet.

[Xin giúp đỡ]Bài tập về led và nút bấm với PIC16F886

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

  • [Xin giúp đỡ]Bài tập về led và nút bấm với PIC16F886

    Chào các bạn trong diễn đàn. Hiện mình đang bắt đầu học PIC và tự mình đặt ra bài toán như sau

    Cổng vào :

    Port A0-A5 là các nút nhấn Sw1-sw6
    Port C0-C2 lad các nút nhấn sw7-sw9

    Cổng ra :

    PortB

    Khi nhấn các nút thì sẽ cho đầu ra ở portB xuất các tín hiệu khác nhau

    Không bấm nút thì outport_B=0

    Mình đã lập trình và chạy thử trên protues 7 thì hoạt động được, nhưng khi đổ chương trình vào chip thật thì không hoạt động được.

    Mong cac bạn chỉ giúp mình chỗ nào sai hay thiếu sót để mình được học hỏi thêm

    P/s : Trong mô phỏng, khi bấm nút có những lúc đầu ra bị nháy nháy không giữ được, vậy có phải do chương trình của mình có vấn đề không ?

    Đây là chương trình của mình

    #include <16F886.h>

    #use delay(crystal=20000000)

    #define sw1 PIN_A0
    #define sw2 PIN_A1
    #define sw3 PIN_A2
    #define sw4 PIN_A3
    #define sw5 PIN_A4
    #define sw6 PIN_A5

    #define sw7 PIN_C0
    #define sw8 PIN_C1
    #define sw9 PIN_C2

    #FUSES NOWDT //No Watch Dog Timer
    #FUSES NOBROWNOUT //No brownout reset
    #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O

    void main()
    {

    while(TRUE)
    {
    //sw1
    if(!input(sw1))
    OUTPUT_B(0x70);

    ///sw2
    else if(!input(sw2))
    OUTPUT_B(0x0C);

    ///sw3
    else if(!input(sw3))
    OUTPUT_B(0x04);

    ///sw4
    else if (!input(sw4))
    OUTPUT_B(0x07);

    ///sw5
    else if (!input(sw5))
    OUTPUT_B(0x02);

    ///sw6
    else if (!input(sw6))
    OUTPUT_B(0x05);


    ///sw7
    else if (!input(sw7))
    OUTPUT_B(0x0E);

    ///sw8
    else if (!input(sw8))
    OUTPUT_B(0x0B);

    ///sw9
    else if (!input(sw9))
    OUTPUT_B(0x0A);

    else
    OUTPUT_B(0x00);
    }

    }
    Phần mô phỏng

    |

  • #2
    up nào.......................
    |

    Comment


    • #3
      Các lệnh FUSES nên đặt ngay sau lệnh #include <pic>.
      Chương trình thiếu FUSES của dao động. Nếu dùng thạch anh ngoài phải khai báo thêm
      #FUSES HS
      Sau khi khai báo FUSES cho dao động mới được khai báo tần số dao động bằng #use delay hoặc #ocs
      Với phần cứng thật thì nếu dùng thạch anh 20M thì 2 tụ nhỏ là 15pF hoặc 22pF. Chân MCLR mặc định là chân Reset phải được kéo lên Vcc chip mới chạy được ( kéo bằng R, tụ không có cũng được, nếu nạp ISCP thì tụ chỉ tầm <= 1uF, nếu chọn tụ 10uF sẽ rất khó nạp và báo lỗi Vpp )

      Comment


      • #4
        Nguyên văn bởi duong_act Xem bài viết
        Các lệnh FUSES nên đặt ngay sau lệnh #include <pic>.
        Chương trình thiếu FUSES của dao động. Nếu dùng thạch anh ngoài phải khai báo thêm
        #FUSES HS
        Sau khi khai báo FUSES cho dao động mới được khai báo tần số dao động bằng #use delay hoặc #ocs
        Với phần cứng thật thì nếu dùng thạch anh 20M thì 2 tụ nhỏ là 15pF hoặc 22pF. Chân MCLR mặc định là chân Reset phải được kéo lên Vcc chip mới chạy được ( kéo bằng R, tụ không có cũng được, nếu nạp ISCP thì tụ chỉ tầm <= 1uF, nếu chọn tụ 10uF sẽ rất khó nạp và báo lỗi Vpp )

        Cảm ơn bạn. Mình đã thêm các thành phần trên nhưng vẫn bị nhấp nháy ở đầu ra khi chưa có đầu vào
        |

        Comment


        • #5
          Đổi hết "!input(PIN)" thành "input(PIN)==0". Không được nữa thì chịu @@.

          Comment


          • #6
            Thiếu cơ bản quá :

            // khai báo đầy đủ Fuse ( sử dụng thạch anh trong hay ngoài , tần số thấp hay cao )

            // phải khai báo cổng, chân vào ra nó mới input hay output được chớ (VD : set_tris_a(0xFF) ; // All input
            set_tris_b(0x00); // All output )

            // Nếu sử dụng digital I/O thì cần phải tắt chức năng Analog , Comparator ... thì nó mới dùng được .

            // Khi sử dụng button việc cần thiết là chống rung cho nút bấm ( để nó khỏi chạy loạn ) ( VD đơn giản dùng while và delay :
            if(!input(sw1))
            {
            // làm công việc gì đó ở đây.!
            while(!input(sw1)); // Đợi nhả tay khỏi nút bấm
            Delay_ms(300); // chống rung
            }
            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


            • #7
              Nguyên văn bởi duong_act Xem bài viết
              Đổi hết "!input(PIN)" thành "input(PIN)==0". Không được nữa thì chịu @@.
              2 cái này ở biểu thức logic là hoàn toàn giống nhau , không có gì thay đổi .

              Cái cơ bản là người lập trình thiếu nhiều thứ cơ bản nên nó không chạy đúng ( VD , FUSE, set_tris_ v..v , ADC , COMP )
              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


              • #8
                Nguyên văn bởi queduong Xem bài viết
                2 cái này ở biểu thức logic là hoàn toàn giống nhau , không có gì thay đổi .

                Cái cơ bản là người lập trình thiếu nhiều thứ cơ bản nên nó không chạy đúng ( VD , FUSE, set_tris_ v..v , ADC , COMP )
                Kia là CCS mà bác ? Không khai báo fast_io thì không cần set_tris_x vẫn chạy đúng. ADC, COMP mặc định là OFF. Các fuses theo như thớt mới post thì đã thêm đầy đủ.
                ______
                Thớt nói là mạch thật không chạy. Cho xin 500vnd cái schematic xem cái đê.
                Last edited by duong_act; 16-10-2013, 21:28.

                Comment


                • #9
                  Nguyên văn bởi duong_act Xem bài viết
                  Kia là CCS mà bác ? Không khai báo fast_io thì không cần set_tris_x vẫn chạy đúng. ADC, COMP mặc định là OFF. Các fuses theo như thớt mới post thì đã thêm đầy đủ.
                  ______
                  Thớt nói là mạch thật không chạy. Cho xin 500vnd cái schematic xem cái đê.
                  Cảm ơn các bác nhiều !

                  Mạch em đã chạy được rồi, lỗi do khai báo nhưng không mắc điện trở treo vào các chân mà chỉ mắc 1 chân để thử nên mạch nó chạy loạn
                  |

                  Comment

                  Về tác giả

                  Collapse

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

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

                  Collapse

                  Đang tải...
                  X