26章:AE-USBPIC44基板使用シリアル-USB変換モジュール

    作成2015.09.23

     AE-USBPIC44基板を使用して、シリアル-USB変換モジュールを製作します。

  1. シリアル-USB変換モジュール回路図
     シリアル通信USART(非同期)評価回路図と同一となります。





  2. シリアル-USB変換モジュール回路外観
     シリアル通信USART(非同期)評価回路外観と同一となります。
    *USBから電源を供給しますが、USB通信は使用しません。




  3. シリアル-USB変換モジュールソースプログラム
    (1)3章:サンプルプログラムのファイル構造の変更とカスタマイズ
    [41-34zip]をダウンロードする。
    をベースに修正します。

    (2)シリアル通信USART(非同期)機能の追加
    「USART(非同期)評価用ソースプログラム(送信側)」にいく。
    「USART(非同期)評価用ソースプログラム(受信側)」にいく。
    を参考にMy-CDC-Basicプロジェクトを修正します。

    11:49 2015/09/23
    (3)シリアル-USB変換モジュールソースプログラム(送信側)
    [26-1.zip]をダウンロードする。
    解凍するとMy-CDC-Basic.Xフォルダーがあります。

    (4)シリアル-USB変換モジュールソースプログラム(受信側)
    [26-2.zip]をダウンロードする。
    解凍するとMy-CDC-Basic.Xフォルダーがあります。


  4. 送信側MAIN_RETURN main(void))概要
     送信側MAIN_RETURN main(void)を以下に示します。
    MAIN_RETURN main(void)
    {
        ADCON1  =	0b00001111;
        TRISA   =	0b00000000;
        TRISB   =	0b00000000;
        TRISC   =	0b00110000;         //D-,D+
        TRISD   =	0b00000000;
        TRISE   =   0b11000011;         //SW1,2=INPUT LED=OUTPUT
        LATA    =	0b00000000;
        LATB    =	0b00000000;
        LATC    =	0b00000000;
        LATD    =	0b00000000;
        LATE    =	0b00000000;
    
        SYSTEM_Initialize(SYSTEM_STATE_USB_START);
        USBDeviceInit();
        USBDeviceAttach();
    
        UART_Init(9600);
        RCIF = 0; //reset RX pin flag
        RCIP = 1; //high priority
        RCIE = 1; //Enable RX interrupt
        PEIE = 1; //Enable pheripheral interrupt (serial port is a pheripheral)
        INTCONbits.GIE = 1;
        int i;
        uint8_t Buffer[256];
        while(1)
        {
            LED=0;
            if(gN>=1)
            {
                if( USBUSARTIsTxTrfReady() == true)
                {
                    uint8_t iN=gN;
                    gN=0;
                    LED=1;
                    for(i=0;i<iN;i++)
                    {
                        Buffer[i]=UARTreadBuffer[i];
                    }
                    putUSBUSART(Buffer,iN);//USB送信
                }
            }
            SYSTEM_Tasks();
            #if defined(USB_POLLING)
                USBDeviceTasks();
            #endif
            if( USBGetDeviceState() < CONFIGURED_STATE ){continue;}
            if( USBIsDeviceSuspended()== true ) {continue;}
            MyCDCBasicTasks();
        }
    }
    
    (1)ボーレイト9600で初期設定します。
    (2)受信文字列はUSB側に送信します。


  5. 受信側MAIN_RETURN main(void))概要
     受信側MAIN_RETURN main(void)を以下に示します。
    MAIN_RETURN main(void)
    {
        ADCON1  =	0b00001111;
        TRISA   =	0b00000000;
        TRISB   =	0b00000000;
        TRISC   =	0b00110000;         //D-,D+
        TRISD   =	0b00000000;
        TRISE   =   0b11000011;         //SW1,2=INPUT LED=OUTPUT
        LATA    =	0b00000000;
        LATB    =	0b00000000;
        LATC    =	0b00000000;
        LATD    =	0b00000000;
        LATE    =	0b00000000;
    
        SYSTEM_Initialize(SYSTEM_STATE_USB_START);
        USBDeviceInit();
        USBDeviceAttach();
    
        UART_Init(9600);
        RCIF = 0; //reset RX pin flag
        RCIP = 1; //high priority
        RCIE = 1; //Enable RX interrupt
        PEIE = 1; //Enable pheripheral interrupt (serial port is a pheripheral)
        INTCONbits.GIE = 1;
        int i;
        uint8_t Buffer[256];
        while(1)
        {
            LED=0;
            if(gN>=1)
            {
                if( USBUSARTIsTxTrfReady() == true)
                {
                    uint8_t iN=gN;
                    gN=0;
                    LED=1;
                    for(i=0;i<iN;i++)
                    {
                        Buffer[i]=UARTreadBuffer[i];
                    }
                   UART_Write(Buffer[i]);//UART送信
                }
            }
            SYSTEM_Tasks();
            #if defined(USB_POLLING)
                USBDeviceTasks();
            #endif
            if( USBGetDeviceState() < CONFIGURED_STATE ){continue;}
            if( USBIsDeviceSuspended()== true ) {continue;}
            MyCDCBasicTasks();
        }
    }
    
    (1)ボーレイト9600で初期設定します。 (2)受信文字列はUART側に送信します。


  6. パソコン(Windows)用プログラム
     使用頻度の少ない評価用のプログラムはProcessing(プロセシング)が便利であることに気づきました。
     Processing(プロセシング)の環境設定に関しては、Processing(プロセシング)1章:Processing(プロセシング)開発環境を参照願います。

     シリアル-USB変換モジュールスケッチは以下となります。
    //USB-シリアル変換テスト用
    import processing.serial.*;
    Serial myPort;
    
    void setup()
    {
       println(Serial.list());
       myPort = new Serial(this, Serial.list()[4],9600);
       myPort.bufferUntil('\n');
    }
    
    void draw()
    {
      char i;
      for(i=0x61;i<=0x7A;i++)
      {
        myPort.write(i);
      }
      myPort.write('\n');
      delay(100);
    }
    
    void serialEvent(Serial myPort) 
    {
      String inString = myPort.readStringUntil('\n');
      if (inString != null)
      {
        print(inString);
      }
    }
    


  7. 使用方法
    (1)AE-USBPIC44基板の送信側と受信側にそれぞれプログラムを書き込みます。
    (2)回路の配線を行います。
    (3)Processing(プロセシング)を起動して、USB-シリアル変換テスト用のスケッチをペーストします。
    (4)Runボタンを押すと最初にCOMポートリストが表示されます。
    (5)myPort = new Serial(this, Serial.list()[4],9600);のリストNoを実際に接続しているポートにあわせます。
    (6)接続が成功するとコンソールに"abcdefghijklmnopqrstuvwxyz"が0.1s毎に表示されます。





  8. 設定ボーレートと文字列送受信エラー率の関係
     設定ボーレートと文字列("abcdefghijklmnopqrstuvwxyz")送受信エラー率の関係について調査した結果を以下に示します。



    *パソコンから送信した文字列がパソコンに戻るまでのエラー率を測定しました。
    *115200片道は受信側のAE-USBPIC44基板から送信した文字列がパソコンに戻るまでのエラー率を測定しました。
    *57600bpsまではエラー率はゼロでした。
    *76800bpsからは、エラー率が上昇します。
    *往復のエラー率よりも、片道のエラー率が上昇するのは、タイミング的な影響と思われます。
    *おそらく、USBの受信側でエラーが発生していると思われます。


  9. 信号波形の確認
    (1)ボーレート9600bps、時間スケール500ms/divで観察した信号波形を以下に示します。



    *黄色が送信側から受信側へのUSART信号です。
    *緑色が受信側から送信側へのUSART信号です。
    *時間スケール500ms/divです。
    *黄色が送信側から受信側へのUSART信号間隔が一定でないことが確認できます。
    *送信側から受信側へのUSART信号と受信側から送信側へのUSART信号はほぼ一致します。

    (2)ボーレート9600bps、時間スケール500μs/divで観察した信号波形を以下に示します。



    *黄色が送信側から受信側へのUSART信号です。
    *緑色が受信側から送信側へのUSART信号です。
    *時間スケール500μs/divです。
    *文字コード間の間隔は狭く、ほぼ連続した送信になっています。
    *受信側で文字コードを受信すると次のコードが来る前の送信側へ送信していることが確認できます。

    (3)ボーレート115200bps、時間スケール500ms/divで観察した信号波形を以下に示します。



    *黄色が送信側から受信側へのUSART信号です。
    *緑色が受信側から送信側へのUSART信号です。
    *時間スケール500ms/divです。
    *黄色が送信側から受信側へのUSART信号間隔が一定でないことが確認できます。
    *送信側から受信側へのUSART信号と受信側から送信側へのUSART信号はほぼ一致します。

    (4)ボーレート115200bps、時間スケール50μs/divで観察した信号波形を以下に示します。



    *黄色が送信側から受信側へのUSART信号です。
    *緑色が受信側から送信側へのUSART信号です。
    *時間スケール50μs/divです。
    *文字コード間の間隔が大きく、間欠した送信になっています。
    *受信側で文字コードを受信すると次のコードが来る前の送信側へ送信していることが確認できます。


  10. AE-USBPIC44基板使用シリアル-USB変換モジュールまとめ
    (1)AE-USBPIC44基板を使用してシリアル-USB変換モジュールを製作できました。
    (2)AE-USBPIC44基板使用シリアル-USB変換モジュールは、ボーレート57600bpsまでエラー率がゼロで動作することが確認できました。
    (3)ボーレート76800bps以上では、エラー率の増加が確認されました。
    (4)信号波形確認では、文字列が一定間隔で送信されないことが確認されました。
    (5)受信側で受信側で文字コードを受信すると次のコードが来る前の送信側へ送信していることが確認できました。
    (6)また、ボーレート115200bpsで、受信側のAE-USBPIC44基板から送信した文字列がパソコンに戻るまでのエラー率が往復通信のエラー率よりも大きくなることが確認さえました。
    (7)以上の結果から推論するとUSART信号をUSB信号に変換する部分で時間がかかるため、ボーレート115200bpsでエラーが発生するとおもられます。
    (8)AE-USBPIC44基板使用シリアル-USB変換モジュールはボーレート57600bps以下で安定動作します。


  11. USB無しの場合のソースプログラム
     USB無しの場合、ソースプログラムは以下のように単純化できます。
    「USART(USB無し)評価用ソースプログラム(受信側)」にいく。





トップページに戻る。