dsPIC Tutorial 3-Đọc ngõ vào và giao tiếp LCD
Đây là tutorial tiếp theo cho dsPIC, viết trong ASM30. Vài ngày tới tôi sẽ post các source code viết bằng C30 cho các tutorial đã viết. Các bạn theo dõi trong các luồng tương ứng của các tutorial đã post.
Trong tutorial 3 cho dsPIC, thông qua một ví dụ về đọc trạng thái các công tắc nối vào dsPIC và hiển thị trạng thái trên LCD, tôi minh hoạ cách đọc ngõ vào số của dsPIC, và cách giao tiếp dsPIC với LCD. Tôi cũng đã giới thiệu cách viết macro và cách định thời bằng ngắt với thời gian xử lý ngắt tối thiểu. Link để download tutorial: http://picvietnam.com/download/uploa...QNT.180706.pdf Các tập tin nguồn và hex được đặt trong tập tin nén sau: http://picvietnam.com/download/upload/namqn/Vidu3.zip Chúc các bạn thành công! Thân, |
Mã nguồn viết trong C30 (và các tập tin .hex) cho các ví dụ trong tutorial này có thể download ở đây:
http://picvietnam.com/download/uploa...n/Vidu3C30.zip Chúc thành công! Thân, |
Anh ơi,sao em ko down được anh ah.Anh xem lại link giúp em cái.
Thanks |
Em mới nghiên cứu về DSpic.Trước em có làm về con 16F877A.Vào đây thấy hay quá,nhưng em vào mấy cái link của anh thì toàn báo lỗi.
|
3 Attachment(s)
Trích:
Thân, |
Anh cho em hỏi dòng config : PWMxL_ACT_HI & PWMxH_ACT_HI
có nghĩa là gì hả anh? |
Trích:
Thân, |
dspic for lcd
Anh Nam cho em hỏi :
Code:
const unsigned char __attribute__ ((space(psv), address (0x0400))) |
Dòng lệnh thứ nhất khai báo vùng nhớ (hằng) có thể truy xuất thông qua PSV ở địa chỉ 0x0400. Dòng lệnh thứ hai khai báo một chuỗi hằng trong không gian đó. Dòng lệnh thứ ba bật chế độ truy xuất thông qua PSV. Dòng thứ tư thiết lập thanh ghi trang trước khi truy xuất bằng PSV. Không gian địa chỉ flash của dsPIC là 24-bit, trong khi các thanh ghi chỉ số dùng để truy xuất dữ liệu là 16-bit, do đó cần có một thanh ghi trang chứa 8 bit cao hơn của địa chỉ.
Để xuất một chuỗi khác vào dòng thứ hai của LCD thì bạn chỉ cần khai báo chuỗi mới đó, truy xuất chuỗi đó thay vì chuỗi thứ nhất trong vòng lặp xuất ra dòng thứ hai của LCD. Hiện thời chỉ có một vài quyển sách về lập trình dsPIC bằng ngôn ngữ cấp cao được bán, tôi chưa tìm được trang web nào hướng dẫn việc này. Đó cũng là 1 lý do khiến tôi viết những tutorial này, dù rằng tôi phải vừa học vừa viết. Thân, |
Chào các anh!
Em cung dang tim hieu ve dsPic và có tham khảo qua một số Tutorial của anh Nam. Em co làm thử một ví dụ là đọc trạng thái của Switch và hiện thị kết quả đọc đó ra Led đơn. Nhưng không hiểu sao em nó không chạy xin các anh chi giùm. Em có upload cả phần cứng lẫn phần mềm lên mong các anh bớt chút thời gian và cho lời giải thích! Thank! Không hiểu sao em không upload được Em mô tả qua phần cứng vậy: Các led đơn (7Led) được nối với PortF của dsPic30f4013, chân kia của Led đơn nối với trở 100 và được nối xuống đất. 8 chân của switch thì được nối với chân RB0-RB7 và chương trình chính như sau: Code:
void main() |
Trích:
- Với PIC và dsPIC thì nhất định phải cấu hình đầy đủ rồi mới viết chương trình, có nhiều bạn gặp nhiều lỗi khó hiểu, và đó là do cấu hình chip chưa đúng. - Bạn nối LED vào port F nhưng chương trình lại xuất ra port E! Thân, |
Trích:
http://www.picvietnam.com/forum/show...?t=1139&page=2 và Bác cho em hỏi Bác dùng Protues bản bao nhiêu thế Bác và có thể Download ở chỗ nào hả bác. Em đang dùng Protues 6.7 nhưng em tìm không thấy con DSPIC30F4011 mà trong bài hướng dẫn em thấy Bác vẽ. |
Trích:
Tôi dùng Proteus 6.9 SP1, phiên bản licensed của trường (Sheffield University). Symbol của dsPIC30F4012 đó là tôi tự vẽ ra, không có sẵn trong thư viện của Proteus đâu. Thân, |
Anh Nam cho em hỏi: trong code vidu3_1.s có dòng config như sau:
config __FOSC, CSW_FSCM_OFF & FRC_PLL4 ;Clock = 32 MHz Em đọc trong tài liệu dsPIC30F Family Reference Manual thì thấy với chế độ FRC_PLL4 thì clock chỉ bằng 7.37*4 MHz thôi, sao lại có clock=32MHz. |
Trích:
Tutorial được post vào tháng 08/2006 mà bạn. Thân, |
Bác namqn cho em hỏi tí, em vừa mới làm quen với dsPic em đang làm với con 30F3012, em sử dụng bộ kit dsPICDEM™ 2 DEVELOPMENT BOARD, thì có sử dụng được chương trình của bác không vậy.
Cảm ơn bác |
Trích:
Bạn sẽ cần phải định nghĩa lại các chân kết nối vào LCD theo như phần cứng của bạn, cấu hình lại chip cho thích hợp với dsPICDEM 2 và biên dịch lại chương trình. Vì bạn mới làm quen với dsPIC, bạn nên dùng các mã nguồn C30 mà tôi đã cung cấp, thay vì dùng các mã nguồn hợp ngữ. Thân, |
Bác namqn cho em hỏi, để định nghĩa lại các chân dât ko cùng 1 cổng như của bác, thì các code sau phải thay đổi lại như nào ah, ví dụ của em là D4 là C14, D5 là E8, D6 là D2, D7 là D1. Em dùng 30F4011
Trong code của bác dấu "_" có nghĩa là j thế ah, ví dụ _TRISF3 = 0. Em chưa hiểu về cách cấu hình cho dspic, bác có thể nói rõ thêm ko ah, Em đã xuất dc chữ ra LCD với CCS nhung em vẫn bị vài vấn đề như, em cho 1 ja trị value++ để xuất ra LCD thì giá trị ra cứ đến 7 (hoặc ở giá trị khác tùy vào em delay nhanh hay chậm) là reset về 0 đông fthowif lúc đó các kí tự trong LCD bì loạn lên. Hoặc khi em chỉ cho hiện chữ thôi và trong while(1) em chỉ cho nháy led, nhung led chỉ nháy dc 1 lúc rồi lại đứng yên rồi lại nháy tiếp, em đã tắt WDT bằng lênh setup_wdt(WDT_OFF) rồi, thậm chí em cho các bit trong RCON ( thanh ghi về các sự kiện resert) + 0 hết mà vẫn bị. Nên em thử chuyển qua C30 xem hiện tượng đó còn bị ko. Mong bác giúp em đây là đoặn em cấu hình cho chip Code:
#FUSES NOWDT //No Watch Dog Timer |
Trích:
_TRISF3 được định nghĩa là TRISFbits.TRISF3, cũng trong tập tin .h trên. Chỉ là một kiểu thay thế để viết code ngắn gọn hơn thôi. Thân, |
bác namqn ơi thế có cách nào định nghĩa 1 byte LCD_DATA gồm có 4 bít LCD_D4, LCD_D5, LCD_D6, LCD_D7, nếu dc thì sửa chân trong file LCD của bác sẽ đơn giản hơn nhiều,
|
Trích:
Thân, |
bác namqn, Em đã sửa file của bác để chạy được với cách nối chân LCD của em, đây là đoặn code
Code:
#include "p30f4011.h" Bác xem hộ em nhé |
Trích:
Ví dụ của tôi sử dụng chuỗi trong flash, vì nó là chuỗi hằng. Bạn hoàn toàn có thể thay chuỗi hằng đó bằng biến chuỗi (đã có bạn hỏi tôi về việc này, và tôi đã trả lời ở đây: http://www.picvietnam.com/forum/showthread.php?t=3053). Thân, |
em đã viết hàm xuất ra chuỗi giống hàm PutsXLCD của module XLCD, hàm như sau :
Code:
void LCD_PutChar( char *buffer) hoặc e khai báo như sau char * buffer; char mesg1[] = {'H','A','R','D','W','A','R','E','\0'}; buffer = mesg1; LCD_PutChar(buffer); Cả 2 cách trên thì chuỗi xuất ra trên LCD đều loạn cả lên. Em thử dùng cách printf(LCD_dat4,"DSPIC") giống CCS mà ko được, mình có cách nào lợi dụng hàm printf ko bác |
Trích:
Code:
void LCD_PutStr(char *buffer) Thân, |
Em xin post code mà em giao tiếp với LCD kiểu 4 bit, với các chân được set tùy ý theo phần cứng, bổ xung thêm theo code của bác hàm :
lcd_putstr("string here"); //Xuat 1 ky tu hay 1 chuoi ky tu lcd_gotoxy(int x, int y ); //Nhay den cot x, hang y Để bạn nào mới học như em có thêm nguồn tham khảo Em rất cám ơn bác namqn tận tình giúp đỡ em Code:
; Nhung tap tin can thiet khac: p30F4011.gld, p30f4011.h * |
Thầy Nam cho em hỏi: trong tutorial này thầy dung RE0->RE3 làm 4 chân data (D4->D7) của LCD , còn trong phần cứng của em , em dùng RE2 ->RE5 làm chân data cho LCD, vậy em phải làm sao để gi được dữ liệu cũng như lệnh cho LCD hả thầy , em đã thêm đoạn mã sau vào hàm " void LCD_cmd4(unsigned char cmd)" của thầy mà không được:
"#define LCD_LAT LATE //tin hieu Data cho LCD, chan RE2..RE5 #define LCD_TRIS TRISE //Tristate cua cac tin hieu Data unsigned temp1,temp2,i; LCD_RW_LAT = 0; //WRITE DATA TO LCD LCD_RS_LAT = 0; //Dat che do xuat lenh temp1 = LCD_LAT & 0xFFF0; //trang thai hien thoi cua LCD_LAT temp2 = temp1 | (cmd >> 4); LCD_LAT =(temp2<<2); //Xuat 4 bit cao ra RE5 toi RE2 LCD_EN_LAT = 1; //Tao xung Enable for (i = 0; i < 2; i++); //keo dai toi thieu 1 us LCD_EN_LAT = 0; " Mong thầy giup em Em cảm ơn thầy! Trân trọng ! |
Trích:
Thứ hai, mặt nạ để đọc trạng thái hiện thời của LCD_LAT không còn là 0xFFF0 nữa, mà phải là 0xFFC3 (tức là phải dùng lệnh temp1 = LCD_LAT & 0xFFC3). Thứ ba, xử lý xong dữ liệu cmd rồi mới OR với temp1 (tức là dùng temp2 = (cmd >> 4) << 2; rồi đến LCD_LAT = temp1 | temp2; ). Tổng hợp điểm thứ hai và thứ ba, cần dùng các lệnh sau: Code:
temp1 = LCD_LAT & 0xFFC3; //trang thai hien thoi cua LCD_LAT |
Thây Nam cho em hoi câu nữa là em dung dsPic 30f2010 vậy thì dong lệnh khai báo không gian PSV có phải thay đổi địa chỉ không hả thầy ? nếu em để vậy thì khi biên dịch nó lại báo lỗi ! là không định địa chỉ như vậy được .
Em cảm ơn thầy nhiều ! Trân trọng ! |
cho em hỏi hàm delay_ms(n) thì n max là bao nhiêu.
em đã thử với n>1000 thì thấy thời gian trễ lại nhỏ dần(ngược lại). |
Trích:
Một cách đơn giản để xử lý là bạn đặt bảng hằng số ở gần cuối bộ nhớ chương trình của dsPIC, bằng cách thay đổi địa chỉ trong phần address(). Chẳng hạn, với dsPIC30F2010 thì địa chỉ của từ nhớ cuối cùng trong flash là 0x1FFE, do đó bạn có thể dùng 0x1F00 cho bảng hằng số có dưới 128 phần tử. Thân, |
Trích:
Thân, |
Trích:
#define LCD_DAT _LATE #define LCD_TRIS _TRISE Nhưng nếu em thay hai hàng này bởi hai hang sau #define LCD_DAT LATE #define LCD_TRIS TRISE thì không còn báo lỗi ở đó nữa (em đang dùng dsPIC30F2010) ! xin chỉ em với tại sao lại vậy , với lại nếu nạp chương trình này vào thì nó có chạy nhưng không chính xác , LCD không hiển thị những kí tự mình mong muốn. Em cảm ơn thầy ! Trân trọng !. |
Trích:
Việc LCD của bạn không hiển thị không chính xác thì phải xem bạn khởi tạo và điều khiển LCD ra sao (đến giờ bạn chỉ đưa lên có một đoạn code liên quan đến hàm LCD_cmd4() thôi). Trong tutorial, tôi có ghi chú về trường hợp LCD mới, cần được khởi tạo đầy đủ (ở trang 10, về việc thực hiện quy trình khởi tạo đầy đủ như được nêu trong datasheet của HD44780U). Đề nghị bạn xem lại và đối chiếu với code của bạn. Thân, |
Trích:
em cảm ơn ! Trân trọng ! |
Trong TUTO này , thầy có dùng kí tự "\0" hình như là để nhận biết kết thúc một chuỗi cần hiển thị phải không thầy ? Thầy có thể nói rõ chố này dùm em được không? có phải đây là quy định của lập trình C ? ngoài ra còn có cách nào khác nứa không thầy ?
Em cảm ơn ! Trân trọng ! |
Trích:
Việc làm trễ bằng cách gọi nhiều lần một hàm cũng không có gì là không pro. Tuy nhiên, tôi viết các hàm làm trễ kiểu này chỉ cho mục đích làm trễ vài ms, chứ không dự định dùng nó để làm trễ vài giây, vì các hàm loại này sẽ block hoạt động của lõi xử lý trong vi điều khiển. Thân, |
Trích:
Bạn có thể dùng nhiều cách khác nhau để nhận biết điểm kết thúc của chuỗi ký tự. Chẳng hạn, bạn có thể dành ra một byte ở đầu chuỗi để theo dõi chiều dài thực của chuỗi (kiểu string của Pascal), hay có thể dùng một ký tự điều khiển như "\r" hay "\n" (kiểu kết thúc dòng lệnh của một số ngôn ngữ scripting). Tôi chọn dùng ký tự "\0" vì tập lệnh của dsPIC có sẵn lệnh so sánh với 0, do đó việc hiện thực sẽ hiệu quả hơn. Thân, |
Thầy Nam cho em hỏi: giả sử em đã có hàm hiện thị LCD là:
Void LCD_putstr(char *buffer) Vậy em phải làm sao để hiển thị giá trị của một thanh ghi nào đó (ví dụ như thanh ghi PR1) lên LCD hả thầy?. Em đã thử gọi như sau nhưng không được : LCD_putstr(PR1) ; Trong khi đó em gọi hàm này với đối số là chuối kí tự thì được. Em cảm ơn thầy nhiều ! Trân trọng ! |
Trích:
Để hiển thị giá trị của thanh ghi này lên LCD, bạn cần chuyển giá trị int của nó thành một chuỗi ký tự. Với MPLAB C30, bạn có thể dùng hàm sprintf() để làm việc này. Ví dụ cụ thể với chuỗi buffer của bạn: Code:
sprintf(buffer, "%d", PR1); Thân, |
Múi giờ GMT. Hiện tại là 03:59 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