部品がとどいたので、あれこれ、やりました。
Xbeeの設定をするのに、XCTUというソフトを使いますが、
新しいバージョンになっていて、当てにしていた諸兄のHP
のバージョンと違ってしまって、操作をするのに戸惑いまし
た。
時間がかかりましたが、やっと、シリアル通信部分をワイヤ
レスに置き換えることができました。
PC→Xbee・・・・ワイヤレス・・・・Xbee→PIC
という構成で、PCからの信号で、PICをコントロールすること
ができました。
キーボードから、数字を打ち込んでいます。その数字によっ
て、LEDの点灯をコントロールしています。A相B相のパルス
の生成もオシロで確認しましたら、大丈夫でした。
どの程度の応答速度があるのか不明ですが、見通しがたち
ました。
構成の詳細は、後日、掲載いたします。
---自作MPGワイヤレス化 (3)---
やっと部品が明日届きそうです。今は、PCからUSBの変換
を通してRS232C経由で、PICの受信のテストをしています
が、RS232Cの部分をワイヤレス化して,実験をしようと思い
ます。
受信側PICのプログラムは、一応完成ですが、実験しなが
ら、A相B相のパルスの調整が必要になるかもしれません。
一応、動いたプログラムです。
main.c
送信に使うPICですが、割り込みを使った送信をしたいと
思ってましたが、諸兄の例題がちょっと難しくで、とりあえず
ポーリングで、組んでみようと思います。
---自作MPGワイヤレス化 (2)---
MPGのワイヤレス化をするにあたって、PICのプログラムを
簡単にするため、今まで使ったことのないPICを選定しまし
た。
送信側に、16F1783を使い、受信側に16F88を使おう
と思います。
16F1783という28PのPIC選定の理由は、状態割り込み
に使える端子が、沢山あることです。18ピンのものも検討
しましたが、状態割り込みとUART割り込みのPINがダブっ
ているので、状態割り込みを7本とれません。
16F1782は28PINのうち、状態割り込みにつかえるのが
なんと、25PINあります。そのうち使うのが7本を状態割り
込みで使います。それに、1本を外部割り込み(パルスの
タイミング取り込み)に使い、後、2本を、CW、CCWの判定
に使います。
合計、7+1+2+VSS+VDDですから。12本だけつかい
ますから、贅沢な使い方だと思います。
---自作MPGワイヤレス化 (1)---
リモコンよろしく自作のMPGをワイヤレス化するという、
無謀な取り組みをしています。
赤外線通信等、信号を変調して伝送するのは、ちょっと
できませんが、RS232Cの延長で、キャラクターの送信
は、有線でできました。
この部分をワイヤレス化すれば、実現できそうです。
そのために、受け手のPICで、A相B相のパルスを生成します。
なかなか実現できませんでしたが、やっと、エンコーダーの
パルスと近い波形を生成することができました。
送り手のPICから、1バイトのキャラクターコードを送り、
受け手のPIC側で、それに応じた処理を行います。
一番の難物がパルスの生成でした。
キーボードから操作してますが、一回キーボードのキーを押
すと一回だけパルスが生成できます。連続で押すと、連続
で生成できました。
有線のRS232Cで送ってますので、ワイヤレス化した時の
応答速度が気になるところですが、まあ、DIYの範囲での
使用ですので、それほど気にしなくてもいいと、思うことに
します。
プログラムは、当初、割り込みで処理する予定でしたが、
ポーリングの処理でも、それほど変わりないようなので、
通常のものに変更しました。
プログラムは、後日掲載します。
---新しい開発環境(8)---
また、また、はまりました。二日ほど、あれこれ悩みました
が結局、プログラムのミスでした。
<はまったことその1>===============
タイマー0とタイマー1の割り込みで、割り込みの関数
部分で、初期値の設定を入れる部分が違ってました。
switch文で、本来なら、switchを抜けてから再設定
しなければならないのに、switchのなかに書いてました。
void interrupt InterReceiver( void ){
if(TMR1IF==1){
if(ccw==0){
if(p_count<6){
p_count++;
}
switch(p_count){
case 1:cwOut=0;
ccwOut=0;
break;
case 2:cwOut=1;
ccwOut=0;
break;
case 3:cwOut=1;
ccwOut=1;
break;
case 4:cwOut=0;
ccwOut=1;
break;
case 5:cwOut=0;
ccwOut=0;
break;
case 6:cwOut=0;
ccwOut=0;
TMR1L = tMr1_Low;//TMR1初期値
TMR1H = tMr1_Hight;//
break;
}
}
(本来の位置)
TMR1IF=0;//割り込みフラグクリアー
}
下記の部分の位置が問題でした。
TMR1L = tMr1_Low;//TMR1初期値
TMR1H = tMr1_Hight;//
6回割り込みさせて、一連の動作がが終わるように組みましたが、
初期値の設定を変えても割り込みの時間がほとんど変わりませんでした。
なんのことはない、割り込みで、6回目に戻ってくる時に
だけ初期値が設定されますので、1回だけは、期待した
時間での割り込みがかかりますが、後の5回は、なんと
設定の最大値、65536まで、カウントアップしてました。
これでは、期待した動作になりません。
期待した動作をさせるには、フラグのクリアーの前に入れ
ないとだめでした。
<はまったことその2>==============
「main」のプログラムでは、必ず無限ループを作りますが、
このなかの処理で、大きな勘違い。
if文で判定をして、動作をさせましたが、if文に一回だけ
入って処理をさせたかったのですが、一回動作をさせた
後に、ifの条件を書き換えなかったので、動作を永遠に
繰り返すことになって、終わりませんでした。
終わりにさせたかったのがタイマー1の割り込みだった
ので、タイマー1の割り込みのストップの方法をあれこ
れさがしてしまいました。分かれば、なんのことはない、
単純なミスでした。最新の開発環境にして、単なるシンタッ
クスミスは、環境の方で指摘してくれるので、文法的な間違
いは、ほとんど時間を賭けずに修正できるようになりました
が、アルゴリズム等のミスは、ダメです。修正に時間がかか
ります。
頭が硬くなってます。
---ルーレット表示製品版---
MPGをステッピングモーターに直接つないでコントロール
するアダプターを作成するにあたって、LEDを使った表示を
ルーレット風にしましたが、同じようなもので、製品版が
あるんですね。
また、○ジナルマインドさんにも、A相B相をCW・CCWの信号
に変換するIC(16F84A)が販売されているようです。
ドライバーの入力がCW・CCW(DIR)しかないもののアダプター
にするようです。
私と同じ目的にも使えそうです。
全部ソフトでコントロールしてるんですね。
ソースリストでも見てみたい気がしますが、きっと、
アセンブラーでしょうね。
---値段の不思議---
PICのプログラムをPICに書き込むのに、ADWINのPICライター
を使ってました。
16F88等の古いものを使ってるぶんにはいいのですが、
開発環境を新しいものに変更したついでに、16F1ファミリーの
新しいPICも使ってみようと思いました。
ところが、このADWINのPICライターは、新しいPICには対応
してないようで、書き込みができないので、新しいライター
を買うことにしました。
何にしようか迷いましたが、諸先輩がお使いになっている
定番のPICKIT3を購入することにしました。
ネットと値段を調べてみるとびっくり。だいたい同じ値段でしたが、
○mazonでは、10倍の値段のものが売られています。
多分、○月のと同じものだと思いますが、びっくりです。
それとも別物なのでしょうか。○mazonのものは、
パッケージに、「XYGstudy」の表記が見られますが、
○月のものにはありません。
同じものだとすると、この値段の違いは、
なんでしょうか。
---新しい開発環境(7)---
新しい環境で、あれこれやっています。TMR0(タイマー0)
を使ったプログラムを作って検証していますが、いくつか
思うように動かないことがありました。
使ってるPICは、16F88というOLDなものですが、新しいの
を使うには、細かいところで、分からないところがあるので
未だに使ってます。
さて、内部クロックを使ってる時は、動いたように思いますが
20Mhzのセラロックを外部につけて動作させると、どうも、
プリスケラ-が使えないようで、値をかえても動作に変化
がありません。
また、TMR0の停止が思うようにできませんでした。
いろいろNETであさって見ると、諸兄のHPで、
<TIMER0>
TIMERのON/OFF制御が出来ない。
外部クロック入力同期(Sync2Cycles)がONに固定
されている。
の記事を見つけました。
16F88のTMR0については、「ON、OFFができない」という
ことで一つは解決しましたが、プリスケラ-が反映されないの
が分かりませんでした。
諸兄の回路図を見ると、水晶発振子を使って、RA7に入れ
ているようで、CONFIGの設定も、EXTCLKになっています。
私のセラロックは、RA6とRA7に入れて、CONFIGは、HSに
しています。こんな風にすれば、入力が1本ですみますね、
また、一つ勉強です。
まだ、まだ、奥は深いです。
CLOCKを外部入力にすると、TMR0は、固定されてしまう
のでしょうかね。
<追記>
どうやらプログラムの勘違いをしていたようです。
一部変更したら、動きました。
---新しい開発環境(6)---
---新しい開発環境(5)---
今日一日、正確にい言うと、昨夜から、もがいていました。
その結果、やっと、割込を使った受信ができるようになりま
した。
今回はまったのは、諸兄のプログラムを移植していましたが、
16F88ではないPICのプログラムだったので、またもや入力
ピンの設定が違ってました。ここを直したら、すんなりでした。
また、割込の書式も違うのかなと思って旧の環境での記述と
新しい環境での、記述両方してみましたが、両方とも、通り
ました。
旧 RCIF = 1
新 PIR1bits.RCIF = 0
使えない表記だとすぐに、?マークがでるので、新しい環境
での開発は、楽です。
この割込のプログラムは、違う諸兄のプログラムを改変しました。
いろいろゴミが残ってますが、私の環境で、一応動いたもの
です。