も使ってみたい
けどディバイスがないな
今度メモリ買ってみようか
PIC同士の通信には向かない気が
マスター/スレーブの区別なく通信できる規格が簡単に使えればいいんだけど
PICを動作させたときのソースとかを細々と書いていく 入門者の手助けに~ などという崇高な使命が有るわけでもなく メモってるだけ ただ自分が初心者レベルなので役に立つ部分もあるかもしれない 保証はしないが…
2010年12月9日木曜日
2010年11月29日月曜日
ロータリーエンコーダの簡単な使い方
とりあえずメモ程度に
時間があればまた加筆します
PIC16F88を使った場合の方法
エンコーダのRE1をPORTB0にRE2をPORTB1に接続
配線は普通のロータリーエンコーダと同じようにプルアップで接続
またチャタリング処理がめんどくさいので
RE1/RE2共に0.1μF程度のパスコンでGNDに接続
そしてプログラムはRB0の割り込みを使って回転を検出
RB0の立ち下がりエッジで割り込みに設定
割り込みがかかれば10mS程度おいてからRB1の状態を確認します
例えば回転方向によって変数"cnt"を増減させたい場合は
/* **** */
if (RB1) cnt++;
else cnt--;
/* **** */
っていうふうにしておけばある程度は検出可能です
そしてこの後チャタリング対策としてさらに10mSから20mS程度放置してから
RB0の割り込みフラグを0に戻して割り込み処理を終了します
それからシリアル送信中とかに割り込みがかかると大変なので
シリアル送信開始時にRB0の割り込みを停止させて
送信終了時に割り込みを再許可するなど
工夫は必要
そこら辺は各自試してみてください
時間があれば回路図とソースとかもうpするかも
時間があればまた加筆します
PIC16F88を使った場合の方法
エンコーダのRE1をPORTB0にRE2をPORTB1に接続
配線は普通のロータリーエンコーダと同じようにプルアップで接続
またチャタリング処理がめんどくさいので
RE1/RE2共に0.1μF程度のパスコンでGNDに接続
そしてプログラムはRB0の割り込みを使って回転を検出
RB0の立ち下がりエッジで割り込みに設定
割り込みがかかれば10mS程度おいてからRB1の状態を確認します
例えば回転方向によって変数"cnt"を増減させたい場合は
/* **** */
if (RB1) cnt++;
else cnt--;
/* **** */
っていうふうにしておけばある程度は検出可能です
そしてこの後チャタリング対策としてさらに10mSから20mS程度放置してから
RB0の割り込みフラグを0に戻して割り込み処理を終了します
それからシリアル送信中とかに割り込みがかかると大変なので
シリアル送信開始時にRB0の割り込みを停止させて
送信終了時に割り込みを再許可するなど
工夫は必要
そこら辺は各自試してみてください
時間があれば回路図とソースとかもうpするかも
2010年11月23日火曜日
セラミックコンデンサ配布
15pFのセラミックコンデンサが余る可能性があるので
必要な人がいたら配布する予定
数量は限定200個とかそこら辺
これはPICで20MHzの水晶を使うときに必要になります
2個で1セットなので100セット分くらい
必要な人がいるようならコメントなどくれれば方法を投稿します
確定ではないですがほぼ確定に近いです
※20MHzの水晶は各自用意してください
2010年11月18日木曜日
PICCでシリアル通信(送信のみ)
タイマ割り込みを使用した方法
int SC = 0;
int SD = 89;
bit SF = 0;
static void interrupt intr(void) {
T0IF = 0;
TMR0 = 7;
if (SF) {
if (SC == 0) RB0 = 0;
if (SC > 0 && SC < 9) RB0 = ((SD >> (SC - 1)) & 0b00000001);
if (SC == 9) RB0 = 1;
SC++;
if (SC > 9) {
SC = 0;
SF = 0;
}
}
}
ということでタイマ割り込みは使用できなくなります...
しかし自分は日常的にタイマ割り込みを使うわけでもないので
手っ取り早くPCとかに文字列を送信したければこれで十分な気が
クロック20MHzで9600bps
8ビットパリティなしストップビット1 かな?
PICCLiteが対応してるPICであれば基本的に何でも動作可能だと思います
タイマはプリスケーラ000です
要はタイマ割り込みに103.5μS程度で入ればいい
通信速度は9600が一般的だからこの数値ですが
「もっとゆっくりでいいし!!!」っていう人は各自設定してください
上はどれくらいまで送信できるかわかりませんが
かなりの部分でクロックの精度に依存してくると思います
とりあえずこのプログラムだと8ピンから28ピンとかだいたい使用可能だと思う
int SC = 0;
int SD = 89;
bit SF = 0;
static void interrupt intr(void) {
T0IF = 0;
TMR0 = 7;
if (SF) {
if (SC == 0) RB0 = 0;
if (SC > 0 && SC < 9) RB0 = ((SD >> (SC - 1)) & 0b00000001);
if (SC == 9) RB0 = 1;
SC++;
if (SC > 9) {
SC = 0;
SF = 0;
}
}
}
ということでタイマ割り込みは使用できなくなります...
しかし自分は日常的にタイマ割り込みを使うわけでもないので
手っ取り早くPCとかに文字列を送信したければこれで十分な気が
クロック20MHzで9600bps
8ビットパリティなしストップビット1 かな?
PICCLiteが対応してるPICであれば基本的に何でも動作可能だと思います
タイマはプリスケーラ000です
要はタイマ割り込みに103.5μS程度で入ればいい
通信速度は9600が一般的だからこの数値ですが
「もっとゆっくりでいいし!!!」っていう人は各自設定してください
上はどれくらいまで送信できるかわかりませんが
かなりの部分でクロックの精度に依存してくると思います
とりあえずこのプログラムだと8ピンから28ピンとかだいたい使用可能だと思う
登録:
コメント (Atom)