PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Tutorial LCD cua Nigel??????? (http://www.picvietnam.com/forum/showthread.php?t=589)

spirit 23-08-2006 02:54 PM

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 28-08-2006 08:31 PM

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

namqn 28-08-2006 09:29 PM

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,

spirit 29-08-2006 05:53 PM

Trích:

Nguyên văn bởi namqn (Post 4654)
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.

namqn 29-08-2006 06:33 PM

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,

spirit 30-08-2006 10:42 AM

Trích:

Nguyên văn bởi namqn (Post 4677)
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?

namqn 30-08-2006 06:42 PM

Trích:

Nguyên văn bởi spirit (Post 4687)
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,

spirit 31-08-2006 02:51 PM

Trích:

Nguyên văn bởi namqn (Post 4696)
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

spirit 09-09-2006 05:56 PM

Anh nam coi giùm em với
http://rapidshare.de/files/32479197/LCD_Nigel.rar.html
Anh thông cảm em không post lên diễn đàn được.

namqn 09-09-2006 10:56 PM

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,

spirit 11-09-2006 10:32 PM

Trích:

Nguyên văn bởi namqn (Post 4872)
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à

namqn 14-09-2006 11:32 PM

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,

spirit 15-09-2006 02:22 PM

Để em về thử xem

spirit 16-09-2006 07:31 PM

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

namqn 17-09-2006 06:39 PM

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,


Múi giờ GMT. Hiện tại là 03:09 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam