投稿者
 メール
  題名
  内容 入力補助動画検索画像・ファイル<IMG><OBJECT>タグが利用可能です。(詳細)
    
  ファイル1
  ファイル2
  ファイル3
アップロード可能な形式(各1MB以内):
画像(gif,png,jpg,bmp) 音楽(mmf,mld) 動画(amc,3gp,3g2)

 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ teacup.>アマチュア無線 ] [ 検索 ]

[PR]     銀座 インプラント
teacup. ] [ 無料掲示板 ] [ プレミアム掲示板 ] [ teacup.コミュニティ ] [ ブログ ] [ チャット ]

全251件の内、新着の記事から10件ずつ表示します。 6  7  8  9  10  11  12  13  14  15  |  《前のページ |  次のページ》 

Re: PIC タイマー割り込みについて

 投稿者:timer  投稿日:2009年 6月11日(木)09時24分13秒
返信・引用
  > No.162[元記事へ]

nekosanさんへのお返事です。

nekosanさん、ありがとうございます。
解決しました!!

CCPをしようして、コンペアマッチでタイマーのクリアをかけたところ、
きっちり100usのタイマーがつくれました!!

やっぱり、誤差だったんですね〜。
PICのまだまだ使いこなしていないので、タイマーはいつもTMR0を使うのが標準だと思ってました。

これからはコンペアマッチタイマーを使います!!
本当にありがとうございます。。。


> もしご興味があればAVRも一度
> お試しを!と布教活動してみる…(^_^)

AVRマイコンというものの存在をココにきて始めて知りました!
PICよりも良いものだとか・・・。やっとPICになれ始めたとこだったのに。。。
ちょっといじってみようかな〜。
でもCコンパイラとかってあるんですか?
 

Re: PIC タイマー割り込みについて

 投稿者:nekosan  投稿日:2009年 6月10日(水)19時27分18秒
返信・引用
  > No.161[元記事へ]

timerさんへのお返事です。

> 私もそんな気がしてきました。。。
> でも、そうだとすると、PICでは早く正確なタイマーは作れないって事になるのでしょうか?
>
> PIC18F2320を使用し、内蔵のタイマー0を使用しています。
> タイマー値は割り込みに入ってからカウンタを再セットしています。
> なので、nekosanさんの言うように誤差範囲になるんですかね。。。
>
> 割り込みの時間を長くする(タイマーを長い時間にする)と、誤差がどんどん小さくなっていきますので・・・

16f84のような小規模で設計の古いPICだとタイマーは
TMR0しか搭載されていませんが、今回の18f2320なら
タイマーは4つ、CCPは2つ登載されています。

例えば、CCP1をコンペアモードの「コンペア一致時に
trigger special eventモード」にしておいて、
コンペア一致時にTMR1のカウンタ値クリア、及び
割り込み発生のモードに設定しておけば、
普通に1クロックの誤差も無い精度で正確なタイマー
割り込み制御ができるかと思います。

TMR0って元々CCPと組み合わせたタイマー割り込み機能
としては使えないタイマーですからねぇ…


あと、話はちょっとかわりますが、PICとAVRを
タイマーの観点で比べてみると、PICは元々
タイマー単体のTMR0があって、そこにCCPというものを
拡張していくことによって任意間隔のタイマー割り込み
やPWMを使うように「機能追加」されてきた様子が見て
取れますが、その点AVRはタイマー自体にそれらの
機能が元々盛り込まれていて、制御レジスタの扱いも
極めてシンプルだったりします。

CPUアーキティクチャだけでなく、ペリフェラルも
使いやすいのが、後発組のAVRの利点ということ
かもしれません。

というわけで、もしご興味があればAVRも一度
お試しを!と布教活動してみる…(^_^)
 

Re: PIC タイマー割り込みについて

 投稿者:timer  投稿日:2009年 6月10日(水)10時04分42秒
返信・引用
  > No.160[元記事へ]

nekosanさんへのお返事です。


> もしかしたら、誤差の比率の問題かもしれないなぁと
> 言う気がしてきました。

> このラグが上記で触れた「一定の誤差」なのでは
> というのが一つの仮説です。
> 誤差の時間の長さや、割り込み間隔を狭めると誤差が
> 大きくなるという事象をひとまず説明できている
> と思われるのですが…

私もそんな気がしてきました。。。
でも、そうだとすると、PICでは早く正確なタイマーは作れないって事になるのでしょうか?

> ということで、
> CCPに使用しているタイマーは何か。そして
> タイマー値をクリアはどのように行っているか
> をご確認いただけないでしょうか?

PIC18F2320を使用し、内蔵のタイマー0を使用しています。
タイマー値は割り込みに入ってからカウンタを再セットしています。
なので、nekosanさんの言うように誤差範囲になるんですかね。。。

割り込みの時間を長くする(タイマーを長い時間にする)と、誤差がどんどん小さくなっていきますので・・・
 

Re: PIC タイマー割り込みについて

 投稿者:nekosan  投稿日:2009年 6月10日(水)00時05分39秒
返信・引用
  > No.158[元記事へ]

timerさんへのお返事です。

> 20MHzということは1命令500nsですので、
> メインループに
>   output_toggle(CCS C使用)
> とだけ記述し、信号をオシロで見てみました。
> タイマーを10msで使っていたときは問題なく、それを今回も移殖し、問題なく動作しました。
> もっと短い時間でタイマーを作りたいと思い、作成したところ今回のようになってしまいました。
> 自分でも原因がつかめず、ちょっと困っています。。。

もしかしたら、誤差の比率の問題かもしれないなぁと
言う気がしてきました。

1回の割り込みで発生する誤差が仮に10us程度
だとすると、100us毎に割り込みを掛ければ10%
の誤差が生じますが、10msなら0.1%程度なので。
つまり10msの時にも「一定の誤差」が生じていたけど、
比率が小さかったので問題になってなかった…と。

で、その発生する仕組みはどんな感じかなと考えて
みました。


PIC内蔵のCCPをコンペアモードで使用し、
コンペアレジスタとタイマー値が一致で割り込み発生
かつコンペア値自動クリアに設定しておけば、
クリスタルが持っている精度できちんと一定間隔に
割り込みが掛かることになるわけですが、タイマーの
種類によっては自動クリア機能が使えないので、
割り込み処理内でソフトウェア的にタイマー値を
クリアする必要があるかと思います。

その場合、割り込み要因の発生〜タイマー値クリア
の間に若干のタイムラグが生じます。

このラグが上記で触れた「一定の誤差」なのでは
というのが一つの仮説です。
誤差の時間の長さや、割り込み間隔を狭めると誤差が
大きくなるという事象をひとまず説明できている
と思われるのですが…


ということで、
CCPに使用しているタイマーは何か。そして
タイマー値をクリアはどのように行っているか
をご確認いただけないでしょうか?



> プログラムをダウンロードしようとすると下記のような警告が出ますが、これは特に関係ないですかね??
>
> ICDWarn0072:  MPLAB ICD2 may not be able to enter debug mode with this device if the power up timer is enabled.  Would you like to disable the power up timer?

これは多分関係ないかと思います。
パワーオン後にクロックが安定するまでリセットを
掛けておくためのものなので、一旦CPUコアが
動き出してからの影響は無いはずかと。


目下のところ、それ以外はあまり思いつかないのですが…
 

Re: 内蔵発振モードで通信

 投稿者:naga64  投稿日:2009年 6月 9日(火)14時00分40秒
返信・引用
  > No.150[元記事へ]

nekosanさんへのお返事です。

こんにちは。返事が遅くなりすいません。
とても詳しく書いていただいてありがとうございました。
また、わからないことがあったら質問しますのでよろしくお願いします。

> naga64さんへのお返事です。
>
> > はじめまして。初心者でよくわからないので教えてください。PICに外付けでセラロック等を付けないで、内臓発振モード(4MHz)でRS232Cの通信をさせたいのですが、
> > 4MHzの時には、ボーレートは幾つまで使えるのでしょうか?19200でも使用できるのでしょうか?また、ここら辺について詳しく書いてるサイトまたは書籍がありましたら教えてください。
>
> PICと言っても型番によって制御用レジスタ(制御用ビット)
> などが微妙に違っているかもしれませんので、私の好きな
> 16F648シリーズを例に私が作るときの種明かし的なものを。
>
> http://ww1.microchip.com/downloads/en/DeviceDoc/40044F.pdf
> ↑マイクロチップ社のデータシートです。
>
> 多分非同期モードでの通信を前提にされていると思うので
> 非同期モードを前提にします。
>
> このデータシートの73ページ、Table12−1の上側が
> 非同期モードの計算式で、高速モードと通常モード毎に計算式
> が載っているので、Foscに4Mhzを代入すれば計算が
> できます。
>
> が、計算はちょっと手間ですし、PICでもAVRでも通常は
> データシートに良く使われるビットレートとCPUクロックの
> 組み合わせが表形式で載ってたりします。
>
> 16F648のデータシートなら、75ページ(通常モード)と
> 76ページ(高速モード)にそれぞれの数値が載っているので
> 今回のように表の数値がそのまま使える場合はそれが一番簡単
> でしょう。
>
> 今回は4Mhzで19200bit/sですから、高速モード
> (BRGH = 1)を使ってSPBRGに12を設定すればよいと判ります。
>
> 表に載っていないレートやCPUクロックの場合は計算式を
> 使って個別に算出する必要があります。
>
>
> ここまでは一般論で、それ以外にも幾つか考えないといけない
> 事があります。
> 特に速度誤差とその許容範囲に関することが重要です。
>
> 非同期モードのRS232C送受信では、1バイト分(スタート
> ビットとストップビット含む…通常は10ビットで一組)毎に
> 1回1回ずつ区切ってデータ送信を行うので、その一組のデータ
> を送受信する間に1ビット分以上のズレが生じてはいけません。
> データ化けが起ります。
> 一組分のデータを送った後に(次のスタートビットで)タイミング
> がリセットされるので、複数バイトに跨って誤差は累積しません。
>
> つまり、10ビット送信する間に1ビット分の時間のズレが
> 生じるとエラーとなるわけですから、最大では
>    1ビット÷10ビット×100%=「10%」
> のズレが生じるとエラーになるのですが、送信側、受信側
> 双方でズレが生じる可能性を考えると、それぞれで半分ずつ、
> つまり送信、受信片方が5%以内に収まっている必要があります。
>
> 今回の4Mhz、19200bit/sでは表によると
> 誤差0.16%なので、充分許容範囲内です。
>
>
> さらに注意点。
>
> 最近のマイコンにはノイズ耐性を向上させるために1ビットの
> 受信時に3回とか5回とかサンプリングをしてノイズによる
> エラーを自動で除去する仕組みが組み込まれているチップ
> もあります。
> この場合数回に分けてサンプリングを行っている都合、
> 先ほどのズレに対する許容範囲は若干狭くなるので注意が
> 必要です。
>
> 参考書ですが、PICだと後閑さんの本が有名ですがノイズ除去
> 機能つきのUSARTのことは触れられてなかった気がします。
> AVR関係であれば山根さんの本にこの辺りが書かれています。
>
>
> あと内蔵RC発振器ですが、内部で校正されていると言っても
> クリスタルやセラロックよりも元々精度が低いので、
> 通信エラーが目に付くようでしたら校正をきちんとやり直すか、
> クリスタルやセラロックを使った方がよろしいかも知れません。
>
>
> 参考書ということで↓
> http://nekosan0.hp.infoseek.co.jp/making_p_books.html
>
> といった感じでいかがでしょうか?
 

Re: PIC タイマー割り込みについて

 投稿者:timer  投稿日:2009年 6月 9日(火)08時55分31秒
返信・引用
  > No.156[元記事へ]

nekosanさんへのお返事です。


nekosanさん、ご回答ありがとうございます。

> クロックが20Mhzで動作していないというのが本当であれば、
> 1msや10msで動作しているということと辻褄が合わない気がする
> ので、その点で一度回路やフューズの設定をご確認ください。

そうなんですよ。
自分でも、クロックが500usで動いていないのに、10msはしっかり作れている理由がわかりません。
1msを作ろうとすると多少ずれますが、ほぼOK。
それ以下になると大幅にずれてきます。
例えば100usを作ろうとすると110usになってしまいます。


> (オシロのプローブをクリスタルの足にあてたりとか
>  してませんよね???発振回路周りは微妙なアナログ回路
>  なので、発振が止まったり異常発振したりしますので)

クリスタルにはあてていません。
20MHzということは1命令500nsですので、
メインループに
  output_toggle(CCS C使用)
とだけ記述し、信号をオシロで見てみました。

この命令が500nsの倍数で動作していれば、とりあえずはOKかなと思いましたが、
倍数値になっていませんでした。
なので、20MHzで動作していないのではないかと思いました。


> 1msや10msという比較的長い時間間隔で上手く動いている
> ということは、処理の組み込み方や割り込みの設定
> などは問題無いのでは?という気がします。

タイマーを10msで使っていたときは問題なく、それを今回も移殖し、問題なく動作しました。
もっと短い時間でタイマーを作りたいと思い、作成したところ今回のようになってしまいました。
自分でも原因がつかめず、ちょっと困っています。。。


プログラムをダウンロードしようとすると下記のような警告が出ますが、これは特に関係ないですかね??

ICDWarn0072:  MPLAB ICD2 may not be able to enter debug mode with this device if the power up timer is enabled.  Would you like to disable the power up timer?
 

Re: picのカウンタについて

 投稿者:nekosan  投稿日:2009年 6月 9日(火)03時11分20秒
返信・引用
  > No.154[元記事へ]

asさんへのお返事です。
> PLC制御しかしたことがなく、C言語と電子回路についての知識はほとんどありません。

私は逆にシーケンス制御は経験がないので、その差を
加味したお話というのが出来ないのですが…

C言語についてはこの掲示板で入門編的な解説をしていく
ことは現実的には無理なので、入門書類を一度読まれる
事をお勧めしたいと思います。

> 最終的には、3150RPMのモーターの回転を、フォトインタラプタ(OMRONのEE-SX910R)で拾って、外部のカウンター(OMRONのH7EC-N)に10回転毎に1回出力しようと思っています。
> しかし現在の知識ではいきない不可能と考え、まずは外部入力はタクトスイッチ(10Ωの抵抗を介して-と繋がっています)で、出力はLEDという構成で考えております。
> チャタリングも意味は分かりますが、具体的な方法については詳しくありません。

3150rpmのモーターをフォトインタラプタでと言うこと
であれば1回転につき1回のセンシングでも毎秒50回前後
読み込みが行われることになるかと思います。1回転で2回、
3回とセンシングすれば当然もう少し回数は増えて行きますね。

で、オムロンのカウンタのデータシートに因ると、速度について
は2つのモードがあるらしいのですが、低速モードでは
追従できないようなので、高速モードを選択する必要が
ありそうです。(1khzまで使えるほう)

データシートによると、オン/オフの入力信号は
デューティー比50:50にせよとのことなので、
5回転するまではオンを出力、次の5回転はオフを出力、
そしたらまた5回転オン、で、5回転オフ…という処理を
延々と繰り返せば良さそうな気がします。

この「回数」を数える作業は、プログラム中で変数を1個
確保しておいておけばよろしいかと思われます。

ソフトウェアの仕様がこのように纏まってくれば、それを
実現するプログラムのロジックは幾つも考えられる
のですが、モーターの安定性とか、回転開始付近の速度では
どう動作させるのかとか、停止の際にはどう動作させるのか、
異常な回転を検知したらどうするのか…などといった
込み入った条件での仕様によって色々選択していく必要が
あるかも知れません。

また、センサーのセンシングエラーなども考慮すると、
複数のセンサーから別々に入力をして、エラー検知や
エラー訂正を行うなどの配慮なども必要になるかも
しれません。このあたりは良く見えてません。


入力回路部分ですが、フォトインタラプタは確かチャタリング
に対する考慮は必要無いセンサだったと思います。ただ、
信号の変化の度合い(傾き)が緩やかになるはずなので、
若干ノイズに弱いため、一旦シュミットトリガ回路を経由させるか、
マイコンのシュミットトリガ入力ができる端子で受ける必要が
あるかと思います。

テスト用にタクトスイッチを、とのことですが、こちらは
逆にチャタリングが生じるので、タクトスイッチでは
プログラムロジックのテストに向かないと思われます。


あと、マイコンと外部カウンタの接続の仕方ですが、
カウンタ部品のデータシートに因ると「無電圧入力」と
なっているので、マイコンと外部カウンタは直結できません。

無電力入力というのは、例えばこのカウンタ部品の場合、
1番と2番の端子をオープンにするとオフ、短絡させると
オン、という具合に動作させればいいわけなので、
つまりシーソースイッチを1番と2番に繋いで使うような
イメージなのですが、マイコンで機械スイッチを動かす
と言うのはナンセンスなので、半導体でスイッチ代わり
になるもの…今回であればトランジスタ1個使って
オープンと短絡を切り替えさせればよいかと思います。

と思ってデータシートを眺めていたら、やはり
スイッチ代わりにNPNトランジスタを使った場合の
接続の仕方が書かれていたので、そのまま適用すれば
よろしいかと思います。


とりあえず思いついたことを書かせていただきましたが、
こんな感じでいかがでしょうか?
 

Re: PIC タイマー割り込みについて

 投稿者:nekosan  投稿日:2009年 6月 9日(火)02時45分32秒
返信・引用
  > No.155[元記事へ]

timerさんへのお返事です。

> 下記ですが、クロック動作を確認したところ、
> 20MHzで動作していませんでした。
> ICDWarn0072:  MPLAB ICD2 may not be able to enter debug mode with this device if the power up timer is enabled.  Would you like to disable the power up timer?
> という警告が出るのですが、何か関係しているのでしょうか?
> パワーアップタイマーは使用していないつもりですが、、、

クロックが20Mhzで動作していないというのが本当であれば、
1msや10msで動作しているということと辻褄が合わない気がする
ので、その点で一度回路やフューズの設定をご確認ください。
(オシロのプローブをクリスタルの足にあてたりとか
 してませんよね???発振回路周りは微妙なアナログ回路
 なので、発振が止まったり異常発振したりしますので)

> > 現在PIC18F2320を使用し、タイマー割り込みを行っています。
> > 20MHzのセラロックを使用してタイマーを製作していますが、
> > 100usのタイマーがうまく作れません。
> > 計算はあってると思うのですが、(1ms、10msは作れました)100usを作ると、
> > どうしてもずれてしまいます。
> > 何か考えられる原因はありますか?

1msや10msという比較的長い時間間隔で上手く動いている
ということは、処理の組み込み方や割り込みの設定
などは問題無いのでは?という気がします。

一方、100usといえば、20Mhzでも2000クロック毎に割り込み
が発生する計算です。PICのコアは一番短い命令でも
4クロック消費するはずですから、どんなに長くても
500命令しか処理できない幅ですし、それ以前に、
割り込みによるオーバーヘッド分も考慮に入れないといけません。
1回の割り込み処理の処理時間が長すぎるのでは?
というのが目下のところの予想です。(検討済みでしたら
ゴメンナサイ)

最近PICを殆ど使ってないので忘れてしまいましたが、
AVRの場合でも割り込み要因が発生してから割り込み処理の
入り口に処理が移るまでに10〜20クロック程度の
オーバーヘッドが生じたと記憶してますし、C言語など
の場合はレジスタ類の保存と復帰(pushとpop)が自動的に
組み込まれるのでその分の実行時間をさらに食います。

500命令分からそれらのオーバーヘッド分をさらに
差引いたクロック内で1回の割り込み処理を完了しないと、
割り込み要因が2回とか3回とか発生しても実際は
1回の割り込み処理しか実行されないということに
なりかねません。

このあたりから一度見直しをしてみていただけますでしょうか?
 

Re: PIC タイマー割り込みについて

 投稿者:timer  投稿日:2009年 6月 8日(月)17時48分42秒
返信・引用
  > No.153[元記事へ]

下記ですが、クロック動作を確認したところ、
20MHzで動作していませんでした。

ICDWarn0072:  MPLAB ICD2 may not be able to enter debug mode with this device if the power up timer is enabled.  Would you like to disable the power up timer?

という警告が出るのですが、何か関係しているのでしょうか?
パワーアップタイマーは使用していないつもりですが、、、



timerさんへのお返事です。

> はじめまして。
>
> 現在PIC18F2320を使用し、タイマー割り込みを行っています。
> 20MHzのセラロックを使用してタイマーを製作していますが、
> 100usのタイマーがうまく作れません。
> 計算はあってると思うのですが、(1ms、10msは作れました)100usを作ると、
> どうしてもずれてしまいます。
> 何か考えられる原因はありますか?
 

Re: picのカウンタについて

 投稿者:as  投稿日:2009年 6月 8日(月)08時43分31秒
返信・引用
  > No.152[元記事へ]

nekosanさんへのお返事です。

ご返信ありがとうございます。

PLC制御しかしたことがなく、C言語と電子回路についての知識はほとんどありません。

最終的には、3150RPMのモーターの回転を、フォトインタラプタ(OMRONのEE-SX910R)で拾って、外部のカウンター(OMRONのH7EC-N)に10回転毎に1回出力しようと思っています。

しかし現在の知識ではいきない不可能と考え、まずは外部入力はタクトスイッチ(10Ωの抵抗を介して-と繋がっています)で、出力はLEDという構成で考えております。

チャタリングも意味は分かりますが、具体的な方法については詳しくありません。
 

以上は、新着順91番目から100番目までの記事です。 6  7  8  9  10  11  12  13  14  15  |  《前のページ |  次のページ》 
/26 


[PR]