PIC16F877 và bài toán đo nhiệt độ hiển thị LCD, có realtime-clock và eeprom.

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • Vinh3i
    Đệ tử 1 túi
    • Jan 2007
    • 25

    #16
    Nguyên văn bởi lexuantien View Post
    chẳng lẻ bộ nhớ EEPROM trong chip không đủ để lưu hả bạn?
    Ở đây, mình định lưu số liệu đo cùng với thời điểm đo, vì thế với mỗi số liệu lưu cần khoảng 8byte, như vậy 1000 điểm đo cần 8KB. Vậy dùng EEPROM ngoài cho thoải mái.
    Hơn nữa, đây là yêu cầu của bài tập

    Comment

    • Vinh3i
      Đệ tử 1 túi
      • Jan 2007
      • 25

      #17
      LCD bị lỗi, help!

      Hjx, code cho LCD cuối cùng đã có!
      Test trên proteus - ok.
      Nhưng nạp vào mạch vẫn ko chạy.
      Tôi đã kiểm tra chân nguồn, gnd, chỉnh ligh -> ok
      chân enable->A2
      chân reset ->A3
      chân R/W -> A1
      4 đường data D4-D7 nối với chân B1-B4
      Test thử bằng cách xuất output_high và output_low qua từng chân trên đều ok.
      nhưng nạp chương trình vào thì vẫn ko chạy. Có ai giúp tôi vụ này với!

      tưởng có vấn đề với chân 15, 16 nên đã cắt bỏ đường mạch nối tới 2 chân này. Nhưng nó vẫn chưa thèm chạy!

      Cái LCD này nó cứ ngủ mãi ko chịu dậy. Bực quá đi mất.....


      #include <16F877A.h>

      #FUSES NOWDT
      #FUSES XT
      #FUSES PUT
      #FUSES NOPROTECT
      #FUSES NODEBUG
      #FUSES BROWNOUT
      #FUSES NOLVP
      #FUSES NOCPD
      #FUSES NOWRT

      #use delay(clock=8000000)

      //----Dinh nghia cho LCD-------
      #define LCD_D0 PIN_B1
      #define LCD_D1 PIN_B2
      #define LCD_D2 PIN_B3
      #define LCD_D3 PIN_B4

      #define LCD_EN PIN_A2
      #define LCD_RS PIN_A3
      #define LCD_RW PIN_A1

      #define FIRST_LINE 0x00
      #define SECOND_LINE 0x40
      #define CLEAR_DISP 0x01
      //----end dinh nghia LCD--------

      //----driver cho LCD -----------
      void LCD_Init ( void );
      void LCD_SetPosition ( unsigned int cX );
      void LCD_PutChar ( unsigned int cX );
      void LCD_PutCmd ( unsigned int cX );
      void LCD_PulseEnable ( void );
      void LCD_SetData ( unsigned int cX );

      void LCD_Init ( void )
      {
      LCD_SetData ( 0x00 );
      delay_ms ( 200 );
      output_low(LCD_RW);
      output_low ( LCD_RS );
      LCD_SetData ( 0x03 );
      LCD_PulseEnable();
      LCD_PulseEnable();
      LCD_PulseEnable();
      LCD_SetData ( 0x02 );
      LCD_PulseEnable();
      LCD_PutCmd ( 0x2C );
      LCD_PutCmd ( 0x0C );
      LCD_PutCmd ( 0x01 );
      LCD_PutCmd ( 0x06 );
      }

      void LCD_SetPosition ( unsigned int cX )
      {
      LCD_SetData ( swap ( cX ) | 0x08 );
      LCD_PulseEnable();
      LCD_SetData ( swap ( cX ) );
      LCD_PulseEnable();
      }

      void LCD_PutChar ( unsigned int cX )
      {
      output_low ( LCD_RW );
      output_high ( LCD_RS );
      LCD_SetData ( swap ( cX ) );
      LCD_PulseEnable();
      LCD_SetData ( swap ( cX ) );
      LCD_PulseEnable();
      output_low ( LCD_RS );
      }

      void LCD_PutCmd ( unsigned int cX )
      {
      LCD_SetData ( swap ( cX ) );
      LCD_PulseEnable();
      LCD_SetData ( swap ( cX ) );
      LCD_PulseEnable();
      }

      void LCD_PulseEnable ( void )
      {
      output_high ( LCD_EN );
      delay_us ( 10 );
      output_low ( LCD_EN );
      delay_ms ( 5 );
      }

      void LCD_SetData ( unsigned int cX )
      {
      output_bit ( LCD_D0, cX & 0x01 );
      output_bit ( LCD_D1, cX & 0x02 );
      output_bit ( LCD_D2, cX & 0x04 );
      output_bit ( LCD_D3, cX & 0x08 );
      }
      //------end driver cho LCD---------------

      void main()
      {

      LCD_Init();

      LCD_PutChar("V");
      LCD_PutChar(" ");
      LCD_PutChar("K");
      LCD_PutChar("I");
      LCD_PutChar("L");
      LCD_PutChar("L");
      LCD_PutChar(" ");
      LCD_PutChar("H");
      LCD_PutChar("I");
      LCD_PutChar("M");

      }

      Comment

      • Vinh3i
        Đệ tử 1 túi
        • Jan 2007
        • 25

        #18
        Loay hoay với cái này mất gần 2 ngày trời rồi. Có ai xem giúp tôi với. Chứ thấy cái LCD này lì quá!!!!!

        Comment

        • namqn
          Trưởng lão PIC bang
          • Feb 2006
          • 3020

          #19
          Nguyên văn bởi Vinh3i View Post
          Loay hoay với cái này mất gần 2 ngày trời rồi. Có ai xem giúp tôi với. Chứ thấy cái LCD này lì quá!!!!!
          Không ít người gặp vấn đề với LCD (đặc biệt là LCD mới), vì họ không dùng quy trình khởi tạo LCD đầy đủ. Tôi đã nhiều lần nói đến quy trình này ở picvietnam, bạn có thể tham khảo ở post #268 của luồng sau chẳng hạn:


          Thân,
          Biển học mênh mông, sức người có hạn.

          Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
          http://www.picvietnam.com/forum/showthread.php?t=1263

          Comment

          • Vinh3i
            Đệ tử 1 túi
            • Jan 2007
            • 25

            #20
            tôi viết code để test lcd như sau:
            Code:
            #include <16F877A.h>
            
            
            #FUSES NOWDT                    //No Watch Dog Timer
            #FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
            #FUSES NOPUT                    //No Power Up Timer
            #FUSES NOPROTECT                //Code not protected from reading
            #FUSES NODEBUG                  //No Debug mode for ICD
            #FUSES NOBROWNOUT               //No brownout reset
            #FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
            #FUSES NOCPD                    //No EE protection
            #FUSES NOWRT                    //Program memory not write protected
            
            #use delay(clock=10000000)
            
            /* LCD STUFF */
            #define LCD_D0  PIN_B1
            #define LCD_D1  PIN_B2
            #define LCD_D2  PIN_B3
            #define LCD_D3  PIN_B4
            
            #define LCD_EN  PIN_A1
            #define LCD_RS  PIN_A2
            
            #define FIRST_LINE  0x00
            #define SECOND_LINE 0x40
            #define CLEAR_DISP  0x01
            
            #int_EXT
            void  EXT_isr(void) 
            {
            
            }
            
            #int_TBE
            void  TBE_isr(void) 
            {
            
            }
            
            #int_RDA
            void  RDA_isr(void) 
            {
            
            }
            
            
            void LCD_Init ( void );
            void LCD_SetPosition ( unsigned int cX );
            void LCD_PutChar ( unsigned int cX );
            void LCD_PutCmd ( unsigned int cX );
            void LCD_PulseEnable ( void );
            void LCD_SetData ( unsigned int cX );
            
            
            void main()
            {
            Output_high(PIN_B5);
            Output_high(PIN_B5);
            LCD_Init();
            LCD_PutChar("O");
            LCD_PutChar("K");
            
            }
            /******************************************************************************/
            
            void LCD_Init ( void )
                {
                LCD_SetData ( 0x00 );
                delay_ms ( 200 );       /* wait enough time after Vdd rise */
                output_low ( LCD_RS );
                LCD_SetData ( 0x03 );   /* init with specific nibbles to start 4-bit mode */
                LCD_PulseEnable();
                LCD_PulseEnable();
                LCD_PulseEnable();
                LCD_SetData ( 0x02 );   /* set 4-bit interface */
                LCD_PulseEnable();      /* send dual nibbles hereafter, MSN first */
                LCD_PutCmd ( 0x2C );    /* function set (all lines, 5x7 characters) */
                LCD_PutCmd ( 0x0C );    /* display ON, cursor off, no blink */
                LCD_PutCmd ( 0x01 );    /* clear display */
                LCD_PutCmd ( 0x06 );    /* entry mode set, increment */
                }
            
            void LCD_SetPosition ( unsigned int cX )
                {
                /* this subroutine works specifically for 4-bit Port A */
                LCD_SetData ( swap ( cX ) | 0x08 );
                LCD_PulseEnable();
                LCD_SetData ( swap ( cX ) );
                LCD_PulseEnable();
                }
            
            void LCD_PutChar ( unsigned int cX )
                {
                /* this subroutine works specifically for 4-bit Port A */
                output_high ( LCD_RS );
                LCD_SetData ( swap ( cX ) );     /* send high nibble */
                LCD_PulseEnable();
                LCD_SetData ( swap ( cX ) );     /* send low nibble */
                LCD_PulseEnable();
                output_low ( LCD_RS );
                }
            
            void LCD_PutCmd ( unsigned int cX )
                {
                /* this subroutine works specifically for 4-bit Port A */
                LCD_SetData ( swap ( cX ) );     /* send high nibble */
                LCD_PulseEnable();
                LCD_SetData ( swap ( cX ) );     /* send low nibble */
                LCD_PulseEnable();
                }
            
            void LCD_PulseEnable ( void )
                {
                output_high ( LCD_EN );
                delay_us ( 10 );
                output_low ( LCD_EN );
                delay_ms ( 5 );
                }
            
            void LCD_SetData ( unsigned int cX )
                {
                output_bit ( LCD_D0, cX & 0x01 );
                output_bit ( LCD_D1, cX & 0x02 );
                output_bit ( LCD_D2, cX & 0x04 );
                output_bit ( LCD_D3, cX & 0x08 );
                }
            dùng CCS để build và nạp vào PIC trên
            Tuy nhiên, mô phỏng với proteus thì chạy tốtt, còn nạp lên mạch thì LCD chỉ hiện một dòng đen xì.
            (với code trên, tôi đã nối châm RW của LCD với đất)
            kiểm tra điện áp trên lcd thì có
            D0,1,2,3,4,5,7 = 5v
            D6 = 0V
            rs,e,rw = 0v
            chỉnh điện áp chân VEE vẫn thấy thay đổi đậm nhạt của dòng đen xì trên
            Help me!!!!
            Last edited by Vinh3i; 19-03-2009, 04:30 PM.

            Comment

            • namqn
              Trưởng lão PIC bang
              • Feb 2006
              • 3020

              #21
              Nguyên văn bởi Vinh3i View Post
              ...

              Tuy nhiên, mô phỏng với proteus thì chạy tốtt, còn nạp lên mạch thì LCD chỉ hiện một dòng đen xì.
              (với code trên, tôi đã nối châm RW của LCD với đất)
              kiểm tra điện áp trên lcd thì có

              Help me!!!!
              LCD trong Proteus là LCD lý tưởng, còn những LCD thực tế thì có đôi chút khác biệt.

              Theo thông tin của bạn, phần cứng của bạn đang có vấn đề, vì chân D6 có trạng thái bất thường so với các chân còn lại. Bạn nên đưa sơ đồ mạch đã dùng lên diễn đàn, vì code chỉ có nghĩa khi dùng với một thiết kế phần cứng cụ thể.

              Thân,
              Biển học mênh mông, sức người có hạn.

              Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
              http://www.picvietnam.com/forum/showthread.php?t=1263

              Comment

              • Vinh3i
                Đệ tử 1 túi
                • Jan 2007
                • 25

                #22
                Nguyên văn bởi namqn View Post
                LCD trong Proteus là LCD lý tưởng, còn những LCD thực tế thì có đôi chút khác biệt.

                Theo thông tin của bạn, phần cứng của bạn đang có vấn đề, vì chân D6 có trạng thái bất thường so với các chân còn lại. Bạn nên đưa sơ đồ mạch đã dùng lên diễn đàn, vì code chỉ có nghĩa khi dùng với một thiết kế phần cứng cụ thể.

                Thân,
                Đó là code tôi viết cho mạch ở post #1

                Comment

                • Vinh3i
                  Đệ tử 1 túi
                  • Jan 2007
                  • 25

                  #23
                  Hjx, hóa ra chip PIC bị hỏng.
                  Nhưng ko phát hiện ra hỏng bởi vì dùng Pickit2 vẫn nạp và tẩy ngon lành.
                  Test bằng cách nhấp nháy pin_b5 vẫn ok.

                  Sau đó, tôi đã đo thông mạch của pic (gỡ pic ra khỏi mạch). Thấy chân 3-4-12-31 của PIC bị thông mạch.

                  Bác cho hỏi, hỏng kiểu đó có chữa được ko... tiếc con pic quá!

                  Comment

                  • namqn
                    Trưởng lão PIC bang
                    • Feb 2006
                    • 3020

                    #24
                    Nguyên văn bởi Vinh3i View Post
                    Đó là code tôi viết cho mạch ở post #1
                    Ok, sơ đồ của bạn thì không có vấn đề, nhưng code của bạn có vấn đề, dẫn đến LCD chưa được khởi tạo.

                    Trong post #268 của luồng http://www.picvietnam.com/forum/showthread.php?t=357, tôi đã trình bày quy trình khởi tạo đầy đủ. Đối chiếu với code của bạn thì thấy dữ liệu để khởi tạo của bạn bị sai (0x03 thay vì một trong các giá trị 0x30 - 0x3F).

                    Thân,
                    Biển học mênh mông, sức người có hạn.

                    Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                    http://www.picvietnam.com/forum/showthread.php?t=1263

                    Comment

                    • namqn
                      Trưởng lão PIC bang
                      • Feb 2006
                      • 3020

                      #25
                      Nguyên văn bởi Vinh3i View Post
                      Hjx, hóa ra chip PIC bị hỏng.
                      Nhưng ko phát hiện ra hỏng bởi vì dùng Pickit2 vẫn nạp và tẩy ngon lành.
                      Test bằng cách nhấp nháy pin_b5 vẫn ok.

                      Sau đó, tôi đã đo thông mạch của pic (gỡ pic ra khỏi mạch). Thấy chân 3-4-12-31 của PIC bị thông mạch.

                      Bác cho hỏi, hỏng kiểu đó có chữa được ko... tiếc con pic quá!
                      PICkit 2 chỉ giao tiếp với PIC bằng các chân ICSP, và bản thân nó cũng không được thiết kế để phát hiện một chân nào đó bị hỏng.

                      Tôi không nghĩ rằng bạn có thể chữa được nó, nhưng dùng cho các mạch khác thì vẫn được (chỉ cần không dùng hai chân đó, và thiết lập các chân đó là ngõ vào thôi).

                      Thân,
                      Biển học mênh mông, sức người có hạn.

                      Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
                      http://www.picvietnam.com/forum/showthread.php?t=1263

                      Comment

                      • anhtrainguyen
                        Nhập môn đệ tử
                        • Dec 2008
                        • 6

                        #26
                        gởi Vinh3i tiền bối!!
                        em đang làm đề tài vi điều khiển gần giống như anh vậy!!!
                        em học ĐTĐ khoa điện BKDN,mới vào nghề điện tử này không lâu như mấy huynh! nên gà trong lập trình !!! híc....
                        mong anh Vinh3i có thể up luôn cả code C về đề tài này cho mọi người cùng tham khảo!!
                        cảm ơn đã đọc tin này!!
                        Nhân tiện hỏi luôn ma trận phím của anh lập trình như thế nào!! thank!!

                        Comment

                        • Vinh3i
                          Đệ tử 1 túi
                          • Jan 2007
                          • 25

                          #27
                          Nguyên văn bởi anhtrainguyen View Post
                          gởi Vinh3i tiền bối!!
                          em đang làm đề tài vi điều khiển gần giống như anh vậy!!!
                          em học ĐTĐ khoa điện BKDN,mới vào nghề điện tử này không lâu như mấy huynh! nên gà trong lập trình !!! híc....
                          mong anh Vinh3i có thể up luôn cả code C về đề tài này cho mọi người cùng tham khảo!!
                          cảm ơn đã đọc tin này!!
                          Nhân tiện hỏi luôn ma trận phím của anh lập trình như thế nào!! thank!!
                          Xin lỗi bạn nhé, vì bây giờ mình mới đọc bài này. Thời gian vừa rồi, mình bận làm tốt nghiệp Cao học nên ko ghé vào diễn đàn.

                          Comment

                          • sakura_utehy
                            Nhập môn đệ tử
                            • May 2009
                            • 1

                            #28
                            Chào anh Vinh3i!
                            1.Anh cho em hỏi là chân D0-D3 của LCD anh không sử dụng thì khi hiển thị lên LCD sẽ như thế nào?
                            2. Ma trận phím anh cho qua cổng AND thì khi thay đổi hay cài đặt thông số thời gian hay đặt ngưỡng cho nhiệt độ thì phải nhấn cả một tổ hợp phím à?
                            Mong anh chỉ bảo!

                            Comment

                            • macthanhan
                              Nhập môn đệ tử
                              • Sep 2009
                              • 2

                              #29
                              Thanks bài viết rất bổ ích cho những người đang làm đồ án về Pic

                              Comment

                              • macthanhan
                                Nhập môn đệ tử
                                • Sep 2009
                                • 2

                                #30
                                Anh có thể up file code của toàn bộ đề tài này ko? Em đang làm đồ án về Pic,nhưng phần lập trình gà wa.

                                Comment

                                Working...