Tutorial LCD cua Nigel???????

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • spirit
    Đệ tử 2 túi
    • Aug 2006
    • 42

    #1

    Tutorial LCD cua Nigel???????

    Chào các anh trong diễn đàn PIC VIET NAm.Em có 1 số vấn đề chưa thông trong tut cua Nigel về LCD (Chuong 3_bài 3) mong các anh có ai đã từng đọc hay đã làm qua giúp em với.
    Thứ nhất là hàm LCD_busy:_giao tiếp LCD ở mode 4 bit
    ;------------------------------------------------------
    LCD_Busy
    bsf STATUS, RP0 ;set bank 1
    movlw 0x0f ;set Port for input
    movwf LCD_TRIS
    bcf STATUS, RP0 ;set bank 0
    bcf LCD_PORT, LCD_RS ;set LCD for command mode
    bsf LCD_PORT, LCD_RW ;setup to read busy flag
    bsf LCD_PORT, LCD_E
    swapf LCD_PORT, w ;read upper nibble (busy flag)
    bcf LCD_PORT, LCD_E
    movwf templcd2
    bsf LCD_PORT, LCD_E ;dummy read of lower nibble **********
    bcf LCD_PORT, LCD_E
    btfsc templcd2, 7 ;check busy flag, high = busy
    goto LCD_Busy ;if busy check again
    bcf LCD_PORT, LCD_RW
    bsf STATUS, RP0 ;set bank 1
    movlw 0x00 ;set Port for output
    movwf LCD_TRIS
    bcf STATUS, RP0 ;set bank 0
    return

    ;end of LCD routines
    ;------------------------------------------------------
    Neu gọi hàm này thì chương trình của Nigel không chạy được bởi vì khi em thay hàm này bằng hàm gọi delay_5ms thì chạy được
    Các anh có thể chỉ cho em biết chỗ sai trong hàm này được không a.
    À,còn dòng lệnh ở hàng em đánh dấu * nữa,em nghĩ dòng lệnh này là không cần thiết bởi vì ta chỉ quan tam đến bit DB7 mà thôi,
    Cám ơn các anh nhiều lắm.
  • spirit
    Đệ tử 2 túi
    • Aug 2006
    • 42

    #2
    Hic,không ai giúp mình sao???

    Comment

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

      #3
      Xin lỗi bạn nhé, tôi xem qua rồi nhưng lại quên trả lời.

      Chương trình của Nigel đã thử nghiệm trên phần cứng, và dùng chip PIC16F628, còn bạn dùng chip gì?

      Ở chỗ bạn đánh dấu * đúng là chúng ta không cần các bit đó, nhưng module LCD yêu cầu phải đẩy các bit đó ra thì nó mới làm việc tiếp được. Do đó chúng ta phải đẩy một dummy nibble ra.

      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

      • spirit
        Đệ tử 2 túi
        • Aug 2006
        • 42

        #4
        Nguyên văn bởi namqn View Post
        Xin lỗi bạn nhé, tôi xem qua rồi nhưng lại quên trả lời.

        Chương trình của Nigel đã thử nghiệm trên phần cứng, và dùng chip PIC16F628, còn bạn dùng chip gì?

        Ở chỗ bạn đánh dấu * đúng là chúng ta không cần các bit đó, nhưng module LCD yêu cầu phải đẩy các bit đó ra thì nó mới làm việc tiếp được. Do đó chúng ta phải đẩy một dummy nibble ra.

        Thân,
        Em đang dùng chip p16f877A nhưng em nghĩ hàm LCD_busy thì con Pic nào cũng được chứ anh,
        À quên mình có thực hành một số bài của Nigel thì thấy có một số chương trình không chạy được nếu Copy and Paste vì vậy bạn nào có làm mà bị vướng mắc chỗ nào thì post lên,mình sẽ cố gắng trong phạm vi kiến thức của mình
        Anh có thể test giùm em chương trình trên được không a.
        Cám ơn anh nhiều lắm.

        Comment

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

          #5
          Bạn dùng code của Nigel nguyên gốc hay đã thay đổi?

          Nếu đã thay đổi thì bạn post những thay đổi bạn đã thực hiệ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

          • spirit
            Đệ tử 2 túi
            • Aug 2006
            • 42

            #6
            Nguyên văn bởi namqn View Post
            Bạn dùng code của Nigel nguyên gốc hay đã thay đổi?

            Nếu đã thay đổi thì bạn post những thay đổi bạn đã thực hiện.

            Thân,
            Em thay đổi 1 chút so với code cua Nigel chương LCD nhưng hàm LCD_busy là nguyên gốc

            Còn những thay đổi trong các chương trước thì code cua Nigel khá dài nếu em post lên sẽ khó theo dõi luồng này lắm.Hay là em có ý kiến này:em mở 1 thread mới bàn về các vấn đề trong tut của Nigel để mọi người vào thảo luận
            vì em thấy code của Nigel viết rất hay và dễ theo dõi mạch chương trình.
            Anh thấy thế nào a?

            Comment

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

              #7
              Nguyên văn bởi spirit View Post
              Em thay đổi 1 chút so với code cua Nigel chương LCD nhưng hàm LCD_busy là nguyên gốc

              Còn những thay đổi trong các chương trước thì code cua Nigel khá dài nếu em post lên sẽ khó theo dõi luồng này lắm.Hay là em có ý kiến này:em mở 1 thread mới bàn về các vấn đề trong tut của Nigel để mọi người vào thảo luận
              vì em thấy code của Nigel viết rất hay và dễ theo dõi mạch chương trình.
              Anh thấy thế nào a?
              Bạn chỉ cần post những thay đổi của bạn đối với chương trình LCD so với bản gốc của Nigel, từ đó mới có thể nhận xét vì sao chương trình con LCD_busy không chạy đúng.

              Việc mở 1 thread bàn về các tutorial của Nigel cũng hay, nhưng mở từng thread cho từng chủ đề như hiện nay là ổn rồi, như vậy việc thảo luận sẽ tập trung 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

              • spirit
                Đệ tử 2 túi
                • Aug 2006
                • 42

                #8
                Nguyên văn bởi namqn View Post
                Bạn chỉ cần post những thay đổi của bạn đối với chương trình LCD so với bản gốc của Nigel, từ đó mới có thể nhận xét vì sao chương trình con LCD_busy không chạy đúng.

                Việc mở 1 thread bàn về các tutorial của Nigel cũng hay, nhưng mở từng thread cho từng chủ đề như hiện nay là ổn rồi, như vậy việc thảo luận sẽ tập trung hơn.

                Thân,
                Hôm nay em không mang theo,để hôm sau em post lên,thanks anh đã reply

                Comment

                • spirit
                  Đệ tử 2 túi
                  • Aug 2006
                  • 42

                  #9
                  Anh nam coi giùm em với

                  Anh thông cảm em không post lên diễn đàn được.
                  Last edited by spirit; 09-09-2006, 05:09 PM.

                  Comment

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

                    #10
                    Một thông tin cần thiết mà em chưa cung cấp, đó là tần số của thạch anh đang được dùng.

                    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

                    • spirit
                      Đệ tử 2 túi
                      • Aug 2006
                      • 42

                      #11
                      Nguyên văn bởi namqn View Post
                      Một thông tin cần thiết mà em chưa cung cấp, đó là tần số của thạch anh đang được dùng.

                      Thân,
                      Em quên mất,thạch anh em đang sử dụng là 4 Mhz
                      Ủa tần số thạch anh thì có liên quan gì ạ, em nghĩ bao nhiêu cũng được chứ chỉ cần không quá giới hạn thôi mà
                      Last edited by spirit; 12-09-2006, 10:54 AM.

                      Comment

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

                        #12
                        Có khả năng là module LCD của em có bộ xử lý hơi chậm. Em thêm một vài lệnh nop vào đoạn code đọc dữ liệu từ LCD trong chương trình con LCD_Busy thử xem. Tức là chuyển phần code
                        Code:
                        	bsf	LCD_PORT, LCD_E 
                        	swapf	LCD_PORT, w	;LAY 4 BIT CAO,BIT DAU TIEN LA CO BF
                          	bcf	LCD_PORT, LCD_E	;LCD BAT DAU THUC HIEN LENH
                        thành
                        Code:
                        	bsf	LCD_PORT, LCD_E 
                        	nop
                        	swapf	LCD_PORT, w	;LAY 4 BIT CAO,BIT DAU TIEN LA CO BF
                          	bcf	LCD_PORT, LCD_E	;LCD BAT DAU THUC HIEN LENH
                        Phần code để đẩy nibble thấp ra cũng cần thêm vài lệnh nop (2 lệnh trở lê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

                        • spirit
                          Đệ tử 2 túi
                          • Aug 2006
                          • 42

                          #13
                          Để em về thử xem

                          Comment

                          • spirit
                            Đệ tử 2 túi
                            • Aug 2006
                            • 42

                            #14
                            Em thử rồi mà vẫn không được anh nam à ,

                            Comment

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

                              #15
                              Thật khó tin là Nigel lại mắc lỗi rất tầm thường như vậy, nhưng sự thật thì code trên trang web của ông ta vẫn đang có lỗi đó.

                              Trong phiên bản có kiểm tra cờ BF, ở chương trình con LCD_Init có lệnh gọi LCD_Busy ở ngay phần đầu. Vấn đề ở đây là LCD_Busy dùng chế độ giao tiếp 4-bit, mà chế độ này lại chưa được thiết lập khi chúng ta bắt đầu thực hiện LCD_Init.

                              Nếu chương trình vượt qua được lỗi này và chạy đến lệnh LCD_Cmd với W = 0x20 (để thiết lập giao tiếp 4-bit) thì vẫn có vấn đề, vì LCD_Cmd có gọi LCD_Busy trước khi trở về. Và một lần nữa, LCD_Busy lại dùng chế độ giao tiếp 4-bit, là chế độ đang được thiết lập.

                              Do đó, có 2 điểm cần chỉnh lại trong chương trình của Nigel:

                              1. Thay lệnh gọi LCD_Busy ở đầu LCD_Init bằng LCD_Delay100
                              2. Thay lệnh gọi LCD_Busy ở cuối LCD_Cmd bằng LCD_Delay5

                              Các chương trình con này chỉ để khởi tạo, hay xuất các lệnh điều khiển ít khi được dùng, do đó vẫn không ảnh hưởng đến mục tiêu chính là dùng cờ BF để giảm thời gian chết khi xuất dữ liệu ra LCD (các lệnh xuất dữ liệu ra LCD như LCD_Char, và LCD_CharD vẫn dùng cờ BF).

                              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

                              Working...