Vol.764 8.Mar.2019

高機能な8ビットPIC(3)〜USBでパソコンと接続〜 Windowsでリンクを使う

P 高機能な8ビットPIC(3) 〜USBでパソコンと接続〜

by fjk

PICで外部と通信する手段には幾つかあるが、USARTを使ってパソコンと接続してみる。作成するシステムは以下の仕様とする。PICとパソコンの接続にはUSB変換ケーブル(5V、FTDI)を使った。

@PICはVRの電圧をADコンバータで読込、1秒おきにパソコン(win7)に送る。
Aパソコンは受け取ったデータをターミナルソフト(テラターム)で画面に表示。
Bターミナルソフトで入力(エコー無し)したデータをPICに送る。
CPICで受信したデータをそのままパソコンに返し、ターミナル画面に表示する。
なお、「PICと楽しむRaspberryPi活用ガイドブック」(技術評論社)などを参考にした。

1.PICのハードウエアとMCCの設定
前回(abc763)で用いた16F18313でもADC+シリアル通信が可能だが、ICSPピンを兼用させないため14ピンの16F1825を用いた。それに伴い、回路も一部変更した。

回路図

@デバイスの選択とクロック設定(INTOSC、16MHz)
Aタイマー2の設定(Time Period=約1秒)
BADCの設定(TAD=1us〜9us)
CEUSARTの設定(ボーレート設定、STDIOをチェック)
Dピンの設定
@Osciliator ATMR2 BADC
CEUSART DPIN INTERRAPT


2.ソフトウェア
MCCソースにユーザスケッチを追加、
・main.c: ほとんど新規に作成。割込を許可するため行頭のコメント"//"も取る
・tmr2.c: mFlagを外部宣言し、CallBack関数内で1にセット
・eusart.c:Flag、rBuf[]、Indexを外部宣言し、EUSART_Reseive_ISRに受信データ取得を追加記述
 <main.c>
#include "stdio.h"
#include "mcc_generated_files/mcc.h"

unsigned char sBuf[18];
unsigned char rBuf[18];
char Flag, mFlag;
int Index, Val;

void SendStr(unsigned char* msg){
    int i;
    i = 0;
    while(msg[i] != 0){
        EUSART_Write(msg[i++]);
    }
}

void main(void)
{
    // initialize the device
    SYSTEM_Initialize();
    mFlag = 0;
    Flag = 0;
    Index = 0;   

    // Enable the Global Interrupts
    INTERRUPT_GlobalInterruptEnable();

    // Enable the Peripheral Interrupts
    INTERRUPT_PeripheralInterruptEnable();

    LEDC3_SetHigh();
    SendStr("\n\r");
    SendStr("Hellow\n\r");

    while (1) {
        Val = ADC_GetConversion(2);
        if(mFlag){
            LEDC3_Toggle();
            mFlag = 0;
            sprintf(sBuf, "ad=%d\n\r", Val);
            SendStr(sBuf);
        }
        if(Flag){
            Flag = 0;
            SendStr(rBuf);
            SendStr("\n\r");
        }
    }
}
  
  <tmr2.c>
extern char mFlag;
    /* ・・・ */

void TMR2_CallBack(void)
{
    // Add your custom callback code here
    mFlag = 1;
    // this code executes every TMR2_INTERRUPT_TICKER_FACTOR periods of TMR2
    if(TMR2_InterruptHandler)
    {
        TMR2_InterruptHandler();
    }
}


  
  
  
   <eusart2.c>
extern char Flag;
extern unsigned char rBuf[];
extern int Index;

  /* ・・・ */

void EUSART_Receive_ISR(void)
{
    /* ・・・*/

    // or set custom function using EUSART_SetRxInterruptHandler()
    if(1 == RCSTAbits.OERR){
        RCSTAbits.SPEN = 0;
        RCSTAbits.SPEN = 1;    
    }
 
    if((RCREG==0x0a)||(RCREG==0x0d)){
        Flag = 1;
        rBuf[Index] = 0;
        Index = 0;
    }
    else{
        if(Index<18)
            rBuf[Index++] = RCREG;
    }         
 }


※ 整数値を文字列に変換するためitoa()関数を使ったところ、コンパイル時に未定義エラーが出た。その原因を調べてみると、XC8v2のC99ではstdlib.hにitoa()の記述がなく、使用できない。代わりにsprintf()関数(stdio.hの記述が必要)を使うこと。
※ C99ではC90から大幅に仕様が変わっているため、古いコードやライブラリを使うとエラーが出てビルド出来ないことがある。XC8v2では以下の手順を行えばC90でビルトできる。
  プロジェクトのproperty
   →XC8 Global Option
   →C StandardをC90に変更(デフォルトはC99)
コマンドラインからコンパイルする場合は、
  xc8-cc -std = c90 files [libraries] C99の浮動小数点データは24/32ビットのどちらでも使えるがデフォルトは32ビット。デフォルトで24ビット浮動小数点データを使いたいときはC90を利用

3.ターミナル設定と通信テスト
USBケーブルをパソコンに接続すると、自動で認識され、PICとパソコンを接続することができた(要ポート番号確認)。
シリアル通信時にはボーレートを合わせないと文字化けが発生する(した)。そこで、幾つかのボーレートでテストしたところ、PICとパソコン(win7)の双方で19200bpsに設定したところ、文字化け無くうまく通信ができ、テラターム画面にADCデータが1秒おきに表示された。
また、キーボードから入力した文字列データもテラターム画面にエコーバックされた。
PICの動作を確認をするため、タイマー割込が入るとLEDが1秒間隔で点滅させた
コンパイラ変更 テラターム設定 USBポート確認
ケーブル接続 ブレッドボード テラターム画面


W Windowsでリンクを使う

by fjk

リンク(接続)とは、ショートカット(近道)のように実際にファイルがある場所とは別の場所からファイルにアクセスできる機能で、(vista以降の)windowsではハードリンク、シンボリックリンク、ジャンクションの3種類のリンクが利用できる。
 ショートカットは、本来は実行ファイルのある場所でexeファイルを指定して実行するところを、ショートカットアイコンを作成することで、アイコンのある場所で実行できる。ショートカットアイコンを消去しても、元の実行ファイルなどには全く影響しない。ショートカットの作成は、設定したいファイルを選択後、マウスの右クリックメニューから作成できる。,br>  一方、リンクはあたかもファイルの実態がそこにあるように振る舞うので、コマンドの引数に用いることが出来る。例えば、DドライブのフォルダをCドライブにリンクすると、DドライブのフォルダーがCドライブにあるように振る舞わせることが出来る。これはCドライブのメモリが不足した場合に便利である。しかし、リンクフォルダーを消去すると、元のフォルダー(の中身)も消去されることがあるので注意が必要。リンクの作成は、コマンドラインからmklinkコマンドで作成し、リンクの削除、ファイルはdelコマンド、フォルダはrmdirコマンドを実行する。

@ハードリンク(ファイルのみ)
実体ファイルにラベル名(読み方)を割り付ける。同じファイルシステム上にあることが必要だが、元のファイルを移動してもリンクは保持される。
  <実行例> mklink /h link-symbol.txt link-target.txt
Aシンボリックリンク(ファイル、フォルダー)
実体ファイルのラベル名にリンクを割り付ける。ファイルシステムが認識できれば、異なるファイルシステムやパーテションでもリンクできる。元のファイルを移動や削除するとデッドリンクとなる。
  <実行例> mklink c:\link-symbol d:\link-target
Bジャンクション(フォルダーのみ)
シンボリックリンクと同様の動作だが、windowsのフォルダーをlinuxでリンクする場合、シンボリックリンクでは正しく動作しないが、ジャンクションを使うと正常に使用することが出来る。
  <実行例> mklink /j link-symbol link-target
 
 シンボリックリンクハードリンクジャンクションショートカット
利用者権限管理者一般ユーザ一般ユーザ一般ユーザ
ファイルへのリンク×
フォルダへのリンク×
パス指定絶対、相対−−−絶対−−−
他ボリュームへのリンク×−−−
リンクの作成
    (フォルダ)
mklink l〜 t〜
mklink /d l〜 t〜
mklink /h l〜 t〜
−−−
−−−
mklink /j l〜 t〜
右クリックから
リンクの削除
    (フォルダ)
del l〜
rmdir l〜
del l〜
−−−
−−−
rmdir l〜
ショートカット
アイコンの削除
リンク先の存在どちらでも存在必須どちらでも−−−
l〜:リンク名、t〜:ターゲット・・・Linuxの指定と逆順
注)フォルダーリンクをDELで削除すると、フォルダー以下のデータも削除されることがあるので注意!


高機能な8ビットPIC(3)〜USBでパソコンと接続〜 Windowsでリンクを使う