- 締切済み
PIC16F84内部動作スピードについて
マイコンを始めて触る 超超初心者 です。 PIC16F84を使用してHS Modeで10MHzで動作をさせています。 内部での動作する周期は10MHzで動作するものでしょうか? whileループでソフトカウンタを作成し8bitカウンタのLSBをオシロスコープでみ たところ1カウントアップするのに500KHzでした。 何かレジスタで設定すると10MHz外部オシレータと同スピードで動作するのでしょ うか? 下が今回使用したソースです。 どうぞ宜しくお願いします。 #include <pic.h> __CONFIG(0x3FFE); unsigned char count; void ioport(void); main() { ioport(); } void ioport(void) { TRISA=0b11111; TRISB=0b00000000; count=0b0; while(1){ PORTB=count; count++; } }
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- zwi
- ベストアンサー率56% (730/1282)
[補足] PICの参考になるサイトを掲載しておきます。 PICのアセンブラ命令です。 http://www.picfun.com/prog4frame.html MPASMの使い方 http://www.picfun.com/asmframe.html PICのアセンブラ命令の使い方 http://www.picfun.com/prog1frame.html PICプログラミングの実際 http://www.picfun.com/prog2frame.html PICのメモリアーキテクチャ http://www.picfun.com/memframe.html PICの内蔵モジュールの使い方 http://www.picfun.com/moduleframe.html PICプログラミングテクニック http://www.picfun.com/prog3frame.html 以上、電子工作の実験室より。 http://www.picfun.com/ PIC活用製作例 http://www.picfun.com/appframe.html
- zwi
- ベストアンサー率56% (730/1282)
>お手数ですが、アセンブルリストの見方を教えて頂けないでしょうか。 >また、アセンブルリストは、使用するツールによって見方は変わるものなのでしょうか。 >5命令とはMOVF/BANKSEL/MOVWF/INCF/GOTOの事でしょうか。 そうですこの5つがアセンブラ命令です。 >また6サイクルとは_count/_PORTB/_PORTB/_count/_00110/_DSの事でしょうか それらはラベルで、メモリアドレスを示しますのでサイクルと無関係です。6サイクルは、5命令が消費するサイクル時間です。 マイコンというかCPUは、マシン語(命令コード)で動作するステートマシンだと思ってください。で、アセンブラ命令はマシン語(PICだと14bitの2進数)と一対一で対応する命令コードを人が分りやすいように記号化したものです。 >あと、マイコンで以下のVHDLで作成した論理回路(10us毎にパルスを出力)のような動作をさせる場合どのようにすればよいのでしょうか。 C言語系のコンパイラ言語は、コンパイラによって変換されマシン語になります。その時C言語の一命令が何個のマシン語になるかは書かれた記述内容によります。これがVHDLで書かれた記述が何個のロジックセルになるかやってみないと分からないのと同じです。 >ソフトカウンタで作成する場合は、アセンブルリストを見て何サイクル使用されるかを確認し作成しないと出来ないのでしょうか。 基本的には、アセンブルリストを見るし無いですね。あるいはC言語を使わずに直接アセンブラ言語で書くのが一般的です。 >それとも何か別の方法(関数)などを使用すればできるものでしょうか。 PIC内蔵回路のタイマで時間をカウントする方法がありますが、周期はどうしても500Khzよりも長くなります。タイマ割り込みを使います。
- zwi
- ベストアンサー率56% (730/1282)
>上記の説明で内部で5サイクルかかるので、2.5Mhz÷5サイクル=500Khzと言う理解でよろしいのでしょうか? その通りです。 >すると、内部処理によりcountの1カウント繰り上がる処理スピードは変わるという事でしょうか? count自体もそうですが、whileループやポート出力するの操作自体でマシン語命令が何命令か必要になります。 >アセンブルリストを添付したいと思ったのですが、すみません拡張子がよくわかっていません。もしよければ教えて頂けないでしょうか。 コンパイラによりますのが、普通はアセンブラリストはオプションを指定しないと出力されません。 ちなみに、手持ちのSDCCだと-Sオプションです。 上記ソースのwhile部分のSDCCのアセンブルリスト。 _00110_DS_ ; .line 23; "goo090507.c" PORTB=count; MOVF _count,W BANKSEL _PORTB MOVWF _PORTB ; .line 24; "goo090507.c" count++; INCF _count,F GOTO _00110_DS_ これだと5命令で6サイクル(GOTOが2サイクル)ですね。 質問者さんのコンパイラは勘ですが「PICC Lite」を使われていると思いますので、-ASMLISTで試してみてください。
補足
zwi様ご回答有難うございます。 今まではfpgaの論理回路を作成していたのですが、これからPICマイコンを 触れなくてはいけなくなり急遽、PICC Liteをダウンロードをし始めたばかりです。 マイコン及びC言語を始めて触れるため、あたふたしています。 お手数ですが、アセンブルリストの見方を教えて頂けないでしょうか。 また、アセンブルリストは、使用するツールによって見方は変わるものなのでしょうか。 5命令とはMOVF/BANKSEL/MOVWF/INCF/GOTOの事でしょうか。 また6サイクルとは_count/_PORTB/_PORTB/_count/_00110/_DSの事でしょうか。 >上記ソースのwhile部分のSDCCのアセンブルリスト。 >_00110_DS_ >; .line 23; "goo090507.c" PORTB=count; >MOVF _count,W >BANKSEL _PORTB >MOVWF _PORTB >; .line 24; "goo090507.c" count++; >INCF _count,F >GOTO _00110_DS_ >これだと5命令で6サイクル(GOTOが2サイクル)ですね。 あと、マイコンで以下のVHDLで作成した論理回路(10us毎にパルスを出力)のような動作をさせる場合どのようにすればよいのでしょうか。 ソフトカウンタで作成する場合は、アセンブルリストを見て何サイクル使用されるかを確認し作成しないと出来ないのでしょうか。 それとも何か別の方法(関数)などを使用すればできるものでしょうか。 FPGAの事もご存知そうなので聞いてしまいました。 的外れな質問ばかりして、誠に申し訳ございません。 ------------------------------------------------------------------- -- エンティティ宣言 ------------------------------------------------------------------- entity COUNTER_EN_GEN is port ( RESET_N : in std_logic ; -- リセット CLOCK : in std_logic ; -- クロック10Mhz(100ns) COUNT_RESET : in std_logic ; -- 初期化 ENA : out std_logic ; -- 出力イネーブル moni_count : out std_logic_vector (9 downto 0) ); end COUNTER_EN_GEN; ------------------------------------------------------------------- -- アーキテクチャ ------------------------------------------------------------------- architecture RTL of COUNTER_EN_GEN is ------------------------------------------------------------------- -- 内部信号作成 ------------------------------------------------------------------- signal flg_gen : std_logic; signal count_gen : std_logic_vector (9 downto 0); signal en_gen : std_logic; ------------------------------------------------------------------- begin ------------------------------------------------------------------- -- ロジック ------------------------------------------------------------------- process (CLOCK, RESET_N) begin if (RESET_N = '0') then flg_gen <= '0'; elsif (CLOCK'event and CLOCK = '1') then if (COUNT_RESET = '1') then flg_gen <= '1'; else flg_gen <= flg_gen; end if; end if; end process; process (CLOCK, RESET_N) begin if (RESET_N = '0') then count_gen <= (others=>'0'); en_gen <= '0'; elsif (CLOCK'event and CLOCK = '1') then if (COUNT_RESET = '1') then count_gen <= (others=>'0'); en_gen <= '0'; elsif (count_gen = "1100100") then -- 10us = 10Mhz[100ns] × 100clk count_gen <= (others=>'0'); en_gen <= '1'; elsif (flg_gen = '1') then count_gen <= count_gen + "0000000001"; en_gen <= '0'; else count_gen <= count_gen; en_gen <= '0'; end if; end if; end process; ------------------------------------------------------------------- -- 出力信号作成 ------------------------------------------------------------------- ENA <= en_gen; moni_count <= count_gen; end RTL;
- zwi
- ベストアンサー率56% (730/1282)
PICは4クロックを1サイクルとして命令(一部命令は2サイクル)を処理します。なので、10Mhzでもマシン語一命令は2.5Mhzで動くことになります。 500Khzだとすると ・whileループで2サイクル。 ・countで1サイクル。 ・PORTB出力で2サイクル。 って所ですかね。 アセンブルリストを見てみないと断言は出来ませんが。
補足
zwi様ご回答有難うございます。 まだ、理解をしていない部分がありますので教えて頂けないでしょうか。 文中割り込みにて質問を書かせていただきます。 >PICは4クロックを1サイクルとして命令(一部命令は2サイクル)を処理します。 >なので、10Mhzでもマシン語一命令は2.5Mhzで動くことになります。 上記は、理解いたしました。 有難うございます。 >500Khzだとすると >・whileループで2サイクル。 >・countで1サイクル。 >・PORTB出力で2サイクル。 上記の説明で内部で5サイクルかかるので、2.5Mhz÷5サイクル=500Khzと 言う理解でよろしいのでしょうか? すると、内部処理によりcountの1カウント繰り上がる処理スピードは変わるという事で しょうか? >アセンブルリストを見てみないと断言は出来ませんが。 アセンブルリストを添付したいと思ったのですが、すみません拡張子がよくわかっていません。 もしよければ教えて頂けないでしょうか。 どうぞ宜しくお願いします。
お礼
zwi様、いろいろと有難うございました。 マイコン及びC言語と始めて触れるものばかりで、あたふたしていましたが zwi様に教えていただき、またPICの参考になるサイトまで教えていただき 感謝いたします。これから参考になるサイトを見て勉強をしていきたいと思います。