Thông báo

Collapse
No announcement yet.

[TUT]Hướng dẫn giao tiếp USB với PIC18F

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

  • #91
    Cho em hỏi

    Em có cái code này, xin được của 1 pro, em đã chỉnh lại tí chút, tuy nhiên nói chung là hoàn toàn không hiểu được nó, tại C của em kém quá.
    Code:
    ////////////////////////////////////////////////////////////////////////////////
    //                
    //
    // Filename     : 18F4550 USB Controler
    // Programmer   : 
    // Version      : 
    // Compiler     : 
    ////////////////////////////////////////////////////////////////////////////////
    
    #define __USB_PIC_PERIF__ 1
    
    #include <18F4550.h>
    #device ADC=8
    #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
    #use delay(clock=20000000)
    
    #use rs232(stream=PC, baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
    
    // CCS Library dynamic defines
    #DEFINE USB_HID_DEVICE     TRUE //Tells the CCS PIC USB firmware to include HID handling code.
    #define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
    #define USB_EP1_TX_SIZE    64  //allocate 64 bytes in the hardware for transmission
    #define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for OUT bulk/interrupt transfers
    #define USB_EP1_RX_SIZE    64  //allocate 64 bytes in the hardware for reception
    
    // CCS USB Libraries
    #include <pic18_usb.h>   //Microchip 18Fxx5x hardware layer for usb.c
    #include <usb_desc_hid 8-byte.h>   //USB Configuration and Device descriptors for this UBS device
    #include <usb.c>        //handles usb setup tokens and get descriptor reports
    
    void usb_debug_task(void) {
       static int8 last_connected;
       static int8 last_enumerated;
       int8 new_connected;
       int8 new_enumerated;
    
       new_connected=usb_attached();
       new_enumerated=usb_enumerated();
    
       if (new_connected && !last_connected) {
          printf("\r\n\nUSB connected, waiting for enumaration...");}
       if (!new_connected && last_connected) {
          printf("\r\n\nUSB disconnected, waiting for connection...");}
       if (new_enumerated && !last_enumerated) {
          printf("\r\n\nUSB enumerated by PC/HOST");}
       if (!new_enumerated && last_enumerated) {
          printf("\r\n\nUSB unenumerated by PC/HOST, waiting for enumeration...");}
    
       last_connected=new_connected;
       last_enumerated=new_enumerated;
    }
    
    #INT_RDA
    void serial_isr()                         // Serial Interrupt
    {
       int8 uReceive;
    
       disable_interrupts(GLOBAL);            // Disable Global Interrupts
    
       uReceive = fgetc(PC);
    
       switch (uReceive) {
          case 0x12: {
                if (fgetc(PC) == 0x34 & fgetc(PC) == 0x56 & fgetc(PC) == 0x78 & fgetc(PC) == 0x90) #asm reset #endasm
             }
             break;
       }
    
       enable_interrupts(GLOBAL);                // Enable Global Interrupts
    }
    
    
    #define theSampleSize            512
    
    #define usbConfirmAction         0
    #define usbCheckStatus           1
    #define usbWritePort             14
    #define usbWritePin              16
    
    void main() {
       int8 data_in[8];
       int8 data_out[8];
       int16 n, approxUS, approxMS, period;
    
       SETUP_ADC_PORTS(AN0_TO_AN4);
       SETUP_ADC(ADC_CLOCK_DIV_64);
       SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_1);
       SETUP_TIMER_1(T1_DISABLED);
       SETUP_TIMER_2(T2_DISABLED, 127, 1);
       SETUP_TIMER_3(T3_INTERNAL | T3_DIV_BY_8);
       SETUP_CCP1(CCP_OFF);
       SETUP_CCP2(CCP_OFF);
       enable_interrupts(INT_RDA);
       enable_interrupts(GLOBAL);
    
       printf("\r\n\nPIC18f4550");
       printf("\r\n\nMinh Duc ptit 2008");
       
       usb_init();
       set_adc_channel(0);
       delay_ms(1);
    
       while (TRUE) {
          usb_task();
          usb_debug_task();
          if (usb_enumerated()) {
             if (usb_kbhit(1)) {
                usb_get_packet(1, data_in, 8);
    
                   data_out[0] = 255;
                   data_out[1] = 255;
                   data_out[2] = 255;
                   data_out[3] = 255;
                   data_out[4] = 255;
                   data_out[5] = 255;
                   data_out[6] = 255;
                
                   switch (data_in[0]) {
                      
                      case usbWritePort: {
                            output_b(data_in[1]);
                            data_out[0] = usbConfirmAction;
                            data_out[1] = usbWritePort;
                            data_out[2] = data_in[1];
                         }
                         break;
                      case usbWritePin: {
                            switch (data_in[1]) {
                               case 0: output_bit(PIN_B0, data_in[2] & 1); break;
                               case 1: output_bit(PIN_B1, data_in[2] & 1); break;
                               case 2: output_bit(PIN_B2, data_in[2] & 1); break;
                               case 3: output_bit(PIN_B3, data_in[2] & 1); break;
                               case 4: output_bit(PIN_B4, data_in[2] & 1); break;
                               case 5: output_bit(PIN_B5, data_in[2] & 1); break;
                               case 6: output_bit(PIN_B6, data_in[2] & 1); break;
                               case 7: output_bit(PIN_B7, data_in[2] & 1); break;
                            }
                            data_out[0] = usbConfirmAction;
                            data_out[1] = usbWritePin;
                            data_out[2] = data_in[1];
                            data_out[3] = data_in[2];
                         }
                         break;
                   }
                   
                   usb_put_packet(1, data_out, 8, USB_DTS_TOGGLE);
    
                delay_ms(1);
             }
          }
       }
    }
    Việc khai báo để nó kết nối ngon lành với máy tính thì có lẽ đi ăn sẵn ngon hơn, cái đó em không quan tâm.
    Vấn đề em cần hỏi ở đây là, đâu là phần dữ liệu nhận về từ máy tính để so sánh, đâu là phần xuất tín hiệu điều khiển ra các chân. Em muốn điều chỉnh lại code cho nó phù hợp với các mục đích sử dụng khác nhau, em muốn truyền dữ liệu nhiều và liên tục.
    Một điều nữa là muốn truyền ngược lại từ PIC lên PC thì phải làm sao?
    Nếu có lòng hơn, nhờ mọi người giải thích dùm em xem cái chuẩn USB nó truyền nhận dữ liệu theo kiểu nào, tốc độ của nó phụ thuộc vào đâu. Nếu muốn can thiệp sâu hơn vào phần cứng, muốn tạo ra được một Host USB thì cần phải làm những gì?

    Comment


    • #92
      Phức tạp lắm.Phức tạp lắm.
      , , ,

      Comment


      • #93
        không tìm được file protect_usb_4550_lib.dll ... ? có file nối file PROJECT_USB_2550_LIB_Device.cs với file này PROJECT_USB_2550_LIB_DeviceManager.cs rồi tạo thành file DLL ?????

        Bạn ơi chỉ mình cách add file protec_usb_4500_lib.dll vào chương trình chính với ???? ( định mượn luôn cái file của bạn)

        Comment


        • #94
          -Đầu tiên bạn kết nối phần cứng với máy tính, nếu firmwave viết đúng thì máy tính sẽ nhận được và đòi driver.
          -Bạn dùng phần mềm Windriver để tạo driver cho nó và tạo một project bằng C# chẳng hạn( trên Windriver có hỗ trợ).
          -Sau đó bạn chạy project đó.
          - Kiểm tra trong thu mục debug của project, bạn sẽ tím thấy thằng protec_usb_4500_lib.dll
          - Vào project của bạn, ở mục preference, bạn nhấn chuột phải chọn add preferece, chọn tab cuối cùng và tìm đến protec_usb_4500_lib.dll là xong.
          Trong đó có các hàm hữu ích cho bạn xử lý đấy(hiểu nó cũng hơi phức tạp).
          Have fun!

          Comment


          • #95
            mình mún chuyển file .hex trên pc xuống pic 18f4550 thì làm sao các bạn , mình đang gặp rắc rối ở vấn đề này

            Comment


            • #96
              Ý bạn là sao:
              1. Nạp file chương trình (*.hex) cho 18f4550.
              2. Dùng C# để truyền 1 file *.hex cho 18f4550 qua cổng USB.
              Chúc vui.
              All in one. Sài Gòn + Đồng Nai.

              Comment


              • #97
                Trc het ban fai giao tiep dc voi no bang usb. Nếu bạn giao tiếp được rùi thì việc truyền file hex cũng đâu có j có, thậm chí bạn có thể nạp cho con khác thông qua con 4550 cũng được mà. Nghĩa là:
                - Bạn fai giao tiếp được với 18f4550 qua usb
                - Sử dụng các hàm có sẵn trong ccs hay mikroC để thực hiện truyền dữ liệu
                - Bạn fai lập trình với file dữ liệu thông qua các phần mềm lập trình chẳng hạn C#...
                - Sau khi bạn giao tiếp được rùi thì có thể lưu dữ liệu từ file hex vào bộ nhớ hoặc làm bất kỳ điều j bạn thích với cái bạn đã nhận được từ máy tính
                Mình nghĩ phần mềm viết bằng C# cũng không khó đâu!

                Comment


                • #98
                  Nguyên văn bởi hungk41 Xem bài viết
                  ..
                  - Sau khi bạn giao tiếp được rùi thì có thể lưu dữ liệu từ file hex vào bộ nhớ hoặc làm bất kỳ điều j bạn thích với cái bạn đã nhận được từ máy tính
                  Mình nghĩ phần mềm viết bằng C# cũng không khó đâu!
                  Hịc, đơn giản vậy hả bác @hungk41 ?
                  Bác đã làm chưa ? Nếu làm thì chém vài đường cho anh em xem với.
                  Cái này em chưa nghĩ đến nữa, chắc là khó đấy.
                  Giao thức truyền là từng byte 1, trong khi 1 File Hex ko phải là 1 byte, trong nó gồm N byte (data).
                  Vậy thì cách nào để truyền đây ?
                  Có lẻ : Mở File Hex đó lên, Copy toàn bộ (truyền từng byte 1 cho đến hết) để nạp vào EEPROM hoặc Flash ?
                  Có khả thi ko nhỉ ?
                  My Face :

                  Comment


                  • #99

                    Comment


                    • nhờ các sư huynh chỉ giúp về code này

                      chào các bậc tiền bối. em là lính mới trong trang này, em cũng đang viết ứng dụng với usb pic8f4550. em lang thang vật vã kiếm được cái code khá đầy đủ cho 1 daq card . vì em cay bọn học để làm giữ món nên quyết tâm tìm cách giao tiếp card này với labview rồi share cho cộng đồng. mong các tiền bối xem xét và chỉ ra giùm em tại sao em dùng lớp usb raw trong labview mà không giao tiếp được.

                      Comment


                      • em không up file lên được. nhờ tiền bối nào biết up thì cho em xin mail rồi up dùm em với

                        Comment


                        • đây rồi các tiền bối down theo link này!
                          ccs.rar

                          Comment


                          • Bạn hiền kô hiểu về usb à.Cứ 1ms thì host yêu cầu 1 lần.Nên host gửi 1 cụm ví dụ 64byte xuống VĐK thì trong khoảng thời gian từ lúc nhận dữ liệu xong đến lúc nhận dữ liệu tiếp theo thì ghi vào flash hay eeprom chớ.Đâu có cái flash nào ghi được nhiều byte 1 lần đâu.
                            , , ,

                            Comment


                            • Nguyên văn bởi rptdnmqs Xem bài viết
                              Bạn hiền kô hiểu về usb à.Cứ 1ms thì host yêu cầu 1 lần.Nên host gửi 1 cụm ví dụ 64byte xuống VĐK thì trong khoảng thời gian từ lúc nhận dữ liệu xong đến lúc nhận dữ liệu tiếp theo thì ghi vào flash hay eeprom chớ.Đâu có cái flash nào ghi được nhiều byte 1 lần đâu.
                              kaka, lại chém .
                              Ko hiểu sao làm ?
                              ý là khác, nói thế là demo cho bạn kia hiểu thôi :P
                              Hình như ý của tác giả là truyền nguyên bản 1 File xuống và dưới kia cũng nhận được như thế,
                              PM to : @rptdnmqs : Chém vừa thôi, 4rum nào cũng có mặt, làm và demo cho anh em xem vài chiêu, chứ lý thuyết ko giải quyết được việc gì đâu ?
                              My Face :

                              Comment


                              • Bạn Hiền hiểu cao siêu quá.Dể mai mốt demo cho.Đang bận viết cái code tính toán chuỗi.Sorry.Mình kô thực hành được nên nói miệng thôi.Kaka.
                                , , ,

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X