人気ブログランキング |

体重と今日食べたもの

k1segawa.exblog.jp

ダイエット

ブログトップ

2015年 06月 08日 ( 3 )

I2Cでは出力ピンになるので、入力ピンをプルアップ抵抗に繋ぐように変更。
理由はちょっと難しいので後で書く。

【回路図】
a0034780_21352761.jpg


【配線図】
a0034780_214030100.jpg


【Cプログラム】
main() {
unsigned char a[34]={0,2,6,2,6,0,4,2,6,0,5,0,5,0,5,0,
5,0,5,0,5,0,5,0,5,0,5,0,5,0,5,8,12,99};
int c,d,i;
unsigned char r;
int x=-1;int w;

clrscr();
outport(0x60,1);
outport(0x61,1);

do {

c=10;d=0;i=-1;
do {
outport(0x62,(a[i] & 0xFE);
if((a[i] & 1)!=0) {
r=inport(0x62);
if(c!=10) {
if(r==1)
d+=(1<<c);
if(c==0) {
w=(int)(d/8);
if(x!=w) {
gotoxy(0,3);printf("%d\n",d);
line(x+(x<w),0,w+(x>w),15,2,0xFFFF,2);
x=w;
}
}
}
c--;
}
} while(a[i++]!=99);
} while(1);
}
CDSを隠すと、グラフィックの棒グラフが伸びる方向に逆転した。
値は200台から800台で変化するように変わった。あれ?
なぜか調べるのに文字を(0,3)から表示する。
いやいや信号が逆転すると思ってr==1→0に修正したんだけど元に戻した。それにwを表示してたし。
気のせいでした。
a0034780_22255829.jpg


【マイコンとの配線例】
マイコンにRC用サーボモーターを繋げる場合の電源投入時における挙動様の図が、一般的なプルダウン抵抗の説明の図がスイッチを使っているのと違って、今回の場合と似ていて分かり易い。
a0034780_22564363.jpg

左のPortがMCP3002のDoutで出力。右のSignalがポケコンの4ピンで入力に相当。
この時どうやってプルアップ抵抗を付けるのが正しいか、不安だったのだが、こちらのサイト様と偶然同じだった事でこれでよかったんだと一安心。

【蛇足】
ついでにサイト様の一瞬動くというのは、たぶんステッピングモーターであってもHI→LOWになるとモーターがコイルに残っている磁力で逆電流を起こすから、Signalに入力ピンであるにもかかわらず、出力のような電流が流れるのだと思う。つまりI2Cの懸念でプルアップ抵抗に変更した理由と同じ。そしてプルアップであってもPortがLOWになっているという事は、PortがGNDにmicro controller内部で繋がっているという事(ここが私も忘れてしまうところ:重要)なので、その逆電流がPortに流れ込んでしまい、一瞬動くのだと思う。(HIならVCCもHIでSignalから来たHIはどこにもいかず抑え込まれる)
しかしLOWにしないわけにもいかないから、モータサイドで対策する必要がある。
またPortが出力(入力モードならたぶん内部で抵抗がかまされているはず)ピンでLOWになっていると抵抗なしでGNDに繋がっているはずなので、一瞬でもmicro controllerには5Vが直結する事になるので、やはりSignalのピンの直前に1kΩ程度の抵抗をかませた方がいい。(マニュアルは大事)
結局モータの逆電流に関してはモータのユニットの方でダイオードやコンデンサで逆流しないようにするほか無いけど、こういう検討も必要かな。I2Cで入力ピンを出力にもするなら4ピンも1kΩの抵抗が必要。
by k1segawa | 2015-06-08 22:04 | ポケコン | Comments(0)
SPI通信について。

スレーブ(SPIモジュール)によってSPI通信のサポートする種類が異なるようだ。

SPI通信といってもクロックの立上がり・立下りでデータを取り出すようにインプリメントするケースや、
最初のMSBFをクロックの最初から取り出すか、1CLK待ってから取り出すようにインプリメントするかを、スレーブが選べるようにしている。

従って4種類あって、MCP3002はそのうちMODE0,0(モード0)とMODE1,1(モード3)の形式のSPI通信をサポートしているようだ。

MCP3002データシート15ページ目図6-1,2

だからと言ってモード0と3を切り替えられるわけではなく、両方とも立上がりでデータを取り出すモードなだけだ。
MSBFも余り神経質にならずにその前に続くStartビットからの流れで取り出せばよく、モード0と3の違いが余りわからない。(下記サイト様のSPIの罠様にはきちんと書いてある)

SPI通信のモードに関しては、以下のサイト様が参考になった。
SPIについて
SPI Transfer Modes | USB-I2C/SPI/GPIO Interface Adapters
SPIの罠

0,0と1,1は立上がり、0,1と1,0は立下りでデータを読み書きする。

SPI通信ができたといってもMCP3002の場合だけなので、別のSPIモジュールの時は同じ手順とは限らないという事。
さらにモードの呼び方まで統一されてないらしい(SPIの罠様参照)ので、きちんとタイミングチャートとモードの対応をデータシートで確認する事。

SPI通信は同期(外部クロックが要らない―自分でクロックを作って送り込める)通信で、かつ単方向信号(双方向でない)なのに、信号線が独立しているからスピードも出る。なのでSDカードの読み書きもSPI通信。
SDカードの構造と内部レジスタ(その1) | ミームス(MEMEs)のサポートページ様や浅草ギ研 A33FでMicroSDカードにアクセスしてみる様などでは、詳しいSD用コマンドが解説されているので、SPI通信の応用にいいかもしれない。
by k1segawa | 2015-06-08 19:51 | ポケコン | Comments(0)
そろそろ電池が消耗してきたので、プログラムをPCに退避。

主にTEXTモードで保存した場合を示す。

(1) 12/14の記事を見てケーブルを繋ぐ。
(2) デバイスドライバでCOMポート番号を確認。
(3) 1/4の記事でTeraTermの設定を行う。(128x24にしておくと後で助かる)
(4) ポケコンのTEXTボタン>F(ile)>L(oad)で、LOAD →と出るのでカーソル移動して保存したいプログラムを選ぶ(リターン)。(マニュアルP.177)
※この時BASIC中間コードで保存してある場合、マニュアルP.177によれば、エラー(FILE MODE ERROR)になるので、その時は別途記述する。
(5) << PROGRAM FILE >>というメニューに戻るので、TEXTボタン>S(io)>S(ave)で、PCへ送出。
(6) TeraTermの画面にプログラムが表示されるので、マウスで先頭から末尾+空行1行辺りまで選択して、コントロール+Cを押す。
(7) テキストエディタを開き、余計なものがあってもいいように、コントロール+Aで全選択し、コントロール+Vで上書きする。
(8) (4)でLOADした時の名前を参照する。
(9)名前を付けて保存で、LOADで選択した時の名前を付けて保存する。
(繰り返す場合)
(10) (8)で次のファイルを選択する。
(11) TeraTermの画面でEdit>ClearScreen、Edit>ClearBufferと実行し、余計なものを消す。
(12) (5)に戻って以下同じ。

【ポケコンの方の設定】
TEXTボタン>S(io)>F(ormat)
9600,8,1,none,CR LF,1A,yes,RS/CSに設定

書くととても面倒だが、ポケコン側は単に
TEXTボタン:*** TEXT EDITOR ***モード
└→ F(ile):<< PROGRAM FILE >>モード>L(oad)
もう一度TEXTボタン:
└→ S(io):<< SIO >>モード>S(ave)
を繰り返しているだけ。(たまに間違ってFの代わりにLを押して"--- PRINTING ---"と出るけどONキーをちょっと長押しすれば戻る)
TeraTermも単に受信した文字列をコピーし、画面をクリアしているだけ。
エディタも貼り付けられた文字列を名前を付けて保存しているだけ。(※TeraTermの80行を超える長い行はコピーして貼り付けると改行が付加されるので、行番号のない行は前の行とくっつけて1行に編集する事。あらかじめTeraTermを80x24から128x24ぐらいに変更しておくとよい)

通信さえ整っていれば、これを繰り返しているだけ。通信は最初から全く変更していない。

※LOADでエラーの時は、BASICボタン>LOAD"そのファイル名"で読み出すか、
TEXTモードのように、BASICボタン>FILES(リターン)と入力し、SHIFT+M(LOAD)(マニュアルP.159)で読み出すこともできる。
LOADしようとしたファイルがTEXTだった場合、ERROR 96(マニュアルP.386)が出てBASICじゃない旨を教えてくれる。
その後、TEXTボタン>B(asic)>Text←basicでBASICをTEXT変換する。
この時TEXTプログラムを削除するかY/Nで聞いてくるので、必要ならTEXTを保存してからTEXT変換する。
BASICプログラムとTEXTは両方同時にメモリに存在できるので、落ち着いて行う。
by k1segawa | 2015-06-08 13:50 | ポケコン | Comments(0)