MCC操作でECAN 2.0Bプログラムを生成する
〔マイコンのトップに戻る〕
・CAN通信の基礎概要
・PIC18F26K80のECANレジスタ内容
・PICとPICでECAN通信の実験
・MCP2515モジュールでCAN通信の実験1(Arduino)
・MCP2515モジュールでCAN通信の実験2(PIC)
前のページで、PIC18F26K80のECANモ
ジュールレジスタの概要は説明していますね。
PIC18F26K80のECANモジュールはレジスタがいっぱい有り設定を行うには少々大変です。
又、ECANモジュールには動作モードMODE0/MODE1/MODE2が有りますが、その動作モードにより
レジスタの設定方法が異なったりもします。
なので、ここではMPLAB Code Configurator(MCC)
を操作してレジスタの設定を行いたいと思います。
MCCのインストール方法と基本操作はこちらを参照下さ
い。
尚、"MPLAB® Code Configurator CAN 2.0B Module for PIC18 Microcontrollers(AN2714)"の
データシートも有ります。
ここでの説明は、MPLAB X v4.10/MCC v3.65.1のバージョンでの話となります。
MODE0
標準のCANモジュールと完全に互換性があるように設計された通
常のデフォルト動作モードです。
MODE1
MODE0に比べて多くの受信バッファを組み合わせた動作モードです。
拡張バッファ(B0-B5)の内いくつかを送信バッファにする事も出来ます。
DeviceNet
プロトコルなどの高水準プロトコルの実装が簡素化されます。
MODE2
MODE1の構成で受信バッファがFIFO(先
入れ先出し)バッファで動作するモードです。
拡
張バッ
ファ(B0-B5)の内いくつかを送信バッファにする事も出来ますが、
その分FIFOバッファが減ります。
DeviceNet
プロトコルなどの高水準プロトコルの実装が簡素化されます。
《MCC起動》
起動させるには、MPLAB IDEメニューバーの[Tools]→[Embedded]を順番にクリックし、
"MPLAB(R) Code Configurator
V3:Open/Close"をクリックします。
又は、「MCC」のアイコンボタンをクリックします。
もう一度クリックするとMCC画面が終了します。
MCC画面が起動されるまで暫く待ちましょう。
MCCコンフィグレーションの保存を行うか聞いてきます。
[
保存(S)]ボタンをクリックします。
MCC画面が表示されます。
ECANモジュールを追加す
る
MCC画面の「Device Resources」ウインドウ画面の
"CAN"横の▼をクリックして"ECAN"が表示されたら"ECAN"を
ダブルクリックしましょう。
ECANモジュールが追加されます。
《System Moduleの設定》
システムクロックの設定を行います。
ここでは、内蔵クロックの16MHzでPLLは無しで
の設定です。
《ECAN Moduleの設定》
ECANモジュールの設定を行います。
尚、ここの設定は"MODE0"
での説明となります。
【Bit Rate
Settings】
設定されたCANバス通信速度とデバイスクロックに基づいてボーレート制御レジスタ値を自動計算します
選択されたTQ乗数とサンプルポイントに基づく自動ビットセグメント計算も行います。
尚、ビットセグメントレジスタやボーレート制御レジスタの話は前ページのこちらを参照して下さい。
CAN BUS Speed:CANバス通信速度
20 kbpsから1Mbpsに切り替える機能を提供します。
複数のノードが同じCANバス上で通信できる様にするには、CANバ
ス上の全てのノードの
ビットレートが同一である必要があります。
Sync Jump Width(SJW):同期ジャンプ幅
1xTQから4xTQまでの同期ジャンプ幅(SJW)のオプションを提供します。
通常は"1xTQ"で良いと思います。
Time Quanta(TQ):タイムクオンタ
有効なTQ乗数(1
ビット辺り8-25TQ)
の選択を提供します。
値を選択すると、GUIは有効なサンプルポイントオプションで自動的に更新されます。
Sample Point:サンプルポイント
CANバス上の1ビット期間の実際のサンプルポイント位置を提供します。
サンプリングポイントは出来るだけ遅くするか、ビット時間の約80%にする必要が有
りま
す。
又、サンプリングポイントは"Phase Seg1"と"Phase Seg2"の間に有ります。
その他の各セグメント設定は入力出来ません。
【General
Settings】
CANラインフィルタウェイクアップ
このスリープモードでは、RXCAN入力ラインへのローパスフィルタ機能の使用を有効/無効にします。
これにより、バスのノイズまたは短絡の為にデバイスが起動するのを防止します。
CANアクティビティウェイクアップ
このチェックボックスは、CANバスアクティビティウェイクアップ機能を有効/無効にします。
このオプションを有効にすると、内部スリープモードの間にCANバス上でアクティビティが
検出されると、周辺機能が割り込みを生成する事が出来ます。
【CANTX Pin
Drive Settings】
CANTXピンはリセッシブの場合に、VDDにて駆動するかトライステートにするかの選択ですが、
通常では、ECAN MCCモジュールは、リセッシブ時にCANTXピンをVDDにドライブする様に設定します
注:このセクションは、PIC18FXXK80のようなCAN I/O制御(CIOCON)レジスタのHigh Drive(ENDRHI)
ビットを有効にしたデバイスでのみ使用出来ます。
【Transmit
Settings】
バッファ - フィルタ - マスク構成図(モード0)
送信バッファの選択を行います。
Transmit Buffer:送信バッファ
"MODE1"のみ操作可能で、拡張バッファ
"B0-B5"の6個が有りこの中から送信バッファに使いたい
場合に、操作します、未選択の場合は受信バッファとなります。
Selected Transmit Buffers:選択された送
信バッファ
送信動作に使用されるすべてのバッファを表示します。
ここでは"MODE0"での設定ですのでデフォルトの"TXB0,TXB1,TXB2"のみが選択されています。
【Receive
Settings】
受信バッファの設定を行います。
Receive Mode:モード選択
ここでECANモジュールの動作モード(Mode0/Mode1/Mode2)を選択します。
Message ID:CAN識別子ID
有効な標準IDは、"0x00-0x7FF"の範囲内の任意の16
進値です。
有効な拡張IDは、"0x-1FFFFFFFx"の範囲内の任意の16進値で、「x」は「拡張」CAN識別子に対応
します。尚、上位7 ビットがすべて'1'であるID設定は禁止さ
れています。
"Message ID"を入力して、バッファ
- フィルタ - マスク構成図(上図)を参考にし"Filter"、
"Mask"、
"Receive
Buffer"を選択したら[+ADD]
ボタンをクリッ
クします、下の
一覧画面(Table)に登録されます。
これを必要なCAN識別子ID分(受信を行いたいID分)繰り返して下さい。
尚、[X Remove]ボタンは登録した
"Message ID"を削除する場合に用います。
【Interrupt
Settings】
CAN
割り込みを利用する場合は、MCC画面のメインウィンドウを
[Easy Setup]から[Registers]タブで
切り替えます、左の様になります。
ここでは、"WAKI"/"ERRI"/"RXB0I"にチェックを入れた例です。
ここでチェックを入れる事により割り込み関連のソースファイルが
生成されます。
尚、CAN割り込み以外の周辺機器割り込みを利用する場合は、
生成された割り込みハンドラ(INTERRUPT_InterruptManager)内に
利用したい周辺機器割り込みを追加記述する必要が有ります。
又、"PIE5bits.ERRIE=1"/"PIE5bits.RXB0IE=1"の記述が有りません
なので利用する場合は追記する必要が有ります。
"PIE5bits.WAKIE=1"は、CAN_sleep()関数内に記述が有ります。
CAN割り込みの内容はこちらを参照下さい。
例えば"WAKI"にチェックを入れた場合は、以下の様に生成されて
います。
型枠プログラムのみなので必要な処理は御自分で記述する必要が有ります。
"RXB0I"や"ERRI"も同様です。
void ECAN_ISR_ECAN_WAKI(void)
{
// まだサポートされていません
// この場所に"アクティビティウォークアップ"割り込みが発生した場合の処理を記述します。
// スリープからウェイクアップ後、CANモジュールを"通常モード"に直接設定する必要があります。
PIR5bits.WAKIF = 0; // 割り込みフラグのクリア
}
割り込みハンドラも以下の様に生成されます。
void __interrupt() INTERRUPT_InterruptManager (void)
{
// 割り込みハンドラ
if(INTCONbits.PEIE == 1) // 周辺装置割り込み許可有か?
{
if(PIE5bits.WAKIE == 1 && PIR5bits.WAKIF == 1)
{
ECAN_ISR_ECAN_WAKI(); // "アクティビティウォークアップ"割り込みが発生
}
else if(PIE5bits.ERRIE == 1 && PIR5bits.ERRIF == 1)
{
ECAN_ISR_ECAN_ERRI(); // "ERR"エラー割り込みが発生
}
else if(PIE5bits.RXB0IE == 1 && PIR5bits.RXB0IF == 1)
{
ECAN_ISR_ECAN_RXB0I(); // "RXB0"受信割り込みが発生
}
else
{
// I2C関連の割り込み(LCDで利用)
// この部分はI2Cモジュールを利用したいので別途追記した行です
InterI2C() ;
}
}
else
{
// 未処理割り込み
}
}
【Generate】
MCC画面の「Project Resources」ウインドウ画面の
[Genetate]ボタンをクリックします。
ファイルの生成が終了したらMCC画面を終了します。
生成されたファイルの構成は以下の様になります。
ここでは、この中から"ecan.h"/"ecan.c"と
"interrupt_manager.h"/"interrupt_manager.c"の
ファイルのみ利用する事にします。
その他のファイルは利用しません。
↓から生成されたサンプルファイルをダウンロード出来ます。
[mcc_generated_files]
このダウンロードファイルの中の
"interrupt_manager.h"/"interrupt_manager.c"と
"ecan.h"/"ecan.c"のみ日本語コメントを付けて置きました。
関数等の使い方は"AN2714"を参考にしましょう。
《その他》
生成されるファイルで、メッセージを受信する関数は常にRXB0/RXB1のバッファ制御レジスタの
"RXFUL"ビットを見て受信したか判断を行うやり方で生成されます。
受信したら割り込みを発生させその時にメッセージを読み出す様なやり方は自分で作成する必要が有ります
又、その他のECANモジュール機能を利用する場合も自分で行いましょう。
【きむ茶工房ガ
レージハウス】
Copyright (C) 2006-2018 Shigehiro Kimura All Rights Reserved.