Thông báo

Collapse
No announcement yet.

Lập trình từ PIC12f683 sang PIC12f1501

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

  • #16
    Nguyên văn bởi eclipse_bk47 Xem bài viết
    Code này vẫn chưa có phần xử lý nút ấn bạn ah.

    Nghĩa là bạn đã test code này và đã chạy chưa? thường thì phần khó rơi vào phần config, chứ phần ngắt nút nhấn thì tham khảo rất nhiều mà? (chỉ hơi hơi khó hiểu cái bouncing thôi)

    Comment


    • #17
      Code phía trên mình test và chạy được rồi. Còn mỗi phần code ngắt nút vào chân RA3 thôi.Bạn hướng dẫn giúp mình nhé.

      Comment


      • #18
        Nguyên văn bởi eclipse_bk47 Xem bài viết
        Code phía trên mình test và chạy được rồi. Còn mỗi phần code ngắt nút vào chân RA3 thôi.Bạn hướng dẫn giúp mình nhé.
        Bạn này chắc cũng ít ngồi check datasheet đây.
        Check rồi chỉnh lại nhé, mình ngồi đọc 1 chút rồi viết có thể ko chính xác và cũng ko có PIC để test
        Code:
        int main ()
        {
        
           //Thiết lập RA2 là digital IN (datasheet trang 95>>)
              TRISAbits.RA2 = 1;
              ANSELAbits.ANSA2 = 0;
              PORTAbits.RA2 = 0;
           //Thiết lập ngắt cho RA2 sườn lên (datasheet trang 51>>)
              INTCONbits.GIE = 1;
              INTCONbits.INT = 1;
              OPTION_REGbits.INTEDG = 1;
              INTCONbits.INTF = 0;
           //vòng lặp ko làm gì
             while (1) {}
             return 0;
        }
        
        //Hàm ngắt
        
        void interrupt isr()
        {
               INTCONbits.INTF =0 //reset intterup flag
               .....                          //Thích cho mấy con LED nhảy thì cho nhưng khuyến khích LED =~LED để nó ON hoặc OFF;
        }
        Chắc chỉ thiếu sơ đồ với cái thiết lập TRIS cho LED thôi (cái này chắc bạn làm đc)

        Comment


        • #19
          Bạn làm được những gì rồi, sai vấp hay gặp vấn đề gì ở đâu thì đưa ra mổ ở đây thì hay hơn
          See you on the dark side of the moon

          Comment


          • #20
            Mình đang muốn tín hiệu đưa vào là chân RA3( không phải RA2) nên phải sử dụng Interrupt on change trên chân RA3.
            Các bạn xem đoạn Code này mình viết đúng không mà sao khi mô phỏng bằng Protues thì khi khởi động đèn đã sáng còn khi ấn nút thì đèn lại tắt(mình mong muốn là khi khởi động đèn tối, khi ấn nút đèn sáng). Mình mới học lập trình vi điều khiển nên rất mong các bạn chỉ bảo.
            Code:
            int main()
            {
                //Thiết lập RA3 là Interrupt on change de dieu khien nut an
                  TRISAbits.TRISA3 = 1;
                  IOCAPbits.IOCAP3 = 1;
                  //ANSELAbits.ANSA2 = 0;
                  //PORTAbits.RA3 = 0;
               //Thiết lập ngắt cho RA3 sườn lên
                  INTCONbits.GIE = 1;
                  INTCONbits.IOCIE =1;
                  INTCONbits.IOCIF = 0;
               // Thiet lap output cho chan RA0 de dieu khien LED
                  TRISAbits.TRISA0 = 0;
               //vòng lặp ko làm gì
                 
                 while (1)
                 {
                    
                 }
                // return 0;
            }
            void interrupt isr()
            {
                if(INTCONbits.IOCIF==1)
                {
                INTCONbits.IOCIF =0;
                if(PORTAbits.RA3==0)//Neu nut an tren chan RA3 duoc an thi den se sang
                 {
                    LATAbits.LATA0 = 1;
                 }
                }
            }Click image for larger version
            
            Name:	Capture.JPG
            Views:	1134
            Size:	39.6 KB
            ID:	1633988

            Comment


            • #21
              Nguyên văn bởi eclipse_bk47 Xem bài viết
              Mình đang muốn tín hiệu đưa vào là chân RA3( không phải RA2) nên phải sử dụng Interrupt on change trên chân RA3.
              Các bạn xem đoạn Code này mình viết đúng không mà sao khi mô phỏng bằng Protues thì khi khởi động đèn đã sáng còn khi ấn nút thì đèn lại tắt(mình mong muốn là khi khởi động đèn tối, khi ấn nút đèn sáng). Mình mới học lập trình vi điều khiển nên rất mong các bạn chỉ bảo.
              Code:
              int main()
              {
              //Thiết lập RA3 là Interrupt on change de dieu khien nut an
              TRISAbits.TRISA3 = 1;
              IOCAPbits.IOCAP3 = 1;
              //ANSELAbits.ANSA2 = 0;
              //PORTAbits.RA3 = 0;
              //Thiết lập ngắt cho RA3 sườn lên
              INTCONbits.GIE = 1;
              INTCONbits.IOCIE =1;
              INTCONbits.IOCIF = 0;
              // Thiet lap output cho chan RA0 de dieu khien LED
              TRISAbits.TRISA0 = 0;
              //vòng lặp ko làm gì
                                                                                                     *5
              while (1)
              {
              
              }
              // return 0;
              }
              void interrupt isr()
              {
              if(INTCONbits.IOCIF==1)                              *1, 2
              {
              INTCONbits.IOCIF =0;
              if(PORTAbits.RA3==0)//Neu nut an tren chan RA3 duoc an thi den se sang       *3
              {
              LATAbits.LATA0 = 1;                                          *4
              }
              }
              }
              Lần sau thì IOC thì nói IOC, cứ nói Interrupt thế thì ai mà biết và bạn ngồi viết cái này à? Có đọc datasheet ko vậy?
              1. IOC thì ko dính gì đến flag của thanh ghi INTCON nữa mà là thanh ghi IOCAF (chương trình nó chạy vì IOCIF dạng như mask của IOCAF thôi => check datasheet 12.3)
              2. Bit này tự set nếu có ngắt, nên ko cần dùng lệnh if để check có ngắt
              3. Ko cần lệnh if check RA3==0 vì khi bấm nút thì flag tự set và sẽ nhảy vào hàm ngắt.
              (trừ khi là bạn muốn debouncing thì cho 1 hàm delay nhỏ rồi kiểm tra vs lệnh if RA3 ==0)
              4. Đã khuyến cáo là dùng logic NOT ~ để nó đảo chiều khi bấm nút chứ cứ set nó = 1 thì nó sáng là phải rồi.
              5. Muốn ban đầu đèn tắt thì trước vòng while(1) cho LATA0 = 0
              6. Thay vì IOCAP thì là IOCAP (vì code của mình nối nút vs VDD, cái này lúc nào rãnh coi lại)
              7. Còn bạn bấm nút mà đèn tắt thì mình cũng ko hiểu luôn!!!! @@
              8. Mấy chân free ko biết dùng làm gì cứ đè mấy chân ICSP mà phang !!!! @@
              Kết luận: đọc tài liệu tham khảo, datasheet thật nhiều trước khi hỏi.

              Comment

              Về tác giả

              Collapse

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

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

              Collapse

              Đang tải...
              X