Kì này mình có làm giúp mấy đứa bạn đề tài như dzầy: Dùng PIC18F4550 đo dạng sóng của tín hiệu sau đó truyền lên máy tính bằng vẽ đồ thị qua cổng RS232, phần mềm trên máy tính viết bằng C#.
Sau mấy tháng làm tìm hiểu cũng làm được một phần rùi, hôm nay mình POST lên đây để anh em cùng thảo luận.
Lý do dùng PIC18F4550 là mình muốn phát triển đề tài này lên thành giao tiếp USB.
Hiện tại mình mới chỉ gửi được dữ liệu từ PIC18F4550 lên máy tính qua cổng COM và vẽ được đồ thị. Mình giả lập các tín hiện (dạng sin, cos, vuông, ...) bằng các hàm toán trong PIC, sau đó truyền 100 mẫu lên máy tính. Chương trình trên máy tính sẽ nhận và xử lý dữ liệu nhận sau đó vẽ đồ thị.
Do ADC của PIC là 10 bit nên mình truyền mỗi mẫu thành 2 byte, mỗi byte chứa 7 bit mẫu dữ liệu. Truyền byte cao trước, byte thấp sau, giải thuật truyền như sau:
1. Đầu tiên truyền 2 byte DLE và STX (DLE mình qui định là ký tự 'D', STX là 'A')
2. Sau đó truyền các byte dữ liệu, nếu byte dữ liệu trùng với DLE thì thêm 1 byte DLE ở phía trước.
3. Cuối cùng kết thúc bằng 2 byte DLE và ETX (ETX mình qui định là 'Z')
Sau khi truyền lên máy tính mình sẽ xử lý như sau:
1. Đọc chuỗi dữ liệu cho đến khi gặp 2 ký tự là "DZ".
2. Thay thế chuỗi "DD" bằng "D"
3. Bỏ đi chuỗi "DA" (thay thế "DA" bằng chuỗi rỗng)
Như vậy với 100 mẫu dữ liệu và tốc độ baud là 9600 baud thì mình tính được thời gian truyền như sau:
1. Tối thiểu: Khi dữ liệu không có chứa byte nào trùng với DLE => truyền tổng cộng là 204 bytes. Thời gian truyền: 204*10/9600 = 0.21 s
Sở dĩ nhân 10 là do mình truyền: 1 bit start + 8 bits dữ liệu + 0 bit parity + 1 bit stop
2. Tối đa: Khi tất cả các byte dữ liệu đều trùng với DLE => truyền tổng cộng là 404 bytes. Thời gian truyền là: 404*10/9600 = 0.42 s
Chi tiết thì các bạn đọc thêm trong Code nha.
Kết quả mình được như sau:
Source code
Code MikroC và file Mô phỏng: http://www.mediafire.com/download.php?yqi11ihq1ic79ea
Code C# & Demo: http://www.mediafire.com/download.php?331kljbjv4536hs
Chương trình trên máy tính mình dùng COM3, ở Proteus là COM2. Các bạn dùng phần mềm tạo cổng COM ảo nối 2 cống COM này lại nha. Trong mạch mô phỏng mình nối trực tiếp cổng COM vào chân vdk cho đơn giản, chỉ dùng để mô phỏng thôi không làm được như vậy với mạch thật nha các bạn.
Mình sẽ tiếp tục làm, khi nào làm kha khá sẽ up lên tiếp, chúc vui...
Sau mấy tháng làm tìm hiểu cũng làm được một phần rùi, hôm nay mình POST lên đây để anh em cùng thảo luận.
Lý do dùng PIC18F4550 là mình muốn phát triển đề tài này lên thành giao tiếp USB.
Hiện tại mình mới chỉ gửi được dữ liệu từ PIC18F4550 lên máy tính qua cổng COM và vẽ được đồ thị. Mình giả lập các tín hiện (dạng sin, cos, vuông, ...) bằng các hàm toán trong PIC, sau đó truyền 100 mẫu lên máy tính. Chương trình trên máy tính sẽ nhận và xử lý dữ liệu nhận sau đó vẽ đồ thị.
Do ADC của PIC là 10 bit nên mình truyền mỗi mẫu thành 2 byte, mỗi byte chứa 7 bit mẫu dữ liệu. Truyền byte cao trước, byte thấp sau, giải thuật truyền như sau:
1. Đầu tiên truyền 2 byte DLE và STX (DLE mình qui định là ký tự 'D', STX là 'A')
2. Sau đó truyền các byte dữ liệu, nếu byte dữ liệu trùng với DLE thì thêm 1 byte DLE ở phía trước.
3. Cuối cùng kết thúc bằng 2 byte DLE và ETX (ETX mình qui định là 'Z')
Sau khi truyền lên máy tính mình sẽ xử lý như sau:
1. Đọc chuỗi dữ liệu cho đến khi gặp 2 ký tự là "DZ".
2. Thay thế chuỗi "DD" bằng "D"
3. Bỏ đi chuỗi "DA" (thay thế "DA" bằng chuỗi rỗng)
Như vậy với 100 mẫu dữ liệu và tốc độ baud là 9600 baud thì mình tính được thời gian truyền như sau:
1. Tối thiểu: Khi dữ liệu không có chứa byte nào trùng với DLE => truyền tổng cộng là 204 bytes. Thời gian truyền: 204*10/9600 = 0.21 s
Sở dĩ nhân 10 là do mình truyền: 1 bit start + 8 bits dữ liệu + 0 bit parity + 1 bit stop
2. Tối đa: Khi tất cả các byte dữ liệu đều trùng với DLE => truyền tổng cộng là 404 bytes. Thời gian truyền là: 404*10/9600 = 0.42 s
Chi tiết thì các bạn đọc thêm trong Code nha.
Kết quả mình được như sau:
Source code
Code MikroC và file Mô phỏng: http://www.mediafire.com/download.php?yqi11ihq1ic79ea
Code C# & Demo: http://www.mediafire.com/download.php?331kljbjv4536hs
Chương trình trên máy tính mình dùng COM3, ở Proteus là COM2. Các bạn dùng phần mềm tạo cổng COM ảo nối 2 cống COM này lại nha. Trong mạch mô phỏng mình nối trực tiếp cổng COM vào chân vdk cho đơn giản, chỉ dùng để mô phỏng thôi không làm được như vậy với mạch thật nha các bạn.
Mình sẽ tiếp tục làm, khi nào làm kha khá sẽ up lên tiếp, chúc vui...
Comment