Mới học PIC - hỏi về USB
Sau khi băn khoan một chút thì cuối cùng tui đã quyết chọn PIC cho một ứng dụng mà mình có nhiệm vụ phải triển khai. Tui đang có nhiệm vụ thiết kế bộ lưu dữ liệu vào thẻ MMC thấy khó quá mong được chỉ bảo nhiều. Cảm ơn các anh em đã không quản công sức của mình để lập lên diễn đàn này!
|
Nếu bạn đã học PIC rồi thì ta bàn tiếp, nếu chưa thì anh luyện công đi đã, để còn được cái này anh có thể học 16F877A hoặc con nào tương đương nếu muốn sử dụng giao tiếp RS232 để giao tiếp với máy tính.
Hoặc 18F4550,F2550 để làm giao tiếp USB. Một số trình dịch có hỗ trợ đọc thẻ MMC qua giao tiếp SPI ví dụ như mikroC. Trên trang chủ Microchip cũng có project đọc thẻ MMC giao tiếp qua USB sử dụng Microchip C18. |
nhờ bác PTH chỉ giáo !
:D
??? "Nếu bạn đã học PIC rồi thì ta bàn tiếp, nếu chưa thì anh luyện công đi đã, để còn được cái này anh có thể học 16F877A hoặc con nào tương đương nếu muốn sử dụng giao tiếp RS232 để giao tiếp với máy tính. Hoặc 18F4550,F2550 để làm giao tiếp USB." Em vừa mới đọc sơ qua con PIC 18F458 khi nãy mà không thấy nó nói có giao diện vật lý chuẩn RS232.Mà bác Hòa cho em hỏi thêm USB và RS232 có gì khác nhau không vậy.Và "để làm giao tiếp USB" thì em cần những gì về mặt kiến thức và công cụ vậy bác. ??? "Một số trình dịch có hỗ trợ đọc thẻ MMC qua giao tiếp SPI ví dụ như mikroC. Trên trang chủ Microchip cũng có project đọc thẻ MMC giao tiếp qua USB sử dụng Microchip C18." Xin hỏi bác Hòa đọc thể MMC em có cần biết về FAT hay NTFS không hay cứ đọc byte vật lý của nó là được !!! ??? "Nếu bạn đã học PIC rồi thì ta bàn tiếp" Nếu chưa học PIC có được bàn tiếp không vậy !!! :D Chúc vui |
Không có gì là không được bàn, nhưng tốt nhất các bạn cũng nên bắt đầu với những bài học cơ bản, và hiểu được bản chất vấn đề.
Điều Thái Hoà nói ở đây, không phải là việc học PIC, mà học về các kiến thức khái niệm nói chung. Có lẽ Hoà nói chưa được rõ ràng về mặt bản chất thôi. Muốn biết dùng giao tiếp USB, thì các bạn phải hiểu USB là gì, có một bài trao đổi của qmk tôi copy về giới thiệu khái quát về USB. Muốn dùng PIC để giao tiếp USB, thì bạn cũng phải hiểu sơ lược PIC là gì, như thế nào.... Hầu hết các dòng PIC đều cho phép giao tiếp RS232, đó là khối chức năng USART của PIC, chính vì các bạn không đi từ cơ bản để hiểu rõ nó, nên thường có những câu hỏi thừa. Mong các bạn đọc bài đầu tiên trong phần tài liệu tiếng Việt. Chúc vui. |
Vui đây !
Trích:
Giao diện vật lý chuẩn RS232 trong 18F458 có và có trong mọi con PIC từ 18 chân trở lên. Nếu bạn tìm từ RS232 trong datasheet của PIC thì bạn chưa làm module này bao giờ, nó là bộ USART (ADDRESSABLE UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER). Còn muốn hỏi USB khác RS232 ở chỗ nào, thì tui luôn sẵn sàng chat với bạn:thaihoa_tchya. Trích:
Quyển thứ hai tui đánh giá là hay là quyển USB Complete của Jan Axelson. Còn một quyển khác đọc cho vui là USB by Examples. Bản bang Microchip có kha khá Appnotes về USB, cả code nguồn = HTPICC cho USB1.1 và code = C18 cho USB 2.0 Appnotes thì có: AN1003,AN950,AN956... Về mặt công cụ, cần có PIC hỗ trợ USB, với USB 1.1 thì có dòng PIC16C745, còn USB2.0 thì có dòng 18F2455,2550,4455,4550. Trình dịch thì cần có một trình dịch PIC hỗ trợ loại PIC mà bạn đang dùng: HTPICC18, CCS bản gần đây (tui không nhớ bản nào nó hỗ trợ USB), PicBasic Pro bản 2.46, Microchip C18 bản 2.0 trở lên. Về đồ ăn sẵn thì có Easy HID (free) đi với PICBasic, CCS, Windriver của Jungo. Về phát triển Driver trên Windows thì bạn biết cái nào viết cái ấy, C++,Basic,Delphi,C#, tui phát triển Driver = Delphi. Trích:
Trích:
Chúc vui :D |
Trích:
Quyển "USB design by example _ John Hyde", ai có nhu cầu cứ lên tiếng. :D Còn cái quyển được gọi là chính tông võ học thì chưa biết được mặt mũi nó như thế nào. À, nhớ quyển đó rồi. Nó đi sâu về cấu trúc vật lí của USB 1.0 cũng như 2.0 Món này cũng khoái lắm, nhưng chưa có nhiều thời gian để tìm hiểu sâu hơn. Bác nào thành thạo món này rồi có thể chia xẻ bằng một số Tutorial không?? :D |
USB Spec. thì vào www.usg.org mà download (gần 8 MB đó, đừng download ở nhà!). Đã là spec. thì phải công bố người ta mới theo được chứ.
Thân, |
Nhân tiện việc mở ra luồng mới này, tại sao chúng ta không đặt vấn đề tiếp cận với USB một cách nghiêm túc hơn, chứ không đơn thuần là các trao đổi nho nhỏ như vậy nữa.
Mình sẽ trao đổi theo từng vấn đề một, chẳng hạn, đầu tiên là cấu trúc lớp vật lí, sau đó là các giao thức, giao diện, ..., cuối cùng là ứng dụng nó như thế nào. Làm theo cách của anh NTVinh á, ảnh đề cập đến các vấn đề của RS485 theo phương pháp tương tự dựa trên OSI. Mình sẽ làm điều này với USB. Các bác thấy thế nào? :D |
Trước tiên, mình sẽ tập hợp các tài liệu liên quan đến PIC, USB và USB với PIC vào luồng này, mọi người sẽ cùng nghiên cứu và cùng thảo luận, cùng xây dưng các vấn đề một cách hệ thống hơn.
Hiện giờ mình chỉ có thể làm được đến như vậy thôi, đợi thi xong sẽ cung mọi người nghiên cứu. Mình nghĩ như vậy thì các thông tin trao đổi sẽ thự sự có giá trị tích cực và có thể sử dụng để tham khảo. |
http://dientuvietnam.net/forums/show...%A1y+t%C3%ADnh
Đây là luồng thảo luận về USB, share "USB Complete" và các link có liên quan. http://www.flazx.com/directdownload3956.php Đây là link download "USB design by example". http://www.microchip.com/stellent/id...0&filterID=404 Một số App Note liên quan đến USB của Microchip. "USB spec" download tại link anh Nam cung cấp. Nhiêu đây là đủ xài rồi. Nếu không muốn nói là quá đủ. :D |
Falleaf: Các link này đã bị hư, F sẽ giúp Bắc post lại cho mọi người sau.
|
các bạn vô trang web này khá hay đấy
http://beyondlogic.org/ |
Ha ha, thread nào bàn về USB cuối cùng cũng kết thúc bằng phần share doc. Kinh nghiệm tui rút được cả từ dtvn tới picvietnam.
Sao mấy bác ko mua 1 con 4550 về làm mạch, nạp cái mấy cái firmware của mc rồi chạy thử. Sau đó anh em mổ xẻ cái fw đó, chứ kiểu này chán lắm, chỉ toàn lan man. |
Cuốn "USB COMPLETE" này có bìa đàng hoàng nè.
hehe. http://mprc.pku.edu.cn/~gaohaibin/st...20Edition).pdf |
không thấy diễn đàn này nói về kiến trúc máy tính nhỉ !!!
He he he !!! Không thấy các bạn nói về kiến trúc máy tính mà chỉ thấy nói về RS232 với USB phải chăng các bạn định giải bài toán hộp đen chắc ???
|
ok với ý kiến của bác bvk. Để bàn về USB, mọi người đều cần fải có hiểu biết về giao diện vật lý, giao thức truyền, các bước điểm danh để nhận thiết bị USB của Host USB (tất nhiên có sơ qua chút ít lquan đến kiến trúc máy tính). Sau khi đã làm được cái mạch test cắm vào cổng USB của máy tính (fw nạp vào) mà nó chạy ngon lành rồi chúng mình cùng phân tích để viết nên một Tu. về USB. Chứ cứ bàn về chủ đề TL thì...chậc... chậc ...chán như con gián chết. mông lung tung lắm.
Theo ý kiến cá nhân tui, USB Spe.. đọc là ok rồi. Cấu trúc của USB và giao thức USB cũng có thể được phân tích ra theo mô hình OSI (như bác ntc nói đó) tui xin mạn phép phân tích và gửi file kèm theo sau. Ai đã nạp fw rồi, chúgn mình cùng share nhé, tui nạp cái fw chạy ầm ầm, dùng Tiousb hay wdriver cũng được, cái chính là tui chưa hiểu rõ lắm về code của nó. Đã ai làm bằng cách này chưa? bàn bạc giúp với. mình có thể viết một cái driver cho USB được đấy. |
Bác này có vẻ hăng hái về USB quá nhỉ, hà hà. Quan điểm của tớ là ko làm driver chỉ làm fw nên thật ra tớ chẳng biết gì về driver hết. Toàn xài đồ làm sẵn thôi. Fw thì ko khó tớ làm rồi, bắt đầu hoàn toàn từ con số 0, nhưng chưa hoàn thiện, chỉ ở mức sơ khai mà thôi. Nêu bác có ý định bắt đầu với fw trước thì tớ có thể góp ý với bác được. Vì cũng mong là có được cái tut USB do hồi mới bắt đầu làm lùng sục khắp net cũng chẳng thấy được cái nào.
|
Trích:
Bác bvk chỉ giáo giúp nhé. Bắt đầu với fw. tui mới tập tễnh vào USB thôi. |
Mình đang học về USB mong mọi người giúp đỡ.
Xin hỏi cách sử dụng thư viện mpusbapi.dll của Microchip. Để sử dụng thì cần dùng firmware nào ? Mình down file MicrochipCustomDriver về setup rồi mà chưa biết sử dụng thế nào. |
http://www.comvcon.com/default.asp
Bạn vào đây để đọc thêm. Trong đó có cả một số ví dụ để sử dụng thư viện liên kết động mpusbapi.dll. Trong đó có 4 phần hướng dẫn sử dụng thư viện. Phải đọc hết. Chịu khó đọc kĩ một chút. :) Về MicrochipCustomDriver, phải tìm hiểu code thật kĩ mới sử dụng được. Đó là cái sườn cơ bản cho firmware giao tiếp USB, tìm hiểu đến nơi đến chốn bạn sẽ biết được việc chèn thêm code của mình vào chỗ nào để phát triển các ứng dụng cho riêng mình. |
Cảm ơn ntc, trang web đó có hướng dẫn thật tuyệt. Mình làm theo ok rồi.
Mình đã sửa file user.c để có thêm request của mình. Nhưng sao tốc độ chậm thế nhỉ, mình cho truyền liên tục từ firmware lên chỉ đạt 16KByte/s (mở EP1, chế độ Bulk, 64 bytes) Đọc trên forum của Microchip thấy có người dùng mpusbapi.dll này được 0.5Mbits/s (~62.6 KBytes/s). Làm thế nào để nâng cao tốc độ nhỉ? Các bạn đã làm thực tế ở đây đạt được tốc độ là bao nhiêu? Theo bạn thì để có tốc độ cao thì nên làm theo cách nào? + Mở nhiều endpoint ? (cái này mình còn mơ hồ về cách truyền nhận khi có nhiều endpoint) + Dùng class khác ? (CDC, Custom?) .... |
Trích:
Nếu bạn dùng CDC thì tốc độ đạt gần 1Mbits nhưng sẽ gặp vấn đề chương trình giao tiếp với COM trên PC, viết bằng VB thì mình chưa thấy thằng nào hỗ trợ ở tốc độ đó. Delphi thì no problem. Để hiểu thêm về giao tiếp qua EP, bạn có thể dùng WinDriver, nó giao tiếp qua EndPoint đó, khi khởi tạo bạn chọn EPIN, OUT, khi lập trình bạn tương tác với các EP này. |
Trong cái ví dụ sử dụng thư viện dll, người ta xây dựng theo kiểu truyền đi, xong chờ nhận lại kết quả, rồi mới tính tiếp, mỗi lần truyền nhận như vậy delay tới 1s, do đó không thể nhanh được.
Bạn thử hạ thời gian delay xem thế nào, xem thử hạ tới đâu thì vẫn còn hoạt động tốt, xong rồi thông báo kết quả lên đây, để anh em thảo luận thêm. Làm theo vi dụ này, có thể tạm ứng dụng trong điều khiển với dung lượng dữ liệu cần truyền nhận nhỏ. |
Dùng cái thư viện dll đó đúng là kiểu hỏi đáp nên tốc độ chậm thật. Còn cái tham số delay là thời gian để hàm timeout nên ko cài thiện tốc độ gì cả.
Mình lọ mọ trên forum của Microchip thấy có topic hay quá. Tác giả Brad Minch đã xây dựng 1 firmware nhỏ gọn mà dễ hiểu. Chỉ duy nhất 1 file .c và 1 file .h thôi. Thành ra đọc rất dễ hiểu. Lại viết theo kiểu xử lý tuần tự từng request nên đọc hiểu được rất nhiều về USB. Các bạn mới bắt đầu như tớ nên đọc cái này trước. Topic: http://forum.microchip.com/tm.aspx?m=89669 Website: http://pe.ece.olin.edu/ece/ Đảm bảo dễ hiểu hơn firmware của Microchip. Mình đã dịch bằng C18, chạy với PIC8F4550 20Mhz rất tốt. |
Trích:
Em thử hạ thời gian xuống, cỡ trên 10ms thì ổn định. Còn nếu <10ms thì lỗi độ dài dữ liệu nhân được < độ dài được chỉ định. |
Tôi phân tích tiếp xem thế nào nhé :).
Cái ví dụ của microchip dùng trễ 100ms MPUSBRead(myInPipe,ReceiveData,ExpectedReceiveLeng th,ReceiveLength,100); bây giờ dịch tìm cái nguồn của hàm này, buộc dịch lại dll. trong file nguồn ta thấy: /////////////////////////////////////////////////////////////////////////////// // MPUSBRead : // // handle - Identifies the endpoint pipe to be read. The pipe handle must // have been created with MP_READ access attribute. // // pData - Points to the buffer that receives the data read from the pipe. // // dwLen - Specifies the number of bytes to be read from the pipe. // // pLength - Points to the number of bytes read. MPUSBRead sets this value to // zero before doing any work or error checking. // // dwMilliseconds // - Specifies the time-out interval, in milliseconds. The function // returns if the interval elapses, even if the operation is // incomplete. If dwMilliseconds is zero, the function tests the // data pipe and returns immediately. If dwMilliseconds is INFINITE, // the function's time-out interval never elapses. // // Note that "input" and "output" refer to the parameter designations in calls // to this function, which are the opposite of common sense from the // perspective of an application making the calls. // DWORD MPUSBRead(HANDLE handle, // Input PVOID pData, // Output DWORD dwLen, // Input PDWORD pLength, // Output DWORD dwMilliseconds) // Input { BOOL bResult; DWORD nBytesRead; OVERLAPPED gOverlapped; DWORD dwResult; dwResult = MPUSB_FAIL; // set up overlapped structure fields gOverlapped.Internal = 0; gOverlapped.InternalHigh = 0; gOverlapped.Offset = 0; gOverlapped.OffsetHigh = 0; gOverlapped.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); if(pLength != NULL)*pLength = 0; // attempt an asynchronous read operation bResult = ReadFile(handle,pData,dwLen,&nBytesRead,&gOverlapp ed); if(!bResult) { // deal with the error code switch (GetLastError()) { case ERROR_HANDLE_EOF: { // we have reached the end of the file // during the call to ReadFile break; } case ERROR_IO_PENDING: { // asynchronous i/o is still in progress switch(WaitForSingleObject(gOverlapped.hEvent, dwMilliseconds)) ... tôi trích đến đây vì thấy hàm WaitForSingleObject(...). Tham khảo link sau để thấy nó làm gì http://msdn.microsoft.com/library/de...ngleobject.asp như vậy ta có thể thử với biến dwMilliseconds, Các bạn tiếp tục xem thế nào. |
Trích:
Nhưng mà mấy byte cũng được, quan trọng là dựa vào số byte truyền và thời gian truyền nhận, mình có thể cân đối thời gian delay một cách hợp lí để tăng tốc độ truyền nhận lên. Trích:
Trích:
|
sau khi dọc bằng lệnh
// attempt an asynchronous read operation bResult = ReadFile(handle,pData,dwLen,&nBytesRead,&gOverlapp ed); người ta kiểm tra kết quả trả về if(!bResult) { KL1 } else { KL2 } Mục đích của KL1 là nếu đọc chưa được thì đợi, đọc và cập nhật lại bResult. Do đó sủ dụng lệnh WaitForSingleObject(gOverlapped.hEvent, dwMilliseconds) Như vậy tốc độ < 1Khz. Nhưng ngay cả khi minh lấy dwMilliseconds=10, truyền 10Byte vẫn lỗi. Bây giờ ý mình là ko đợi nữa, if(!bResult) { CancelIo(handle); break; } else { KL2 } ResetEvent(gOverlapped.hEvent); CloseHandle(gOverlapped.hEvent); Có ok không nhỉ ? |
Trích:
Mình không cần delay, chỉ cần hỏi vòng trị trả về của hàm MPUSBRead. Làm như vậy sẽ tận dụng được tối đa khả năng truyền nhận, và giảm bớt khoảng thời gian delay thừa. Ví dụ, mình cần nhận 10 byte, mình chọn thời gian delay là 10 ms. Giả sử sau khi time out (hết 10 ms), mới đọc được có 9 byte, thì vẫn phải tiếp tục delay thêm 10 ms chỉ để đọc nốt 1 byte còn lại, như vậy thời gian delay thừa sẽ phát sinh. Cái này giống như kiểu, ngư một giấc, thức dậy hỏi, xong chưa? chưa xong hả? ngủ tiếp! thức dậy hỏi ... Mình cứ break, kệ nó, cho nó đọc thoải mái, chỉ cần biết là đã xong hay chưa thôi (dựa vào trị trả về của hàm MPUSBRead) để xử lí tiếp. Như vậy ta có thể xác định chính xác hơn thời điểm kết thúc truyền nhận, và tận dụng được tối đa khả năng truyền nhận. Cái này giống như kiểu, hỏi liên tục, xong chưa? xong chưa? chưa xong hả? làm tiếp đi? xong chưa? ... Nhưng nhiều khi cái thời gian hỏi lòng vòng lại nhiều hơn thời gian delay ấy nhỉ. :D |
Trích:
Trích:
Hì, ở đây tớ hỏi nhé, ko phải xỏ xiên gì đâu :) |
ban thử với dll mình dịch xem có chạy ko, nếu báo lỗi gì thì post lên nhé, hì, sau phân tích tiếp, mình giờ ko có dk để thử
|
1 Attachment(s)
zip lai moi gui duoc :)
|
1 Attachment(s)
cái hồi nãy dịch bằng VC, cái này dịch bằng BC, bạn thử luôn cả 2 cái nhé :)
|
hix trưởng lão hungbkhn thông cảm, vì em ko làm vụ này, thấy bác đưa ra ý tưởng thì em thử vặn lại thôi, để xem em có hiểu đúng ý các bác ko, hay ý tưởng của bác ko khả thi. Do đó code của bác em ko thử được.
|
Em down cả 2 file dll trên về chạy đều bị lỗi không chạy được.
"console.exe has encountered a problem and needs to close. We are sorry for the inconvenience." |
toi vua thu lai file dich bang BC++, no chay OK, chỉ có điều khi dịch lại hàm gọi ko dùng dấu gạch ở đầu "_" của hàm gọi.
Tôi cũng ko làm về cái món PIC này, chỉ là gần đây có việc phải dùng nên đọc một tí thôi, nhân tiện hỏi mọi người tí :) cho nhanh. Tôi viết một đoạn lọc IIR, hoặc dùng mềm hoặc cứng. Câu hỏi là: - trên delphi có cái VCL nào ngon cho mình chọn tham số bộ lọc "online" (dùng bộ đệm), nếu có chỉ cho tôi với (share cho nhanh một ví dụ nữa thì tốt) :). - dưới PIC18 thi giải pháp là gì ? Thanks trước |
Bác làm nó chạy ngon rồi, bác cho một cái tutorial đi ạ :D
|
hỏi một ngày vẫn ko ai giúp, nên đưa ra giải pháp thế này:
- trên PC tự viết với từng bộ lọc, mỗi lần thử lại phải tính, ko linh động lắm, có một người bảo dùng DCDSPFilter_v1.03_Source nhưng vẫn chưa đọc dùng thế nào, có bạn nào dùng rồi bảo tôi tiếp :) - dưới PIC dùng AN 852, gọi asm từ C18, mình nhúng hàm lọc vào C là được (user manual). cách 2 viết mỗi bằng C: ví dụ bộ lọc 50Hz Notch: O(n)=[4096*I(n)-6627*I (n-1)+4096*I(n-2)+6211*O(n-1)-3598*O(n-2)]>>12 Cách viết thứ 2 theo mọi người có đúng không, tôi chỉ hỏi ý về khả năng chạy thôi chứ không về hệ số :) |
Tôi thâý mâý bạn chuyển tờ liêụ khó quá nên giơí thiêụ một trang chuyển taỉ vô tư và săn mở luôn cho diễn đàn
mediamax.com USERNAME:picvietnam PASSWORD:pic1234 |
Trích:
txmvt4@yahoo.com |
Múi giờ GMT. Hiện tại là 06:36 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