Curiosity開発ボードには、ユーザーが追加回路を簡単に取り付けけられる拡張用コネクターの準備があります。今回はそのmikroBUSコネクターに取り付ける USBシリアル変換器を作成します。
秋月電子通商の【P/N K-14652】絶縁USBシリアル変換モジュールを使用しました。 マイコン側の電源電圧によりモジュールの設定を変更することなく広い電圧範囲でボードとマイコンの回路を直結できる使い易いモジュールです。
ユニバーサルボードをCuriosityの拡張コネクターに合わせて、下図のようにカットしました。基板に取り付けたピンヘッドとの配線にはメッキ線を使っています。
拡張コネクダーは 18 pin x 2 列ですが、配線するのは 4 つの pin だけになります。
メッキ線をはんだ付けします。
下図を参考に組み立ててください。
作成した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; //文字出力
}