PIC32MX230F064B (HARMONY サンプル)

  ここで、使用する回路は、PIC32MX230F064B (HARMONY)の章に書かれてあるものです。以下、この回路を単に「PIC回路」と呼ぶことにします。なお、以下に出てくるファームウェアは、Microchip社の用意しているサンプルプログラムから作ったのではなく、1から作ったものです。また、以下のファームウェアは、PIC32MX270F256Bでも働くことを確認しています。なお、PICにファームウェアを書き込んでいる間、UART出力から、おかしなシグナルが出てきます。いまのところPIC自身の問題で、12、14、18番ピンが異常と考えています。PICにファームウェアを書き込んでいる間、12番ピンは約1V、14番ピンは約3V、18番ピンは0-3Vのパルス列が出ています。ピンをアナログ、デジタルIN、デジタルOUTに変えても異常状態は同じです。これらのピンの使用は慎重に。PICにファームウェアを書き込んでしまった後は、正常に稼働します。

  ところで、PIC用のファームウェアをコンパイルするために MPLAB X IDE v3.00-betaをインストールした後、MPLAB XC32 Compiler v1.34MPLAB XC32 Compiler Part-Support v1.34をインストールしておきます。 さらに、MPLAB Harmony Integrated Software Framework v1.04.02をインストールし、そのあと、MPLAB Harmony Confugulator(MHC)をプラグインとして、MPLAB X IDEに組み込みます。組み込み方法は、MPLAB Harmonyをインストールした時に、最後に表示されます。Webを検索をすれば、日本語での解説もありますので、そちらを参考にしてください。

  Harmony Configuration(Harmonyでどのような設定をしたか)を見たければ、それぞれのファームウェアをMPLAB Xに読み込み、Projectsウィンドウで、対応するプロジェクト名のところをマウスで右クリックして、サブメニューを出します。そこで、Set as Main Projectを選択すると、プロジェクトがメインプロッジェクトになります(プロジェクト名が太文字になる)。そして、メニューからTools->Embedded->Harmony Configuratorを選択します。しばらくすると、Open Configurationウィンドウが現れるので、OKボタンを押します。


タイマー1割り込み

  PIC32MX230F064Bは16ビット・タイマーを5つ持っています。それぞれのタイマーを個別に16ビットタイマーとして使用できます。ここでは タイマー1割り込みを使い、周期約0.8秒のパルスを作ります。14番ピン(RB5)が3,3Vになったり0Vになったりを、0.4194秒ごとに、交互に繰り返します。「PIC回路」に書き込むファームウェアはMX230_timer1.zipです。MX230_timer1.zipを解凍して出てくMX230_timer1フォルダーをmicrochip\harmony\v1_04_02\appsフォルダーの中に入れます。

以下の図はHarmony ConfiguratorでのTimer1設定の様子を表しています。

また、以下の図はHarmony Configurator/Pin Tableで、14番ピン(RB5)を出力(Output)に設定しています。

__ISR(_EXTERNAL_0_VECTOR, IPL1AUTO) _IntHandlerExternalInterruptInstance0(void) MHCでコードを生成した後、app.cにあるAPP_Initialize(void)関数の中にタイマーを開始するため、DRV_TMR0_Start()関数を入れておきます。また、system_interrupt.cの中にある __ISR(_TIMER_1_VECTOR, ipl1AUTO) _IntHandlerDrvTmrInstance0(void) 関数の中身をポート出力のために変えています。


INT0割り込み

  INT0外部割り込みを試します。INT0用のピンは16番ピンに固定されています。i以下の様に、16番ピンはファームウェアで弱くプルアップしています。このピンをGNDに落とすたびに、14番ピン(RB5)が3,3Vになったり0Vになったりを交互に繰り返します。ただし、チャタリング対策をしていませんので、交互に繰り返さないこともありあます。「PIC回路」に書き込むファームウェアはMX230_int0.zipですMX230_int0.zipを解凍して出てくMX230_INT0フォルダーをmicrochip\harmony\v1_04_02\appsフォルダーの中に入れます。

以下の図はHarmony ConfiguratorでのINT0設定の様子を表しています。

また、以下の図はHarmony Configurator/Pin Tableで、14番ピン(RB5)を出力(Output)に、そして16番ピン(RB7)を弱プルアップに設定しています。

MHCでコードを生成した後、system_interrupt.cの中にある __ISR(_EXTERNAL_0_VECTOR, IPL1AUTO) _IntHandlerExternalInterruptInstance0(void)関数の中身をポート出力のために変えています。


CN割り込み

  CN割り込みを試します。CNとはchange noticeの略で、CNピンの電圧が、3.3Vから0Vに、あるいはその逆に変わった(change)時に、これを知らせる(notice)という意味です。したがって、CN割り込みとは、CNピンの電圧が変わった時の割り込みということになります。以下の様に、CNピンは16番ピン(RB7)に割り当てました。また、16番ピンは弱プルアップしています。このピンをGNDに落としたり、離したりするたびに、14番ピン(RB5)が3,3Vになったり0Vになったりを交互に繰り返します。ただし、チャタリング対策をしていませんので、交互に繰り返さないこともあります。「PIC回路」に書き込むファームウェアはMX230_cn1.zipです。MX230_cn1.zipを解凍して出てくるMX230_CN1フォルダーをmicrochip\harmony\v1_04_02\appsフォルダーの中に入れます。

以下の図はHarmony ConfiguratorでのCN設定の様子を表しています。

以下の図はHarmony Configurator/Pin TableでのCN設定の様子を表しています。16番ピン(RB7)をCNピンとするとともに、弱プルアップもしています。また、14番ピン(RB5)を出力(Output)に設定しています。

MHCでコードを生成した後、system_interrupt.cの中にある__ISR(_CHANGE_NOTICE_VECTOR, ipl1AUTO) _IntHandlerChangeNotification(void)関数の中身をポート出力のために変えています。

ファームウェア開発には、ちょいと手こずりました。 sys_ports_static.cで、次の2つの行がコンパイル・エラーとなります。INT_VECTOR_CHANGE_NOTICE_Bが定義されていないからです。これをINT_VECTOR_CNとしました。

PLIB_INT_VectorPrioritySet(INT_ID_0, INT_VECTOR_CHANGE_NOTICE_B, INT_PRIORITY_LEVEL1);
PLIB_INT_VectorSubPrioritySet(INT_ID_0, INT_VECTOR_CHANGE_NOTICE_B, INT_SUBPRIORITY_LEVEL0);


UART通信

  UART2で入出力を行います。「PIC回路」に書き込むファームウェアはMX230_uart2.zipです。MX230_uart2.zipを解凍して出てくるMX230_UARTフォルダーをmicrochip\harmony\v1_04_02\appsフォルダーの中に入れます。

下図はUART2設定の様子を表しています。ボーレートが57600、Line Control Modeで8N1(8ビット、パリティなし、ストップビット1ビット)などと設定しています。

以上の設定が終わると、Pin Diagramは下図のようになっています。青色のピンがUART2の入出力ピンに割り当て可能なピンです。

ここで、Pin Tableを見てみます。以下の図のように、U2RXとU2TXの行に、青色の四角が幾つかあります。これらは、入出力ピンに割り当て可能なピンです。

今回は、U2RXを17番ピン(RB8)、U2TXを17番ピン(RB8)に割り当てるため青色の四角のうち、相当するところをマウスでクリックします。以下の図の様に、選択した四角だけが緑色になります。

Pin Diagramを見てみると、以下の図の様になっており、U2RX、U2TXが的確に割り当てられたことが分かります。

MHCでコードを生成した後、app.c、app.h、system_interrupt.cの中身を変えています。

1..UART2でシリアル入出力がきちんとできていることを調べるために、既存のプロジェクトの利用方法(MPLAB X)の章で紹介した回路(PIC16F1455の章で紹介した回路が元)を使いました。念のため、回路を以下に再録します。以下、この回路を単に「USB シリアル変換器」と呼ぶことにします。

上記、「USB シリアル変換器」の左側に、4ピンのピンヘッドがありますが、上から1,2,3,4番ピンと呼ぶことにします。「PIC回路」の右下にも4ピンのピンヘッドがあります(PIC32MX230F064B (HARMONY)の章に書かれてある回路図ではJP2です)。これも、上から1,2,3,4番ピンと呼ぶことにします。両ピンヘッドの1,2,4番ピンどうしを、それぞれ接続します。3番ピンはどこにも配線されていませんので、接続する必要はありません。

2.「USB シリアル変換器」とPCをUSBケーブルで接続します。

3.「PIC回路」にファームウェアMX230_uart2.zipを書き込み、実行します。

4.PC上でTera Termを起動して、メニューから”設定->シリアルポート”を選択すると、シリアルポート設定画面が以下の様に現れるので、ボーレートを57600 bps、データビットを8ビット、 パリティはなし, ストップビットを1、フロー・コントロールはなし、と設定してください。 設定が終わったら、シリアルポート設定画面を閉じ、メニューから”設定->設定の保存”を選択して、シリアルポート設定内容をファイルに保存しておくと、次回の接続時には、自動的に保存した設定内容が反映されます。

5.PCのキーボードから適当なキーを押下すると、押したキーに対する文字が、Tera Termの画面に現れるはずです。たとえば、”a”なるキーを押下すると、”a is typed”がTera Termの画面に現れるはずです。

  基本的に、1文字を送り出したら、システム(app.cで行っている作業以外をシステムと呼ぶことにします)に制御を移す必要があります。したがって、app.c内のWriteString関数(文字列を送り出す関数)では、次に送り出すべき文字列のなかの文字の位置をポインタappData.stringPointerに記憶させています。

WriteString(void)関数は複雑化なので、これを簡単にするため
while (!PLIB_USART_TransmitterIsEmpty(USART_ID_2));なる文
を用いて、app.cのように、送信バッファーが空くまで、ひたすら待ち続けるというのも1つの方法だと思いますが、待っている間、システムは割り込み以外の操作は何もできなくなります。


戻る