今更ながらPIC16F84Aを使ってサーボを動かすプログラムの勉強を始めました。
サーボを動かすためにマイクロ秒単位のタイマーを作らなければならないのでそのためにサンプル的に以下の様なプログラムを作ってみました。
アセンブリ言語とPA.EXEという古い環境ですが・・・
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
include 16f84.h
.osc hs
.wdt off
.protect off
org 0ch
tm1 ds 1
tm2 ds 1
org 0
goto start
org 4
goto start
start
clr ra
clr rb
mov !ra,#00000b
mov !rb,#00000000b
ntl
mov rb,#00000001b ;
call wait10
mov rb,#00000000b
call wait10
goto ntl
wait10
movlw 50 ;①
movwf tm1
wait10_1
movlw 128 ;②
movwf tm2
wait10_2
nop
decfsz tm2,1
goto wait10_2
decfsz tm1,1
goto wait10_1
ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
プログラムをコピペしたら変になったので一応画像も添付しております。
使用するクロックは10Mのセラロックです。
①、②の値を変えればラベルwait10_2内のnop命令の繰り返し回数が変化し、ラベルntlでのポートRB0からの出力時間を変化させられると思います。
この時間を10マイクロ秒にするには①、②の値(もしくは①×②の値?)をどのようにすれば良いのでしょうか?
また、現在は仮に①=50 ②=128としていますが、この値のままでラベルwait10の行からwait10_2までを実行し終わった時にかかる時間の計算はどのようにすれば良いのでしょうか?
10マイクロ秒のタイマーの作り方が分かれば後はそれを応用して簡単なサーボコントローラーに応用していきたいと思います。
よろしくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ひとつ注意点として、
恐らく10マイクロ秒固定の時間待ち関数が目的ではなく、10マイクロ秒単位で任意の時間を待つ関数を作るつもりだと思いますが、
これを10マイクロ秒待ちをループで繰り返すように作ると、ループ処理の部分に掛かる時間の分だけずれます。
例えばループ処理に1.2マイクロ秒掛かるなら8.8マイクロ秒待ちの処理を作る必要がありますのでご注意ください。
処理にかかる時間の計算ですが、
PICは本来、非常に処理時間を計算しやすいマイコンです。
すべての命令が4クロックの倍数で動くので、4クロックを「1サイクル」と称します。
ほとんどの命令は、実行に1サイクル(4クロック)掛かります。
GOTO・RETURN・「addwf PCL」などの分岐命令は2サイクルです。
スキップ系命令(BTFSS・INCFSZなど)は考え方が2通りあり、
「条件が満たされた場合は次の命令をスキップして2サイクル、条件が満たされない場合は次の命令をスキップせず1サイクル」と見るか、
「常に1サイクルで実行し、条件が満たされた場合は次の命令の代わりにNOPを実行する」と見るかで、表現に差があるので資料を見る時はご注意ください。
しかし問題はPA.EXEの独自表記で、アセンブラ命令でない「mov !rb,#00000000b」などものはどれだけ時間が掛かるか分かりません。
PA.EXEの説明書を見るか、ビルドした結果を見るなどしてください。
また、PA.EXEをやめてMPLABを使えばシミュレータで実行サイクル数を確かめられます。PA.EXEの独自書式は使えなくなりますが、純粋なアセンブラ部分は変わりませんのでさほど移行に障害はないでしょう。
No.2
- 回答日時:
> この時間を10マイクロ秒にするには①、②の値(もしくは①×②の値?)をどのようにすれば良いのでしょうか?
このプログラムでは遅延部分が二重ループになっているのであまり短い周期のタイマーは作れません。
2つのパラメーター(現在128と50)を共に1にした場合、ポート出力が1(High)になる時間がたぶん16クロック、0(Low)の時間がたぶん18クロックになるはず。クロック発振が10MHzならば命令1個の実行時間は0.4μ秒ですから1周期は約13.6μ秒になるはずです。これが最短周期です。このままではこれより短い周期にはできません。
もっと短い周期にするにはループを一重にすればよいのです。例えば
wait10 movlw ▼
movwf tm2
wait10_2 decfsz tm2,1
goto wait10_2
ret
これで最短処理時間は6サイクルのはず。親ルーチンのCALL等を含めると9サイクル前後のはずですからクロック発振が10MHzならば最短周期が7~8μ秒のパルスが出せるはずです。
▼の値は必要なパルス幅に応じて変えてください。値を1増すと出力パルスの周期は2.4μ秒長くなります。
> 現在は仮に①=50 ②=128としていますが、この値のままでラベルwait10の行からwait10_2までを実行し終わった時にかかる時間の計算はどのようにすれば良いのでしょうか?
主ループはNOPからの3命令。命令の実行時間はNOPとDECFSZは1サイクル、GOTOは2サイクルなので合計4サイクル。
これを 128×50 回繰り返すので25600サイクル要します。
クロック発振が10MHzならば1サイクルが0.4μ秒ですからこのサブルーチンでの遅延時間は10.24m秒になります。
この計算式は 0.4μ秒 × 4サイクル × 128 × 50 = 10.24m秒
したがって出力周波数は 1 ÷ ( 10.24m秒 × 2 ) = 48.8Hz
以上は概算です。この計算にはMOVLWやRETを含んでいないので実際にはもう少し低い周波数になります。
PIC16F84Aが持つタイマーはオーバーフロー型のタイマーです。割込が掛けられるだけでハードウェアでは出力されていないので短周期のパルスは作れません。
PICの一部の品種ではタイマーに初期設定するだけでソフトの負担なしで高速パルスを出すことができます。例えばPIC16F178xシリーズなど。200KHzぐらいまでは出したことがありますが最高で8MHzまで出るはず。タイマーへの設定値を N(8bit) として、 発振周波数 ÷ N の周波数が取り出せます。Duty比も変えられPWM機能もあります。
No.1
- 回答日時:
PICで正確な単位のタイマーを作るにはタイマー0を使った割り込み以外無いと思いますがクロックがセラロックというのは矛盾があると思います。
この精度は±0.5%です。最大1%の狂いがあるので例えば1秒パルスを作ったら1%=10msずれが発生するとなり、100カウントすると1秒ずれることになります。なのでセラロックではマイクロ秒単位のタイマーは作れません。PA.EXEの資料が見つからないのでタイマー0を使った割り込みが使えるかどうか不明です。この質問のデバッグ方法は30年以上前のZ80全盛時代の自作ホビーストがやっていた方法で古過ぎます。PICはICSPが出来るのでPICKIT3を買ってきてやった方が早いです。デバッグもMPLABという無償のプログラマで出来るのでプログラムを見ながらステップ動作やレジストリ内のモニタは自由に出来ます。
PA.EXEを調べていたとき偶然に貴方の過去の質問を見ました。日付は2007年でした。そんなに苦労しているならC言語を勧めます。こちらのほうが記述が簡単でわかりやすいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- C言語・C++・C# Cのオブジェクトファイルの逆アセンブル 5 2023/05/13 01:51
- 仕事術・業務効率化 効率的な勉強方法(分野問わず)を教えてください 1 2023/08/16 01:33
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# win10で、正確な待ち時間の作り方 6 2023/02/14 18:28
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(ソフトウェア) F-BASICで計算中の実行が中途で勝手に止まり、大変困っています。 2 2023/03/02 16:15
- 英語 決意表明の"be going to"と意志の"will"の違いについて 6 2023/04/11 23:04
- 英語 be sorry for doingとbe sorry to have doneの意味の違いについて 2 2023/06/09 13:57
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パイプライン処理の処理能力に...
-
組み込みCプログラムで実数型
-
プログラム言語FortranとCの違...
-
VBAでのコントロール操作
-
MIPS と クロック周波数の換算方法
-
【有効数字について】 授業で、...
-
電子透かしを使用した場合の著...
-
文字の容量(サイズ)についての...
-
文字数5000字、文字コードが2バ...
-
K KB MB について詳し...
-
1TBHDDに音楽ファイルは何ア...
-
アルファベット30文字は何バイ...
-
エクセルVBAで xlOn xlOff の切替
-
マトリックスサイズが512×512で...
-
メモリーの単位を解説してくだ...
-
(*^_^*) キロバイトと字数の...
-
1KBは、2の8乗X1000ではない...
-
もしコンピューターが2進数か...
-
符号付の整数8ビット…
-
有効数字は最後答えを出すとき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラム言語FortranとCの違...
-
組み込みCプログラムで実数型
-
VBAでのコントロール操作
-
arduino
-
アセンブリ言語で。
-
命令網羅率の計算問題です
-
COM1(RS232C)とUSB仮想COMポー...
-
64ビット化による処理速度低下...
-
なぜ、i++なのか?(ものすごく...
-
ステート数とは
-
MIPSとか
-
任天堂64の64 CPUの仕...
-
PICマイコンのプログラムについ...
-
MIPS と クロック周波数の換算方法
-
32ビット用のソフトを64ビ...
-
+=と÷=の処理速度の謎を教え...
-
応用情報技術者試験問題の解き...
-
Intel の CPU
-
VBSとVBA
-
マイコンのビット数とクロック数
おすすめ情報