Thông báo

Collapse
No announcement yet.

[PIC 18] Mô phỏng giao tiếp USB với Proteus 7.2 SP2

Collapse
This topic is closed.
X
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • [PIC 18] Mô phỏng giao tiếp USB với Proteus 7.2 SP2

    Chắc mọi người đều quan tâm đến giao tiếp USB giữa PIC và vì sự tiện lợi của nó, dòng PIC18F2550/4550/2455/4555 của Microchip hỗ trợ USB, tuy nhiên, để một mô hình có thể chạy tốt trong thực tế thì việc mô phỏng để chuẩn đoán, test chương trình là một điều nên làm để mô hình đó được tối ưu. Phiên bản Proteus 7.2 SP2 có cung cấp chức năng mô phỏng giao tiếp USB với PIC 18F4550, cực kỳ lợi hại, họ tạo ra 1 Virtual USB hub và cung cấp khả năng kết nối thiết bị USB trong Proteus với máy tính.

    Ở bài viết này, mình chia sẻ kinh nghiệm về cách sử dụng Proteus để mô giao tiếp USB, mã nguồn firmware giao tiếp dùng mã nguồn ví dụ của CCS C, mục đích chủ yếu để mọi người biết cách mô phỏng giao tiếp USB sử dụng Proteus.

    Đầu tiên, bạn phải vào thư mục [C:\Program Files\Labcenter Electronics\Proteus 7 Professional\USB Drivers] nếu những cài đặt Proteus của bạn theo mặc định, Chạy chương trình installer.exe, nhấn install, sau khi thành công, trông như sau:

    Tiếp theo, khởi động CCS C, mở ví dụ ex_usb_mouse.c trong thư mục [C:\Program Files\PICC\Examples], xem cần phải vẽ mạch như thế nào để mô phỏng ví dụ này, và nhớ nếu complie file này, phải tùy chọn là pic8f4550 nhé, có thể trông như sau:

    Rồi, giờ khởi động Proteus và vẽ mạch như sau, nhớ ra Proteus phải từ phiên bản 7.2 SP2 thì mới có Pic18F4550 nhé, không cần vẽ chi tiết, vì đây là mô phỏng:


    Được rồi, giờ trở lại CCS C, sửa sơ lại chương trình của người ta cho phù hợp với yêu cầu của mình, xóa bỏ những cái không cần thiết, định nghĩa lại LED, mã nguồn có thể sửa lại như trong file gởi kèm.

    Tiếp theo, tiến hành mô phỏng, bạn chỉ việc ấn play, xem kết quả, con trỏ sẽ chạy vòng vòng, thú vị lắm , nhớ click vào cái usbconn để nó kết nối nhá, các linh kiện có thể tìm nhanh với tên như sau: pic8f4550, usbconn, led green, 330k, ...

    Kết quả mô phỏng:


    File gởi kèm bao gồm file mô phỏng file hex và file ex_usb_mouse.c đã sửa.

    Attached Files
    Last edited by minhtuan04; 02-06-2008, 14:14.
    Diễn đàn Vi điều khiển:

  • #2
    @minhtuan04: Một bài viết rất hay đó bác, mong bác tiếp tục phát huy.

    @pvkhai: bác có thể tìm trong diễn đàn với từ khóa Proteus
    Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
    Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

    Comment


    • #3
      Có bác nào bị lỗi giống em

      Không biết bản proteus 7.2 của em bị lỗi gì mà cứ đang soạn thảo trong vòng 2->5 là tụ động out ra không một lời từ biệt. Có bác nào bị không nhỉ? em đã cài thử lên 2 máy khác nhau.
      Email: - Mobil: tạm thời ngừng liên lạc 1 thời gian
      Giới thiệu website kiếm tiền trực tuyến & tăng thứ hạng website.

      Comment


      • #4
        tui cũng đang mệt với cái USB mấy ngày nay. Hardware dùng proteus mô phỏng, firmware HID của chú CCS, software viết bằng Delphi dùng cái thư viện mà chú EasyHID biếu, chả hiểu sao nó nhận được thiết bị có cắm vào. thiết bị truyền dữ liệu lên -> nhận được. Truyền dữ liệu xuống thiết bị -> truyền xong rồi treo luôn. Ai giúp tôi với.
        Code:
         unit FormMain;
        
        interface
        
        uses
           Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
          StdCtrls, ComCtrls, XPMan;
        
        const
        
           // input and out buffer size constants...
           BufferInSize  = 8;
           BufferOutSize = 8;
        type
        
           // input and output buffers...
           TBufferIn = array[0..BufferInSize] of byte;
           TBufferOut = array[0..BufferOutSize] of byte;
        
           // main form
           TForm1 = class(TForm)
            Memo1: TMemo;
            StatusBar: TStatusBar;
            XPManifest1: TXPManifest;
            Button1: TButton;
              procedure FormCreate(Sender: TObject);
              procedure FormDestroy(Sender: TObject);
            procedure Button1Click(Sender: TObject);
           private
              FBufferIn:TBufferIn;
              FBufferOut:TBufferOut;
              function USBEvent(var Msg: TMessage): Boolean;
           public
           end;
        
        var
          Form1: TForm1;
          conStatus : boolean;
        
        implementation
        
        uses
           cUSBInterface,
           cUSBInterfaceTypes;
        
        const
        
           // vendor and product ID constants...
           VENDOR_ID           = $2222;
           PRODUCT_ID          = $2222;
        
        {$R *.DFM}
        
        {
        ****************************************************************************
        * Name    : Create                                                         *
        * Purpose : Create the main form                                           *
        ****************************************************************************
        }
        procedure TForm1.FormCreate(Sender: TObject);
        begin
          Application.HookMainWindow(USBEvent);
          Connect(Application.Handle);
        end;
        {
        ****************************************************************************
        * Name    : Destroy                                                        *
        * Purpose : Free the main form                                             *
        ****************************************************************************
        }
        procedure TForm1.FormDestroy(Sender: TObject);
        begin
          Application.UnHookMainWindow(USBEvent);
        end;
        {
        ****************************************************************************
        * Name    : USBEvent                                                       *
        * Purpose : DLL message handler hook                                       *
        ****************************************************************************
        }
        function TForm1.USBEvent(var Msg: TMessage): Boolean;
        var
          DevHandle:cardinal;
          i: byte;
           //   TextBuffer:array[0..255] of char;
        begin
          result := False;
          if Msg.Msg = WM_HID_EVENT then
          begin
            case Msg.WParam of
        
                // a HID device has been plugged in...
              NOTIFY_PLUGGED :
                begin
                // is it our HID device...
                  DevHandle := Msg.LParam; // handle of HID device in this message
                  if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
                    begin
                    // add your code here, for example...
                    // GetProductName(DevHandle, TextBuffer, 256);
                    // ALabel.Caption := string(TextBuffer);
                      StatusBar.Panels[0].Text := 'Connected';
                    end;
                  result := true;
                end;
        
                // a HID device has been device removed...
                NOTIFY_UNPLUGGED :
                begin
        
                   // is it our HID device...
                   DevHandle := Msg.LParam; // handle of HID device in this message
                   if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
                   begin
                      // add you code here
                      StatusBar.Panels[0].Text := 'Disconnected';
                   end;
                   result := true;
                end;
        
                // a HID device has been attached or removed. This event is fired after
                // either NotifyPlugged or NotifyUnplugged.
                NOTIFY_CHANGED :
                begin
                   // get the handle of the device we are interested in
                   // and set it's read notification flag to true...
                   DevHandle := GetHandle(VENDOR_ID,PRODUCT_ID);
                   SetReadNotify(DevHandle,true);
                   result := true;
                end;
        
                // a HID device has sent some data..
                NOTIFY_READ :
                begin
                   DevHandle := Msg.LParam; // handle of HID device in this message
                   if (GetVendorID(DevHandle) = VENDOR_ID) and (GetProductID(DevHandle) = PRODUCT_ID) then
                   begin
                       // read the data - remember that first byte is report ID...
                       Read(DevHandle,@FBufferIn);
                        for i := 0 to BufferInSize do
                          begin
                            Memo1.Text := Memo1.Text + IntToHex(ord(FBufferIn[i]), 2);
                            Memo1.Text := Memo1.Text + ' ';
                          end;
                        Memo1.Text := Memo1.Text + #13#10;
                       // process data here...
                   end;
                   result := true;
                end;
             end;
          end;
        end;
        
        (*
           if you want to write some data to the USB device, then
           try using something like this...
        
           // first element is report ID, set to 0...
           FBufferOut[0] := $0;
        
           // fill the buffer with some data...
           for index := 1 to BufferOutSize do
              FBufferOut[index] := index;
        
           DevHandle := GetHandle(VendorID, ProductID);
           Write(DevHandle,@FBufferOut);
        *)
        
        procedure TForm1.Button1Click(Sender: TObject);
        var
          i: byte;
          DevHandle:cardinal;
        begin
          // first element is report ID, set to 0...
          FBufferOut[0] := $0;
        
          // fill the buffer with some data...
          for i := 1 to BufferOutSize do
            FBufferOut[i] := i;
        
          DevHandle := GetHandle(VENDOR_ID, PRODUCT_ID);
          Write(DevHandle,@FBufferOut);
        end;
        
        end.
        Last edited by plain; 05-06-2008, 15:42. Lý do: viết sai -> sửa cho đúng

        Comment


        • #5
          Vậy ở máy tính muốn truyền nhận Data với USB thì như thế nào?
          Viết chương trình bằng VB98
          |

          Comment


          • #6
            theo hướng dẫn của minhtuan04, em làm thành công ngay lần đầu, mô phỏng thử mạch ex_usb_mouse đó con chuột nó chạy vòng vòng.
            Nhưng sao hôm sau em thử lại thì ko được nữa, em chẳng đụng gì đến nó, bữa trước còn mô phỏng tốt sao bữa sau mở lên thì đến dòng waiting for enumaration là đứng im. ko hiểu??? Em đang làm đề tài có dính đến HID. giờ cài lại file installer.exe, rồi mò cả vào service của win xem, thấy service Proteus usb gì đó vẫn đang chạy, vậy mà mô phỏng thì ko enumarate được. Help...
            Phạm Minh Tuấn

            (+84) 982006467

            Comment


            • #7
              Em qua máy khác mô phỏng thì được, chắc máy em bị sao rồi.
              Mà sao mô phỏng cái ex_usb_hid của CCS thì enumarate xong window nó hiện "found new hardware" và đòi driver, trong device manager xuất hiện 1 device mới là CCS demo device ??? theo em biết thì driver cho HID có sẵn trong winXP rồi mà???
              ah giả sử mình viết 1 chuơng trình bằng VB6 để giao tiếp với thiết bị USB hid, nếu có nhiều thiết bị thì làm sao chỉ định trong chương trình là giao tiếp với thiết bị nào?
              Phạm Minh Tuấn

              (+84) 982006467

              Comment


              • #8
                em tìm ra rồi, driver cho cái ex_usb_hid đó ở trong thư mục driver của CCSC, file *.inf

                Cho em hỏi con 18F4450 sử dụng có khác gì 18F4550 nhiều ko? em chỉ thử nháy led thôi, cắm mạch trên test board, dùng 4550 thì ok mà thay 4450 vào thì ko chạy? Con 4450 mới mua, nạp còn tốt nên chắc ko hư đâu. cách mắc mạch phần cứng có gì khác với dùng 4550 ko mấy bác?
                Phạm Minh Tuấn

                (+84) 982006467

                Comment


                • #9
                  bác nào có phần mềm Proteus 7.2 thì pots lên cho em tải về máy cái hay có trang web nào cho tải thì cho em
                  |

                  Comment


                  • #10
                    mình k cài được driver usb.nó có thông báo là "could not copy service to windows system32 folder". có ai biết vì sao lại như vậy k?chỉ mình với.
                    thanks!

                    Comment


                    • #11
                      File đính kèm hình như bị die, các bạn ai còn lưu trữ file này ko, cho mình xin, mình đang nghiên cứu thử phần giao tiếp với usb..

                      Comment


                      • #12
                        mọi người cho em hỏi tại sao phải có R1,R2,R3 đặt ở trước 3 lamp không ? em tìm trên mạng mấy mạch điều khiển led qua PIC18F2550 đều thấy có điện trở đặt trước các lamp. Em test trên proteus nếu để điện trở ở đó thì bóng đèn không sáng phải tháo điện trở ra thì bóng đèn mới sáng. Lần đầu tiên học điện tử có gì không hiểu các bác chỉ bảo giup em nhé ạ.

                        Comment

                        Về tác giả

                        Collapse

                        minhtuan04 Tìm hiểu thêm về minhtuan04

                        Bài viết mới nhất

                        Collapse

                        Đang tải...
                        X