Hướng dẫn làm USB<->RS232 để debug chương trình

Collapse
This is a sticky topic.
X
X
 
  • Giờ
  • Show
Clear All
new posts
  • phamminhtuan
    Super Moderator
    • Feb 2006
    • 150

    #1

    Hướng dẫn làm USB<->RS232 để debug chương trình

    Hiện nay mọi người sử dụng máy laptop cũng nhiều, mỗi lần viết chương trình cho PIC mà bị lỗi thì không cách nào mà lần với cái LCD bé tí tẹo, còn kết nối với máy tính qua RS232 để debug bằng Terminal cũng không được khi mà máy tính không có cổng com. Giải pháp là dùng chip chuyển đổi RS232 <-> USB để có thể dùng Terminal để debug thông qua USB. Nhưng mà chip này chỉ có mỗi chức năng chuyển đổi, ngoài ra, những yêu cầu khác như giao tiếp i2c, spi ... thì không có. Vậy tại sao không làm 1 thiết bị debug hoàn chỉnh, chuyển đổi USB <->RS232 tận dụng Terminal trên Win, và các giao tiếp khác của PIC. Các bạn có thể sử dụng PIC18F2550 hay PIC18F4550. Các bước cần thực hiện như sau:

    Thiết kế phần cứng:
    vẽ mạch nguyên lý như sau, ở đây mình vẽ bằng Orcad, mạch đơn giản chỉ là chuyển đổi USB<->RS232



    Các bạn có thể thêm vào đó I2C hay SPI hay Program thì tùy, Sau này nếu cần debug từ các PIC khác, chỉ việc nối TX và RX tương ứng với RX và TX.

    Còn về phần mềm, đơn giản là dùng ex_usb_serial.c của CCS C trong thư mục Examples của thư mục cài đặt CCS C[C:\Program Files\PICC\Examples], không cần sửa gì nhiều, bạn dùng thạch anh nào thì hiệu chỉnh cho đúng, ở đây mình dùng thạch anh 4Mhz, nên hiệu chỉnh như sau:


    Bạn có thể lược bỏ bớt những phần không cần thiết trong chương trình, đoạn code của CCS chỉ sử dụng để chuyển đổi USB<->RS232, nhưng tùy bạn có thể hiệu chỉnh nó và dùng Terminal để chuyển thành cái gì thì tùy
    PHP Code:
     while (TRUE) {
          usb_task();
          usb_debug_task();
    
          if (kbhit()) {
             c=getc();
             if (c=='\n') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
             if (c=='\r') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
             else {usb_cdc_putc(c);}
          }
          if (usb_cdc_kbhit()) {
             c=usb_cdc_getc();
             if (c=='\n') {putc('\r'); putc('\n');}
             if (c=='\r') {putc('\r'); putc('\n');}
             else {putc(c);}
          }
       } 
    
    Vậy là xong, dịch file rồi nạp vào cho PIC, đảm bảo chạy ngay.

    Sau đó cắm vào máy tính thì nó hỏi driver, bạn làm như sau:






    Và bây giờ bạn có thể viết bất kì ứng dụng nào với cổng COM ảo đã được tạo, nếu muốn, bạn có thể hiệu chỉnh sơ sơ, mình không có cổng COM vật lý nào, nên chỉnh cho cổng COM ảo này thành cổng COM1 và dùng terminal để debug, như sau:








    Quả thật là tiện lợi, nhỏ gọn và làm được nhiều thứ để gỡ rối chương trình, chúc các bạn thành công
    Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
    http://www.picvietnam.com/forum/showthread.php?t=1263

  • thaovma
    Đệ tử 3 túi
    • Jun 2007
    • 50

    #2
    Bài viết của bạn rất hay, nhân tiện mình xin được post bài tương tự nhưng bạn sẽ làm việc với PIC8F2550. Cách làm ở đây hoàn toàn tương tự như đối với 18F4550, nhưng các bạn có thể load về tham khảo thêm, hy vọng sẽ giúp ít được cho các bạn đang mong muốn làm việc với USB_CDC.
    Attached Files

    Comment

    • hopeman
      Đệ tử 6 túi
      • Jul 2007
      • 144

      #3
      đây đúng là 1 bài viết rất giá trị với các thành viên của PicVN
      mạch nạp - kit phát triển - linh kiện điện tử www.PNLabvn.com

      Comment

      • hailua_pro_2006
        Đệ tử 1 túi
        • Nov 2007
        • 14

        #4
        vậy làm sao đọc đc file hex, nó chuyển về máy tính toàn số ko sao đọc đc nếu đọc đc chì em với

        Comment

        • jackiele
          Đệ tử 3 túi
          • Jun 2008
          • 51

          #5
          Tại sao ko tu lam cái USB<=>RS232 đơn giản chỉ tốn khoảng chừng 35k
          - 1 PL2303HX (22k)
          - 1 thạch anh 12MHz (2k);
          - vài cái tụ (2k)
          - vài con điện trở. (2k);
          - 1 USB connect. ( 3.5k);

          Comment

          • Mr.Bi
            Đệ tử 7 túi
            • Jul 2007
            • 188

            #6
            Nguyên văn bởi jackiele View Post
            Tại sao ko tu lam cái USB<=>RS232 đơn giản chỉ tốn khoảng chừng 35k
            - 1 PL2303HX (22k)
            - 1 thạch anh 12MHz (2k);
            - vài cái tụ (2k)
            - vài con điện trở. (2k);
            - 1 USB connect. ( 3.5k);
            uh đúng , cái này cũng chế đc cable USB<-->232 . U post cái mạch lên cho ae tham khảo (+dviver nếu có) .
            Tui cũng đã từng lấy cable DKU5 (cable nokia) độ lại để nạp philip . Bên trong đầu chuyển của cable DKU5 cũng có con PL2303 .

            Comment

            • nguyendinhtuan
              Đệ tử 6 túi
              • Jan 2007
              • 127

              #7
              đây là schematic và PCB.
              Attached Files

              Comment

              • sonduy1
                Đệ tử 1 túi
                • Jun 2009
                • 20

                #8
                em xai` latop nen viec lien ket qua cong com ko dc bac nao` giup voi.e moi vao` nghe` dc may ngay rui`.hihi.mong cac bac giup do~ nhiu` cho.thanks !

                Comment

                • fulloflove
                  Nhập môn đệ tử
                  • Jul 2009
                  • 3

                  #9
                  Trên trang này cũng có hướng dẫn 1 mạch USB > RS232 đơn giản nè, ko cần driver, chỉ sử dụng 1 con AVR 8 chân

                  Comment

                  • greenfield
                    Đệ tử 6 túi
                    • Jul 2009
                    • 152

                    #10
                    Không biết có ai biết có con PIC nào hỗ trợ là luôn USB --> COM đầy đủ tất cả 9 chân cổng COM để có thể giao tiếp nhiều chế độ.

                    Comment

                    • hoangngan
                      Nhập môn đệ tử
                      • Jul 2010
                      • 1

                      #11
                      Nguyên văn bởi phamminhtuan View Post
                      Hiện nay mọi người sử dụng máy laptop cũng nhiều, mỗi lần viết chương trình cho PIC mà bị lỗi thì không cách nào mà lần với cái LCD bé tí tẹo, còn kết nối với máy tính qua RS232 để debug bằng Terminal cũng không được khi mà máy tính không có cổng com. Giải pháp là dùng chip chuyển đổi RS232 <-> USB để có thể dùng Terminal để debug thông qua USB. Nhưng mà chip này chỉ có mỗi chức năng chuyển đổi, ngoài ra, những yêu cầu khác như giao tiếp i2c, spi ... thì không có. Vậy tại sao không làm 1 thiết bị debug hoàn chỉnh, chuyển đổi USB <->RS232 tận dụng Terminal trên Win, và các giao tiếp khác của PIC. Các bạn có thể sử dụng PIC18F2550 hay PIC18F4550. Các bước cần thực hiện như sau:

                      Thiết kế phần cứng:
                      vẽ mạch nguyên lý như sau, ở đây mình vẽ bằng Orcad, mạch đơn giản chỉ là chuyển đổi USB<->RS232



                      Các bạn có thể thêm vào đó I2C hay SPI hay Program thì tùy, Sau này nếu cần debug từ các PIC khác, chỉ việc nối TX và RX tương ứng với RX và TX.

                      Còn về phần mềm, đơn giản là dùng ex_usb_serial.c của CCS C trong thư mục Examples của thư mục cài đặt CCS C[C:\Program Files\PICC\Examples], không cần sửa gì nhiều, bạn dùng thạch anh nào thì hiệu chỉnh cho đúng, ở đây mình dùng thạch anh 4Mhz, nên hiệu chỉnh như sau:


                      Bạn có thể lược bỏ bớt những phần không cần thiết trong chương trình, đoạn code của CCS chỉ sử dụng để chuyển đổi USB<->RS232, nhưng tùy bạn có thể hiệu chỉnh nó và dùng Terminal để chuyển thành cái gì thì tùy
                      PHP Code:
                       while (TRUE) {
                            usb_task();
                            usb_debug_task();
                      
                            if (kbhit()) {
                               c=getc();
                               if (c=='\n') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
                               if (c=='\r') {usb_cdc_putc('\r'); usb_cdc_putc('\n');}
                               else {usb_cdc_putc(c);}
                            }
                            if (usb_cdc_kbhit()) {
                               c=usb_cdc_getc();
                               if (c=='\n') {putc('\r'); putc('\n');}
                               if (c=='\r') {putc('\r'); putc('\n');}
                               else {putc(c);}
                            }
                         } 
                      
                      Vậy là xong, dịch file rồi nạp vào cho PIC, đảm bảo chạy ngay.

                      Sau đó cắm vào máy tính thì nó hỏi driver, bạn làm như sau:






                      Và bây giờ bạn có thể viết bất kì ứng dụng nào với cổng COM ảo đã được tạo, nếu muốn, bạn có thể hiệu chỉnh sơ sơ, mình không có cổng COM vật lý nào, nên chỉnh cho cổng COM ảo này thành cổng COM1 và dùng terminal để debug, như sau:








                      Quả thật là tiện lợi, nhỏ gọn và làm được nhiều thứ để gỡ rối chương trình, chúc các bạn thành công
                      Cảm ơn vì bài viết rất hay!
                      Tiện đây cho mình hỏi bạn một chút, mình muốn sử dụng usb to rs232 để kết nối giữa máy tính sách tay ACER và UPS thì phải làm những gì, mua dây ở đâu thì đảm bảo về chất lượng?

                      Comment

                      • phongvm90
                        Nhập môn đệ tử
                        • Aug 2011
                        • 5

                        #12
                        anh chủ thớt ơi, mấy image của anh bị die rồi ạ.

                        Em muốn hỏi một chút ạ, em dùng mẫu của ccs để code cho cái usb to rs232. Nhưng khi cắm vào thì máy tính thì không có gì xảy ra cả, máy tính ko hỏi driver, pic cũng ko chạy. Em kiểm tra thì mạch vẫn có điện chạy tốt

                        Em dùng máy win7 64 bits ạ. Cái proteus thì ko dùng đc vì driver usb ảo của proteus ko chạy trên 64 bit nên em chỉ có cách làm mạch rồi test. Giờ nản quá...

                        Code em đây ạ:

                        #include <18F4550.h>
                        #device adc=8
                        #include <usb_cdc.h>

                        #FUSES NOWDT //No Watch Dog Timer
                        #FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
                        #FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
                        #FUSES NOPROTECT //Code not protected from reading
                        #FUSES NOBROWNOUT //No brownout reset
                        #FUSES BORV20 //Brownout reset at 2.0V
                        #FUSES NOPUT //No Power Up Timer
                        #FUSES NOCPD //No EE protection
                        #FUSES STVREN //Stack full/underflow will cause reset
                        #FUSES NODEBUG //No Debug mode for ICD
                        #FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
                        #FUSES NOWRT //Program memory not write protected
                        #FUSES NOWRTD //Data EEPROM not write protected
                        #FUSES IESO //Internal External Switch Over mode enabled
                        #FUSES FCMEN //Fail-safe clock monitor enabled
                        #FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
                        #FUSES NOWRTC //configuration not registers write protected
                        #FUSES NOWRTB //Boot block not write protected
                        #FUSES NOEBTR //Memory not protected from table reads
                        #FUSES NOEBTRB //Boot block not protected from table reads
                        #FUSES NOCPB //No Boot Block code protection
                        #FUSES MCLR //Master Clear pin enabled
                        #FUSES LPT1OSC //Timer1 configured for low-power operation
                        #FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
                        #FUSES PLL5 //Divide By 12(48MHz oscillator input)
                        #FUSES CPUDIV4 //System Clock by 4
                        #FUSES USBDIV //USB clock source comes from PLL divide by 2
                        #FUSES VREGEN //USB voltage regulator enabled
                        #FUSES ICPRT //ICPRT enabled
                        #FUSES HS

                        #use delay(clock=20000000)


                        void main()
                        {

                        setup_adc_ports(NO_ANALOGS|VSS_VDD);
                        setup_adc(ADC_CLOCK_DIV_2);
                        setup_psp(PSP_DISABLED);
                        setup_spi(SPI_SS_DISABLED);
                        setup_wdt(WDT_OFF);
                        setup_timer_0(RTCC_INTERNAL);
                        setup_timer_1(T1_DISABLED);
                        setup_timer_2(T2_DISABLED,0,1);
                        setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
                        setup_comparator(NC_NC_NC_NC);
                        setup_vref(FALSE);
                        //Setup_Oscillator parameter not selected from Intr Oscillator Config tab
                        char c;
                        // init usb port to rs232
                        usb_cdc_init();
                        usb_init();
                        // Test interface:
                        // Test USB
                        output_low(PIN_D0);
                        while (TRUE)
                        {
                        usb_task();
                        //usb_debug_task();
                        if (usb_cdc_kbhit())
                        {
                        c=usb_cdc_getc();
                        output_toggle(PIN_D1);
                        }
                        }

                        Comment

                        • phongvm90
                          Nhập môn đệ tử
                          • Aug 2011
                          • 5

                          #13
                          hic có ai giúp em được không ạ, em dùng Win7 64 bits, khi code xong USb - rs232 cho pic18f4550. Lắp mạch, cắm vào thì máy tính báo là unreconized usb device. Em đoán là phải có driver nào đó. Ai giúp em với ạ

                          Comment

                          • thanhsonvn90
                            Đệ tử 1 túi
                            • Oct 2010
                            • 18

                            #14
                            Bạn xem lại cable nối và mạch xem. Kiểm tra tụ của vusb và chống nhiễu xem có đúng không

                            Comment

                            • trangthancb
                              Nhập môn đệ tử
                              • Apr 2011
                              • 5

                              #15
                              Nguyên văn bởi phongvm90 View Post
                              hic có ai giúp em được không ạ, em dùng Win7 64 bits, khi code xong USb - rs232 cho pic18f4550. Lắp mạch, cắm vào thì máy tính báo là unreconized usb device. Em đoán là phải có driver nào đó. Ai giúp em với ạ
                              Mình đang giống trường hợp như bạn! Và giải pháp của mình là tạo 1 phân vùng mới 10GB(tùy bạn)....và cài winXP
                              Win7 không chạy được đâu ^_^

                              Comment

                              Working...