[C5] Bài tập cuối khoá

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Tương tự như bài tập về C# vừa rồi, nhưng các bạn sẽ làm nhiều hơn thế để tổng hợp những gì chúng ta đã học trên lớp. Một GUI có thể quản lý các module đã học trên máy tính. Hình ảnh chỉ mang tính tham khảo, các bạn hãy làm lại theo ý của các bạn, có thể thêm vài module nữa tuỳ thích
Anh chỉ thêm vài module:
- I2C: để update giờ ngay lần chạy đầu tiên, sau đó các bạn có thể dùng timer trên C# để đếm.
- ADC: đọc các kênh portE khi bấm button Read.
- PWM: Khi có sự thay đổi trên numericUpDown thì gửi giá trị (duty cycle tính theo %) xuống chân tương ứng.
- LCD: mỗi textbox tương ứng với 1 dòng trên LCD.
Recommend các bạn gửi lệnh xuống PIC có cú pháp rõ ràng. Vd:
----------------------
Function code | Data |
----------------------
và PIC trả lại cũng có cú pháp tương tự để quản lý dễ dàng hơn. Đồng thời nên thử lại trước các module dưới con PIC rồi viết thành hàm cho dễ quản lý, tránh việc viết trong main wa nhiều (vd: viết thành hàm void pwm1_out(unsigned char duty_cycle), ...)
Bài tập mang tính tổng hợp lại những module các bạn đã học, do đó mỗi bạn phải tự làm để xem thử mình hiểu tới đâu và luyện khả năng code của mình.
Tuần sau chúng ta vẫn đi học để các bạn hỏi đáp về những vấn đề của bài tập. Tuần sau đó các bạn sẽ hoàn thành bài của mình và show cho 1 số anh chị trong BCN CLB đến dự xem. Cố lên nhé các bạn, sẽ có phần quà hấp dẫn giành cho bạn nào hoàn thành tốt nhất bài tập này.~^o^~~^o^~~^o^~
 

Attachments

nguyenhongduc_nc

Thành Viên PIF
Anh ơi,cái này mình có thể làm theo nhóm dc không a.....Như vậy sẽ nhẹ hơn và hiệu quả hơn ....
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Cũng muốn các bạn làm theo nhóm lắm, tại các bạn đi học rời rạc wa nên khó tìm được nhóm.
Các bạn cứ làm từng module rồi thứ 7 này đi học đầy đủ, anh sẽ cân nhắc lại chuyện này. Khi đó các bạn chỉ cần gộp code lại với nhau thôi
 

light

Thành Viên PIF
huhu, t7 này e phải đi học bù rồi, thầy bắt kiểm tra nữa mới đau
 

nqchanh

Thành Viên PIF
a.Sỹ, cho em hỏi tí !
-chỗ chọn baudrate cho cổng Com mình dùng lệnh nào vậy anh ?
-việc giao tiếp giữa chương trinh Visual Studio (VS) với MCU chủ yếu dựa trên giao tiếp UART thôi phải không anh ?
-về Function code||Data, em nghĩ mình chọn nó là một chuỗi thuộc kiểu byte chứ k phải kiểu char vì kiểu char có dạng như kiểu int, còn kiểu byte thì co dạng là 1 byte ?
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Chào em
- phần baudrate dùng combobox, có property item để add trước các giá trị mà khi chạy sẽ list xuống. Sau đó gán baudrate bằng COM.baudrate = (convert text combobox thành số);
- chương trình và MCU chỉ giao tiếp bằng UART.
- Việc chọn kiểu biến nào là tuỳ em thấy nó tiện lợi hoặc hay hơn cho code của mình.
 

nqchanh

Thành Viên PIF
-anh nói rõ hơn chỗ làm sao để add trước các giá trị của baudrate để mình lựa chọn đi a.Sỹ ! em kiếm trong property cua Combobox mà k biết chỉnh sữa chỗ nào cả!:confused:
-em thấy lệnh Write chỉ cho truyền sề kiểu string về, nếu em đặt data trong Function ||Data ( giả sử em đang dùng data cho mục đích tick vào các ô checkbox để bật tắt led ) là một kiểu nào đó như byte chẳng hạn ( mục đích của em là khi mình tick vào bit 0 thí gán data = 0x01, bit 1 thì gán data =0x02...rồi truyền giá trị của biến data về cho MCU), khi em muốn truyền về cho MCU thông qua UART thì phải làm sao anh ? em thử mà thấy cứ báo lỗi k cho!:confused:
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
trong property combobox có 1 hàng là items, click vào button rồi add từng giá trị baudrate vào.
Em chịu khó tìm hiểu nhé, với search google cái gì cũng có. Khi làm quen với 1 đối tượng nào mới anh đều hỏi bác google cả :)):)):)).
 

nqchanh

Thành Viên PIF
Nhưng mà bữa học tuần trước anh gợi ý tụi em làm theo hướng Function code||Data mà !! anh gợi ý tui em thêm tí về cách truyền Function code||Data về MCU đi anh !
 

40903219

Trứng gà
hôm bữa a Sỹ dạy và theo như mình hiểu thì nó củng như giải mã địa chỉ :
IPaddress|request|data = 1byte|1byte|2byte
phần data bạn có thể thêm bao nhiêu byte tùy ý
IPaddress bạn có 1 byte có nghĩa sẽ có 2^8-1 Function code
khi đã xác định được Function (tương ứng với 1 hàm con có chức năng định trước) thì ta sẻ có tiếp theo 1byte request,tương tự ta củng sẽ có 2^8-1 chức năng trong mỗi Function đã xác định.
việc làm tiếp theo chỉ là xuất data theo ý muốn.
P/S : ý kiến chủ quan, nhiều khi nó lạc đề =))
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Các bạn cứ lên đây thảo luận thoải mái, anh sẽ giúp đỡ. Nhưng các em phải cố gắng chịu khó suy nghĩ, khó wa mới hỏi chứ đừng gặp gì trục trặc là hỏi ngay. Phải tập cách giải quyết vấn đề khi chúng ta gặp phải 1 trục trặc, khúc mắc hay khó khăn.
@40903210: Vì chỉ truyền giữa PC và PIC (peer to peer) nên bạn có thể bỏ qua phần Address, chỉ có Function code và data thôi.
Anh đã làm xong bài tập của các bạn rồi đó, cố lên nhé các bạn ~^o^~~^o^~~^o^~
Tuần sau chúng ta sẽ trình bày bài tập của mình, có vài anh trong BCN đến xem đó. Đừng làm anh thất vọng nhé.
P/S: Phần thưởng là 1 board J-link debug hầu hết các dòng ARM-Cortex, có chức năng tương tự http://www.tme.vn/Product.aspx?id=1267#page=pro_info
Sẽ dành cho bạn nào hoàn thành thật tốt và có những sáng tạo thêm độc đáo, đồng thời có khả năng chém gió chút để trả lời các câu hỏi của các anh.
 

light

Thành Viên PIF
2 tuần rồi có tài liệu gì không a Sỹ, e không lên lớp được tiếc quá
 

cenakhoa

em thích màu hồng
anh ơi, anh có tài liệu nào viết gui cho visual studio ko, share em với, cái phần mềm này rộng quá, em kiếm tài liệu toàn là về mảng website :"<, hiện giờ em đang bị bí ở chổ làm sao lấy đc dữ liệu rx từ mcu truyền qua pc vào gui
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Anh nghĩ các bạn nên cài MSDN library của microsoft, nó có chú thích rõ tất cả các lệnh, đối tượng, ... Nói chung mọi thứ đều có cả, chỉ có điều chịu khó đọc tiếng anh thôi. Nó còn kèm theo vd ứng với mỗi thứ đó nữa.
@cenakhoa: Có 2 cách nhận dữ liệu trên PC từ MCU: sự kiện (giống ngắt trong MCU) và timer định thì đọc buffer nhận.
- Cách thứ 1 anh hay dùng trên lớp, đó là cái sự kiện Receive và dùng COM.readline();
- Cách thứ 2 là dùng timer định thì khoảng ?ms đó rồi vô dùng COM.Readexisting();
Còn cách nữa là giới hạn bộ đệm nhận khi nhận đủ n byte thì ngắt, cách đó anh chưa dùng bao giờ nên đang tìm hiểu.
@các bạn: chú ý theo dõi thông tin về thời gian học và phòng, vì có lúc trục trặc đột xuất nên anh thông báo trễ (có khi tối thứ 6 cũng nên).
 

nguyenhongduc_nc

Thành Viên PIF
hôm bữa a Sỹ dạy và theo như mình hiểu thì nó củng như giải mã địa chỉ :
IPaddress|request|data = 1byte|1byte|2byte
phần data bạn có thể thêm bao nhiêu byte tùy ý
IPaddress bạn có 1 byte có nghĩa sẽ có 2^8-1 Function code
khi đã xác định được Function (tương ứng với 1 hàm con có chức năng định trước) thì ta sẻ có tiếp theo 1byte request,tương tự ta củng sẽ có 2^8-1 chức năng trong mỗi Function đã xác định.
việc làm tiếp theo chỉ là xuất data theo ý muốn.
P/S : ý kiến chủ quan, nhiều khi nó lạc đề =))
Bạn có thể giải thích rõ hơn được không?
Hiện tại mình muốn gửi lệnh xuống PIC thì minh cho nó gửi 1 ký tự gì đó,ví dụ là :"1" rùi sao đó PIC kiểm tra nếu đúng ký tự đó thì thực hiện 1 tác động tương ứng ,nhưng anh Sỹ có nói gửi lệnh xuống PIC có cú pháp rõ ràng. Vd:
----------------------
Function code | Data |
----------------------
và PIC trả lại cũng có cú pháp tương tự để quản lý dễ dàng hơn.
Mọi người giải thích giúp mình với.....
 

40903219

Trứng gà
Function code chính là mã để VDK nhận dạng ta đang muốn thực hiện lệnh gì.
program của VDk gồm rất nhiều Function con (xuất LCD, Xuất Led, điều khiển động cơ...) đang đợi lệnh thực hiện từ PC nhưng làm thế nào để VDK có thể hiểu được yêu cầu từ PC trong khi data gửi xuống chỉ toàn là chuổi?. lợi dụng việc này ta sẽ add thêm Function code để VDK có thể nhận dạng được là PC đang yêu cầu làm gì. Function code cũng là data bình thường
ví dụ : ta muốn gửi data là chuổi "PIF" để xuất ra LCD thì bạn sẻ add thêm code là 0000001|data| vậy khi VDK nhận dữ liệu sẽ nhận lun code 00000001 và sẻ lấy cái này đi kiểm tra xem nói tương ấn với cái Function con nào trong program
if(FunctionCode==00000001)
{
Xuat_LCD(data); // code of LCD function is 00000001
}
if(FunctionCode==00000011)
{
Xuat_Led7Seg(data); // code of Led7Seg function is 00000001
}
.
.
.
.
tương tự như vậy ta có thể gán cho nhiều Function con khác. và chú ý Function code ở PC phải đồng bộ với VDK
 

nguyenhongduc_nc

Thành Viên PIF
Cám ơn bạn rất nhiều,bài viết của bạn rất cụ thể
Nhưng mình vẫn còn 1 thắc mắc là làm sao gửi Function code xuống được.Vì Function code là 1 chuổi 00001
Vì mỗi lần mình kiểm tra chỉ được 1 kí tự .
VD: c=RCREG; thì c chỉ nhận 1 lần 1 kí tự . .Biến c mình khai báo là unsigned char c;
Không biết mình có sai chổ nào không nữa
Ah mình có 1 câu hỏi nữa là sự khác nhau giữa 2 khai báo này
char a[]="aaaa";
char *a="aaaa";
Nhờ mọi người giúp đỡ
 

40903219

Trứng gà
bạn nên nhận hết tất cả dữ liệu rồi hãy kiểm tra. giả sử dữ liệu của bạn là 4byte + 1byte cho Function code = 5byte cần nhận ở VDk.cho vào vòng lặp
for(i=0;i<5;i++)
{
c=RCREG;
Data=c; //biến Data[] là biến toàn cục
}
như vậy ta đã tách dữ liệu ra thành 5 byte riêng biệt và byte thứ 5 là Function code (Data[4])
lấy Data[4] đem kiểm tra để xác định Function con. done!
.........................................................................
char a[]="aaaa"; // chỉ là array một chiều bình thường, với data sẻ chứa trong a[];
char *a="aaaa"; // data pointer , dùng cách này thì ta sẽ quản lí dữ liệu một cách linh hoạt hơn bởi chỉ thông qua address ( indirect) của dữ liệu
bạn có thể tham khảo trong cuốn tin học 2!
 

Tan Sy Nguyen

Cố Vấn CLB
Staff member
Nên dùng các hàm có sẵn trong thư viện uart.h nhé các bạn
unsigned char biến;
biến = uart_getc();

unsigned char string[số byte cần];
uart_gets(&string);
 
Top