2011年1月31日月曜日

例の計画

以前からの計画がようやく前進しましたYO。

まだ、先は長いっすけど。

久々にワクドキしてますYO、ハイ。


2011年1月23日日曜日

PICでCAN通信(その2)

とりあえず、動作するようになったCAN。

YES WE CAN!!

と、簡単にはいきませんYO、ハイ。

まず、前回適当に組んだプログラムを修正するところからです。

レジスタアドレスやインストラクションコードの定義や、

SPI用サブルーチンを作成。

その後、動作確認です。

今回はこんな感じで動作確認回路を組みました。



こんな感じです

でっかいブレットボードの右側がノード1、左がノード2とします。

ちなみに、CANのモジュールはノードと呼ぶらしいです。

ノード1はCAN関係以外はタクトスイッチ1つだけ。

ノード2はLCDとモーターをつないでみましたYO。



プログラムした動作ですが、ノード1の黒いタクトスイッチを押すと、

スイッチを押した積算回数がノード2に送信されます。

チャタリング防止で1secのインターバルを設定したので連打は出来ません(笑)。

ノード2は受信した値をLCDに表示し、

RXB0D0が奇数だったらモーターを動かすようになってます。

ではぢゅは、動作をみてみましょぃ。



とりあえず、動作しています。



今回発覚した問題は次の通り。

・ノード2が受信した拡張IDの数値が意味不明。

これは標準IDで通信を行っているからだと思われますが、

逆に拡張IDで通信をする方法が分からなかったりしますね。


・PICを使ったCAN関連ホームページが少ない。

前回も述べましたが、情報が少ないです。

素人はなかなか手を出しにくいです。

素人にも優しい解説を切に望みます(笑)

2011年1月22日土曜日

PICでCAN通信

自動車の車内通信でポピュラーなCAN通信をやってみたく、色々トライ中。

CANコントローラにはMCP2515、

CANトランシーバには、MCP2551

というデバイスがあることが分かり、とりあえず購入。

MCUはPIC16F886を使用。

参考書はCQ出版 「動かして学ぶCAN通信」(¥2600税別)。





とりあえず、書籍どおり回路を組んでみる。
CANコントローラとPICの通信(CANの前にもう1つ通信がある!)は、

「SPI」という通信方式で行うそうで。

PIC16F886に標準でこの機能があるのでそれを利用しようと計画。

しかし、ここからが泥沼の日々。

書籍で使用しているプログラム言語はC言語。

ワタクシはアセンブラを使用。

うーん。時代はC言語が主流なんですかねぇ。



とりあえず、MCP2515のRX0BFピンを出力にして、LEDをピッカリさせてみようと、


四苦八苦しながらプログラムを書いてみました。
 
しかし、反応無し。

ネットで検索しても、参考になる情報が見つからない。

試行錯誤の末、SPIの設定がよろしくない事が判明。

MCP2515はSPIモード0,0か1,1に対応との事で、

PICのSSPCONレジスタのCKPを0、SSPSTAレジスタのCKEを0にしていたのですが、

CKP,CKE共に1すると動作しました。理由はよく分かりません。

タイミングチャートを見ても理解不能だし、

SPIのモードってのもよく分からないし、

とりあえず動くので放置です。

気を良くしてLEDを0.5秒間隔でピカピカさせてみましたYO。




次に、MCP2515のレジスタの内容を読んでみようと試みましたが、

またもやうまく動作しません。

自分で書き込んだレジスタの状態を読んだのですが違う値が出ます。

他のレジスタを読んでも、8ビット目が必ず1になり、

その他が左に1ビットシフトしているような感じになっていました。

試行錯誤の末、SSPSTAレジスタのSMPを1にすると改善されましたYO。

MCP2515のデータは半クロック分遅れて送信されているようで、

出力データの後縁で読むとうまく動作しました。



結論
・PICのSPIモードはCKP,CKE=1,1にする
・SMP=1とする

これでとりあえずCANコントローラとの通信は可能になりましたYO。

しかし、PICを使ってCAN通信をする人は少ないのか、

参考になるページや書籍が少ないですねぇ。

CAN通信をするまでにはまだ道のりは遠そうです。