2015-12-07 Mon
道のりは、長いです。自作手パの無線化を進めてきましたが、一つ、疑問だったこ
とが解決できそうですので、仕様?を変更してみたいと思い
ます。
今までの無線手パでは、A相B相の信号は、直接送っていま
せんでした。A相とB相の信号から、CWの信号とCCWの信号
に変換して、CWの信号とCCWの信号を送りました。
受信側で、CWとCCWの信号に応じて、パルスを生成してい
ました。
このようにしてたのは、A相・B相の立ち上がりの検出はでき
たのですが、立ち下がりの検出方法が分からなかったから
です。
NANDゲート等を使ってNOT・A相を作ればいいというアドバイ
スをいただきました。下記のような回路で、試作してみようと
思います。
CWやCCWのの判定をするのに、立ち上がりでの外部
割り込みを使いましたが、NOT・A相、NOT・B相を作ることで
A相B相の立ち下がりを立ち上がりとして検出できそうですの
で、状態変化割り込みでNOT・A相、NOT・B相の検出を追加す
るだけですから、それほど大きな変更はしなくてすみ
そうです。
コメント
oldmanさん、こんばんは、ご指摘ありがとうございます。
今回の制作にあたって、A相B相からDフリップフロップで
Dir信号を生成したことが頭にあって、これを使えば
CWとCCWの信号として解釈して送れるな、と
思い、これなら立ち上がり検出だけで、外部割り込みが使え
ると単純に考えました。
oldmanさんのおっしゃるように、状態割り込みは、
立ち上がりも立ち下がりも検出できるということが後日わかりました。
今回は、今までNANDゲートを使ったことないので、勉強がてら、
使ってみようと思ってます。
「割り込み内は、身軽に」という、ということで、送信処理ををmain
の方に移してみようと思います。
割り込みの方では、mainの指示のみ、というふうに変更試みてみます。
アドバイスありがとうございました。
今回の制作にあたって、A相B相からDフリップフロップで
Dir信号を生成したことが頭にあって、これを使えば
CWとCCWの信号として解釈して送れるな、と
思い、これなら立ち上がり検出だけで、外部割り込みが使え
ると単純に考えました。
oldmanさんのおっしゃるように、状態割り込みは、
立ち上がりも立ち下がりも検出できるということが後日わかりました。
今回は、今までNANDゲートを使ったことないので、勉強がてら、
使ってみようと思ってます。
「割り込み内は、身軽に」という、ということで、送信処理ををmain
の方に移してみようと思います。
割り込みの方では、mainの指示のみ、というふうに変更試みてみます。
アドバイスありがとうございました。
| mabo | EMAIL | URL | 15/12/09 20:30 | AbwKzIS6 |
maboさん、こんにちは。多分、違うと思います^^;
> INTCONbits.IOCIF=0;//割り込みフラグクリアー
というのは RB1~4のハードにアサインされているフラグを意味してますよね?
私の説明が一般名称として『フラグ』という言葉を使っていまい誤解させてしまったと思います。申し訳ありませんでした。
>・ 割り込み処理内では、\'文字Aを送れ\'という指示(フラグ)をセットするのみ
>・ mainルーチンは、指示チェックの無限ループ
>・ mainルーチン内でのフラグチェックとクリアは割り込み禁止状態で行う(googleで調べてみてください)。
> a. 割り込み禁止にする
> b. フラグチェック ⇦ ◆『\'文字Aを送れ\'という指示』があるかどうかをチェックする との意図です◆
割り込み処理ルーチンとしては、ワイヤレス化(6)にある送信プログラム(main.c)の状態割り込み処理の部分で、「putch(\'X\')」の部分を「set-chx-flag = on」などの変数(1ビット)でメインルーチンに指示するイメージです。
この部分に、RB1~4のフラグ処理とメインルーチンへの指示も追加してください。
メインルーチンは、set-chx-flagをチェックして onなら putch(\'X\')を実行するというのを全ての指示を調べて実行するループとなります。
...で、またまた修正が必要な事を見つけてしまいました(何せ PICをまともに使った事が無いもので....)。
何故ここで、「状態割り込み」と「外部割り込み」を区別して使っているのか疑問に思い調べて以下を見つけました。
・状態変化割り込み - 浅草ギ研 ( www.robotsfx.com/robot/robohow/RoboHow154/RoboHow154.html )
秋月のPIC16F1783からダウンロードしたデータシートの 139ページも「14.0 INTERRUPT-ON-CHANGE」がありました。
適切な値を設定すれば、「各信号線の 『立ち上がり』と『立ち下がり』の両方で割り込みを起こせる」と書かれています^^;。
余分なNANDゲートなど使わずに、プログラムだけで今回の目的を達成できるそうです。
頑張ってください
> INTCONbits.IOCIF=0;//割り込みフラグクリアー
というのは RB1~4のハードにアサインされているフラグを意味してますよね?
私の説明が一般名称として『フラグ』という言葉を使っていまい誤解させてしまったと思います。申し訳ありませんでした。
>・ 割り込み処理内では、\'文字Aを送れ\'という指示(フラグ)をセットするのみ
>・ mainルーチンは、指示チェックの無限ループ
>・ mainルーチン内でのフラグチェックとクリアは割り込み禁止状態で行う(googleで調べてみてください)。
> a. 割り込み禁止にする
> b. フラグチェック ⇦ ◆『\'文字Aを送れ\'という指示』があるかどうかをチェックする との意図です◆
割り込み処理ルーチンとしては、ワイヤレス化(6)にある送信プログラム(main.c)の状態割り込み処理の部分で、「putch(\'X\')」の部分を「set-chx-flag = on」などの変数(1ビット)でメインルーチンに指示するイメージです。
この部分に、RB1~4のフラグ処理とメインルーチンへの指示も追加してください。
メインルーチンは、set-chx-flagをチェックして onなら putch(\'X\')を実行するというのを全ての指示を調べて実行するループとなります。
...で、またまた修正が必要な事を見つけてしまいました(何せ PICをまともに使った事が無いもので....)。
何故ここで、「状態割り込み」と「外部割り込み」を区別して使っているのか疑問に思い調べて以下を見つけました。
・状態変化割り込み - 浅草ギ研 ( www.robotsfx.com/robot/robohow/RoboHow154/RoboHow154.html )
秋月のPIC16F1783からダウンロードしたデータシートの 139ページも「14.0 INTERRUPT-ON-CHANGE」がありました。
適切な値を設定すれば、「各信号線の 『立ち上がり』と『立ち下がり』の両方で割り込みを起こせる」と書かれています^^;。
余分なNANDゲートなど使わずに、プログラムだけで今回の目的を達成できるそうです。
頑張ってください
| oldman | EMAIL | URL | 15/12/09 19:41 | r0ohnno6 |
oldmanさん、実際のmainのコーデングは、下記のでいいのでしょうか。
while(1) {//無限ループ
INTCONbits.GIE = 0; // 全体割り込み禁止
if(INTCONbits.IOCIF){
INTCONbits.IOCIF=0;//割り込みフラグクリアー
INTCONbits.GIE = 1;//全体割り込み許可
putch(Send_data);//データ送信
}
else{
INTCONbits.GIE=1;//全体割り込み許可
}
}
while(1) {//無限ループ
INTCONbits.GIE = 0; // 全体割り込み禁止
if(INTCONbits.IOCIF){
INTCONbits.IOCIF=0;//割り込みフラグクリアー
INTCONbits.GIE = 1;//全体割り込み許可
putch(Send_data);//データ送信
}
else{
INTCONbits.GIE=1;//全体割り込み許可
}
}
| mabo | EMAIL | URL | 15/12/08 20:20 | AbwKzIS6 |
oldmanさん、こんばんは。お忙しいのに、今日もアドバイスありがとうございます。
私もよく分かりませんでしたが、後閑哲也さんの本では、
「立ち上がり、立ち下がり」の表記が使われていました。
詳しい時間の計算の上のアドバイスありがとうございます。
私は、この辺、全然苦手で、適当にしてしまいました。
oldmanさんのおっしゃるように、考えると、割り込みによる不具合等は起こらないですね。
今回は、その辺は,全く考えていませんでしたので、取り入れて行きたいと思います。
これなら、私にもできそうです。
いつもながら、適切なアドバイスありがとうございます。エンコーダーは、低価格で購入できるんですね。
私もよく分かりませんでしたが、後閑哲也さんの本では、
「立ち上がり、立ち下がり」の表記が使われていました。
詳しい時間の計算の上のアドバイスありがとうございます。
私は、この辺、全然苦手で、適当にしてしまいました。
oldmanさんのおっしゃるように、考えると、割り込みによる不具合等は起こらないですね。
今回は、その辺は,全く考えていませんでしたので、取り入れて行きたいと思います。
これなら、私にもできそうです。
いつもながら、適切なアドバイスありがとうございます。エンコーダーは、低価格で購入できるんですね。
| mabo | EMAIL | URL | 15/12/08 19:20 | AbwKzIS6 |
度重なるミスご容赦を 再アップします。
可能なら 前のコメントの削除をお願いします。
(蛇足です)
先日、秋葉原散歩でロータリーエンコーダを衝動買いしてしまいました( http://www.aitendo.com/product/12353 お店では特売セールでもっと安い...)。そのうち何かに使いたいなと思ってます。
メカニカル方式なので、チャタリング防止は必須ですが、割り込み処理ルーチン内で文字送信を実行し、A相/B相の全ての割り込み情報をクリアしてしまえば完全なチャタリング防止(良い子は真似しないように!)になりますね。
そのうち試そうと思ったけど XBeeを使う予定が無いことに気付きました。まあ、24パルス/回転という仕様なので組み合わせる無線機器も安価なZigBeeワイヤレスモジュールで、チャタリング防止も実装されていてプログラムする必要も無いですが。
可能なら 前のコメントの削除をお願いします。
(蛇足です)
先日、秋葉原散歩でロータリーエンコーダを衝動買いしてしまいました( http://www.aitendo.com/product/12353 お店では特売セールでもっと安い...)。そのうち何かに使いたいなと思ってます。
メカニカル方式なので、チャタリング防止は必須ですが、割り込み処理ルーチン内で文字送信を実行し、A相/B相の全ての割り込み情報をクリアしてしまえば完全なチャタリング防止(良い子は真似しないように!)になりますね。
そのうち試そうと思ったけど XBeeを使う予定が無いことに気付きました。まあ、24パルス/回転という仕様なので組み合わせる無線機器も安価なZigBeeワイヤレスモジュールで、チャタリング防止も実装されていてプログラムする必要も無いですが。
| oldman | EMAIL | URL | 15/12/08 17:59 | r0ohnno6 |
ついでに、ソフトのほうの(小さな^^;)変更についてコメントさせてください。
(考えた筋道)
A相/B相の立ち上がり立ち下がり(この言葉が一般的かどうか自信が無かったので私は使いませんでした)を伝送するようになればパルス生成のボトルネックは無くなる。→ 次にネックになるのは通信(9600bpsだと1文字伝送するのに1mSec)だろうな。→ MPGが100パルス/回転だから 各相の立ち上がり/立ち下がりを伝えるのに 400文字として MPGを毎秒2.5回転させると通信(9600bps)とコンパラになるな。→ 通信速度を19200bpsにしておけば性能的には問題ないなあ。
(で、ふと気付いた事が...)
割り込み処理の中で文字を送出してたような...。→ 割り込み処理中に 次の割り込みが来る可能性が出てくる。→ 昔、割り込み処理内(割り込み禁止状態)で I/O動作や時間のかかる計算などをするなと怒られた記憶が...。部下を怒った事も...。
(割り込み処理/システムとしてのレスポンスを良くする為に、ソフトを(小)変更しましょう^^;)
・ 割り込み処理内では、\'文字Aを送れ\'という指示(フラグ)をセットするのみ
・ mainルーチンは、指示チェックの無限ループ
・ mainルーチン内でのフラグチェックとクリアは割り込み禁止状態で行う(googleで調べてみてください)。
a. 割り込み禁止にする
b. フラグチェック
c-1. フラグが立っていれば
c-2. フラグをクリア
c-3. 割り込み禁止を解除する
c-4. I/O処理実行(文字送出)
d-1. フラグが立っていなければ
d-2. 割り込み禁止を解除する
まあ、今回の処理では
・ MPGを毎秒2回転以上の速度で回す事は無い(出来ない) → 割り込みは 1.25mSec以上の間隔で発生
・ 通信速度を19200bpsにする → 指示送出は 0.5mSecで済んでしまう
・ 割り込み処理/mainでの処理は 1Kステップ以下(クロック32MHzなら40μSec以下)
という事を勘案すると mainルーチン内での割り込み禁止への配慮は無くとも良いとは....。
( でも、割り込み処理ルーチン内(=割り込み禁止状態)での処理は 必要最小限のステップにとどめるのがマナー^^; )
(蛇足です)
先日、秋葉原散歩でロータリーエンコーダを衝動買いしてしまいました( http://www.aitendo.com/product/12353 お店では特売セールでもっと安い...)。そのうち何かに使いたいなと思ってます。
メカニカル方式なので、チャタリング防止は必須ですが、割り込み処理ルーチン内で文字送信を実行し、A相/B相の全ての割り込み情報をクリアしてしまえば完全なチャタリ
(考えた筋道)
A相/B相の立ち上がり立ち下がり(この言葉が一般的かどうか自信が無かったので私は使いませんでした)を伝送するようになればパルス生成のボトルネックは無くなる。→ 次にネックになるのは通信(9600bpsだと1文字伝送するのに1mSec)だろうな。→ MPGが100パルス/回転だから 各相の立ち上がり/立ち下がりを伝えるのに 400文字として MPGを毎秒2.5回転させると通信(9600bps)とコンパラになるな。→ 通信速度を19200bpsにしておけば性能的には問題ないなあ。
(で、ふと気付いた事が...)
割り込み処理の中で文字を送出してたような...。→ 割り込み処理中に 次の割り込みが来る可能性が出てくる。→ 昔、割り込み処理内(割り込み禁止状態)で I/O動作や時間のかかる計算などをするなと怒られた記憶が...。部下を怒った事も...。
(割り込み処理/システムとしてのレスポンスを良くする為に、ソフトを(小)変更しましょう^^;)
・ 割り込み処理内では、\'文字Aを送れ\'という指示(フラグ)をセットするのみ
・ mainルーチンは、指示チェックの無限ループ
・ mainルーチン内でのフラグチェックとクリアは割り込み禁止状態で行う(googleで調べてみてください)。
a. 割り込み禁止にする
b. フラグチェック
c-1. フラグが立っていれば
c-2. フラグをクリア
c-3. 割り込み禁止を解除する
c-4. I/O処理実行(文字送出)
d-1. フラグが立っていなければ
d-2. 割り込み禁止を解除する
まあ、今回の処理では
・ MPGを毎秒2回転以上の速度で回す事は無い(出来ない) → 割り込みは 1.25mSec以上の間隔で発生
・ 通信速度を19200bpsにする → 指示送出は 0.5mSecで済んでしまう
・ 割り込み処理/mainでの処理は 1Kステップ以下(クロック32MHzなら40μSec以下)
という事を勘案すると mainルーチン内での割り込み禁止への配慮は無くとも良いとは....。
( でも、割り込み処理ルーチン内(=割り込み禁止状態)での処理は 必要最小限のステップにとどめるのがマナー^^; )
(蛇足です)
先日、秋葉原散歩でロータリーエンコーダを衝動買いしてしまいました( http://www.aitendo.com/product/12353 お店では特売セールでもっと安い...)。そのうち何かに使いたいなと思ってます。
メカニカル方式なので、チャタリング防止は必須ですが、割り込み処理ルーチン内で文字送信を実行し、A相/B相の全ての割り込み情報をクリアしてしまえば完全なチャタリ
| oldman | EMAIL | URL | 15/12/08 17:53 | r0ohnno6 |
コメントする
この記事のトラックバックURL
http://mabo52.sakura.ne.jp/tb.php/988
トラックバック
TOP PAGE △