Curiosityの基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
Curiosity USBシリアル変換器
2020-11-2

Curiosity開発ボードには、ユーザーが追加回路を簡単に取り付けけられる拡張用コネクターの準備があります。今回はそのmikroBUSコネクターに取り付ける USBシリアル変換器を作成します。

使用部品

USBシリアル変換器

秋月電子通商の【P/N K-14652】絶縁USBシリアル変換モジュールを使用しました。 マイコン側の電源電圧によりモジュールの設定を変更することなく広い電圧範囲でボードとマイコンの回路を直結できる使い易いモジュールです。

ユニバーサルボード

ユニバーサルボードをCuriosityの拡張コネクターに合わせて、下図のようにカットしました。基板に取り付けたピンヘッドとの配線にはメッキ線を使っています。

ピンヘッダー

拡張コネクダーは 18 pin x 2 列ですが、配線するのは 4 つの pin だけになります。

配線材料

メッキ線をはんだ付けします。

 

組み立てと注意事項

下図を参考に組み立ててください。

  1. ピンヘッダーを基板に取り付けます。
  2. 変換モジュールの取り付け部位以外の配線を完了します。
  3. モジュールを取り付け、モジュールのピンは余分な長さを切り詰めます。

 

回路図

作成したUSBシリアル変換器の回路図 

動作確認

確認のため、非同期8ビットシリアル、パリティーなし、9600bpsで送受信するプログラムを作成しました。新しいプロジェクトを作成し、以下のリスト内容を main,c として、コンパイル後、作成したUSBシリアル変換とPCをUSBケーブルで接続し CoolTerm などの通信ソフトを実行してください。

送信部 --------------------------------------
RC4に接続されたPushSWを押すと「SW ON」を送信します。

受信部 --------------------------------------
受信したASCII文字データにより、指定されたLEDを点滅します。

 

/*********************************************************************
*  File name: EUSATR TxRx 9800
*  Notes: 4MHz内部クロック PLLはOFF
*        LED4    RA5       LED6    RA2
*        LED5    RA1       LED7    RC5
*        pushSW  RC4
*        Rx      RB5       Tx      RB7
* PIC16F1619  MPLAB X IDE with XC8
* Copyright (c) 2020 iwamoto All Rights Reserved
* *******************************************************************/
#include <xc.h>

#define _XTAL_FREQ 4000000
#define LED4     LATA5
#define LED5     LATA1
#define LED6     LATA2
#define LED7     LATC5
#define pushSW   RC4

// CONFIG
#pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON
#pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON
#pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC

void strOutUSART(char *);
void outCRLFT();
/**********************  Main  ***************/
void main(void)
{
    char SWstate = 0;       // SWの状態
    char RxData;
    OSCCON = 0b01101000;    // PLL disabled; 4MHz_HF; FOSC;
    TRISC5 = 0;             // Outputs RC5
    TRISA  = 0b011001;      // Outputs RA5.2,1
    RB7PPS = 0b10010;       // TX/CK Outputs RB7
    LATA = 0; LATC = 0;     // LEDを消灯
    ANSB5 = 0;              // RB5をデジタル入力とする
    RB7PPS = 0b10010;       // TX/CK Outputs RB7
//    RXPPS = 0b01101;      // RB5をRX入力とする デフォルトで設定
// ----------- UART 初期化 -----------
    RC1STA   = 0b10010000;  // 8 bit 連続受信
    TX1STA   = 0b00100100;  // 非同期送受信 High Baud Rate選択
    BAUD1CON = 0b00001000;  // 16 bit SPBRG
    SP1BRG   = 103;

    while(pushSW);             // RC0が押されるのを待つ
    strOutUSART("Hello OK>");  // 開始のメッセージ
    outCRLFT();
    // ----------- 繰返し --------------------------------------------
    while(1){
        // ------ 受信 ------------------------------------------------
        if(RCIF){
            RxData = RC1REG;        // 受信データを取り込む
            switch(RxData){         // データ内容で、On/Off
                case '0': LATA = 0; LATC = 0; break;
                case '4': LED4 = 1; break;
                case '5': LED5 = 1; break;
                case '6': LED6 = 1; break;
                case '7': LED7 = 1; break;
                default: break;
            }
        }
        // ------ 送信 ------------------------------------------------
        if(pushSW != SWstate){          // SWの状態が変化したら
            __delay_ms(10);             // 10mS遅延
            SWstate = pushSW;           // 新しい状態を記録
            if(pushSW == 0){            // SWが押されたのなら
                strOutUSART("SW ON");   // メッセージを送る
                outCRLFT();             // 改行
            }
        }
    }
}
//-------- 文字列出力
void strOutUSART(char *str){
    while(*str){                 //文字列の終わり(00)まで継続
        while (!PIR1bits.TXIF);  //送信終了待ち
        TXREG = *str++;          //文字出力しポインタ+1
    }
}
void outCRLFT(){
    while (!PIR1bits.TXIF);     //送信終了待ち
    TXREG = 0x0D;               //文字出力
    while (!PIR1bits.TXIF);     //送信終了待ち
    TXREG = 0x0A;               //文字出力
}