Monthly Archives: 6月 2012

[C#,Win32API]ユーザがしばらくPCを使用していなければ自動ログオフさせる

2012年6月30日 (カテゴリ: C#:)

WindowsではユーザがしばらくPCを使用していな時に、スクリーンセーバーを起動させたり、自動デフラグを行わせたりしています。 このように、PCがアイドルの時に限って何らかの処理を行わせるようにしておくと、ユーザに負担を掛けることなく(処理が重くなることなく)タスクを実行できるので便利です。 このような処理を行うためには、ユーザが”何もしていない”時間を計測する必要なのですが、GetLastInputInfo()というWin32API関数を使用すると、この情報を取得可能です。 関数仕様は以下の形で、データの取得に成功すると戻り値に0以外の値が返ってきてくれます。 BO…


続きを読む

PICで一定時間のスリープ(ウェイト)を行う

2012年6月30日 (カテゴリ: PIC:)

アセンブラではスリープ処理も,ひと苦労 プログラムの中で一定時間処理を止めたい場合、C言語だとsleep()関数を使用することで秒単位のスリープ処理を行えます。 一方、PICでアセンブラを使って処理を行う場合はどうかというと、残念ながら一定時間処理を待つという命令は有りません。アセンブリのニーモニック一覧を見るとSLEEPというのがあるので、一見するとこれでいけそうな気もしますが、残念ながらPICのSLEEPはMPU自体をスリープモードにする(Windowsでいうサスペンド状態)命令なのでこれは使えません。 このような場合、PICではループを空回しする事でビジーウェイトを作り、所定の時間だけ経…


続きを読む

[MPLAB] MPASMアセンブラで良く出るエラーメッセージとその対処一覧

2012年6月28日 (カテゴリ: PIC:, )

PICの開発をMPLABを使用してアセンブラ(MPASM)で開発しているときに、良く表示されがちなエラーメッセージとその対処法の一覧です。 開発を始めたばかりは、特にエラーの意味が分かり辛く、デバッグに手間取る事もあるので参考にしてみてください。 ※以降のメッセージと対処法はP16F84Aの場合を元に説明しています。  他のPICを使用している場合は、一部対処法が異なる場合もあるかもしれません。  その場合は各自読み替えてください。 よくあるエラーメッセージ一覧 Register in operand not in bank 0. Ensure that bank bits are corre…


続きを読む

[PIC]MPLABでデバッグ時に,入力用ポートの値を操作する(Stimulusウィンドウ)

2012年6月27日 (カテゴリ: PIC:)

MPLABでは実際のマイコンチップを用意しなくても、IDE上に用意されたシミュレータを使用してプログラムをデバッグする事ができます。 また、PICマイコンでは入出力ピンを使用して外部とのデータをやり取りを行います。 この際に出力ピンについては、PORTAやPORTBなどのレジスタ値を見れば0/1のどちらが出力されているか、確認する事ができます。一方、入力については、実機上はボタンなどを用意すれば入力のON/OFFを変更できますが、シミュレータ上ではボタンが無いのでピンの状態を変更する事が出来ません。 このようなときはStimulus機能を使用することで、ピン状態を変更する事が可能です。 Sti…


続きを読む

[PIC]PIC16F84Aのコンフィグレーションビットを指定する

2012年6月27日 (カテゴリ: PIC:)

PICでは、マイコンの内部動作を規定するために、コンフィグレーション用のデータが存在します。 PIC16F84Aマイコンの場合、このデータはプログラムメモリの0x2007番地に存在します。0x2007番地は、ユーザプログラムメモリの範囲外なので、通常のアセンブラ命令では値のセットを行うことができません。 それでは、この値をどうやって指定するのかという疑問が出てくるのですが、MPLABのアセンブラでは__CONFIG命令でこの値を設定することができます。 ここでは PIC16F84Aのコンフィグレーションビットの内容について確認してみます。 まず、アセンブラプログラム上での指定方法ですが、以下の…


続きを読む

[PIC]MPLABで作成されたhexファイルのフォーマットを解析する

2012年6月27日 (カテゴリ: PIC:, )

MPLABで開発を行い、コンパイル(orアセンブル)を行うと*.hexファイルが作成されます。 PICのマイコンへは、hexファイルを元に書き込みが行われます。 このhexですが、エディタで開いてみると普通のテキストファイルである事が分かります。 前回の動作確認で作ったasmファイルを確認してみると、以下の様な内容になりました。 作成したPICのアセンブラコード ; LEDを点滅させる ; (点滅が速過ぎるので、実機で実行すると目視では確認できませんが…) LIST P=16F84 INCLUDE P16F84A.INC ORG 0   ; ポートBのRB0ピンを出力にする BS…


続きを読む

[MPLAB]作ったプログラムのデバッグ実行が出来ない場合の対処法(Debugger->Run)

2012年6月26日 (カテゴリ: PIC:)

MPLABでは、IDEなので当然ですが、作成したプログラムをPC上でデバッグ実行する事が出来ます。 メニューバーのDebuggerを選択すると、以下のようにF9を押す事で、デバッグ実行が可能です。 なのですが、MPLABをインストールした直後では、なぜかPC上での実行が出来ない状態になっています。 Debuggerメニューを見ても項目が2つしかありません… というわけで、MPLABでデバッグ実行を行うための設定方法ですが、以下の作業をすればOKです。 Debugger->Select ToolにあるMPLAB SIMを選択し、チェックを入れます。 以下のようになっていればOKです。…


続きを読む

[PIC]MPLABでLED点滅プログラムを作成する

2012年6月26日 (カテゴリ: PIC:)

前回、PIC開発用のIDEであるMPLABのインストールが出来たので、今回はソフト作成の流れを確認しつつ、LEDを点滅させるプログラムをアセンブラで作成します。 プログラムは、実際にPICに書き込まなくてもPC上でデバッグ実行できるので、今回の作業内容ではPICのICはまだ必要ありません。 また、途中でも説明していますが、今回作成のプログラムではLED点滅のプログラムを作っていますが、実は一点問題があります。それは、動作が非常に速いので実際にPIC上で動作させると速すぎ、点滅している事が目視では確認できないことです。 PC上でのデバッグ確認では支障が無いので、ここではPC上での操作方法と動作確…


続きを読む

自作ソーラー発電用のバッテリーを大容量に変更

2012年6月25日 (カテゴリ: ソーラー発電:)

前回作成した自作ソーラー発電システムですが、バッテリーが弱っていて十分に蓄電できていなかったので、今回新しいものに買い換えました。 今回購入したバッテリーは、以下の商品です。 バッテリー自体かなり重く、amazonが最安(12,500円)だったのネットで購入しました。 (画像をクリックすると、最新の価格が確認できます) 130F51(PRN) GSユアサバッテリー 他にもう少し安いもの(-500円ぐらい)も有ったのですが、マイナーブランドだったり、送料別の価格になっていて送料を含めると高くついてしまうものだったので、購入する際は注意が必要です。 で、届いた商品はこちらです。 想像したより結構大…


続きを読む

[gcc]long long intの値をprintfで表示させる

2012年6月25日 (カテゴリ: C:)

long long intで64bit整数値を格納した際に、その値をprintfで表示させる方法です。 普通に%dや%xで表示させようとしても、下位32bit分しか見てくれないので正しい値を表示させる事が出来ません プログラム #include <stdio.h>   int main() { long long int a = (long long int)1 << 63;   // NG: intとして表示 printf( "case1: %d\n", a ); &nb…


続きを読む

PIC用IDEのMPLABをインストールする

2012年6月25日 (カテゴリ: PIC:)

PIC向けの統合開発環境であるMPLABのインストールを行います。 MPLABをインストールする事で、Cのコンパイラとアセンブラを,統合開発環境にて使用出来ます。 キホンからはじめるPICマイコンC言語をフリーのコンパイラで使う まず、下記のサイトにアクセスします。 MPLAB Integrated Development Environment ページの下のほうにスクロールするとダウンロードリンクがあるので、MPLAB IDEをクリックしダウンロードします。 ダウンロードしたzipファイルです。 zipファイルを展開すると、以下のようなファイルが出てくるので、setup.exeを実行しま…


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ その4

2012年6月24日 (カテゴリ: 読書メモ:)

4.8 制御ハザード 制御ハザードというのは、分岐命令に起因するハザードの事を意味する。 これがなぜ発生するかというと、分岐条件が成立するかの判定はEXステージで比較演算を行い、その後のMEMステージまで決まらないから。一方で、分岐命令がMEMステージに来るころには、直後3命令分に対してそれぞれIM,ID,EX処理が行われている必要があるので、その分のクロックサイクルが無駄になるリスクがある。 これに関しては、その性質上完全に防ぐ事は出来ないので、どうすれば”よりましか”という考え方になる。 単純な分岐の予測 分岐結果が決まるまで後続の命令実行を止めるというのは、その待…


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ その3

2012年6月22日 (カテゴリ: 読書メモ:)

4.6 データパスのパイプライン化と制御 前の節でも書いたように、MIPSでパイプライン化を検討する際は、以下のステージ分けを行う IF: 命令のフェッチステージ ID: 命令のデコードステージ EX: 実行ステージ MEM:メモリアクセスステージ WB: 書き戻しステージ(write back to register) パイプライン化されたCPU環境で、命令を実行する際、注意が必要なのは2点。 1.WBステージによって、レジスタの値が書き換わってしまう(EXステージの元ネタが変わってしまう) 2.次のPCの値が、EXステージが完了しないと分からない場合(分岐命令)がある 前者はデータハザード…


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ その2

2012年6月21日 (カテゴリ: 読書メモ:)

4.4 単純な実現方式 ここでは、まずシンプルな命令だけを実行できるCPUを作る 4.1でも書いたけど、サポートする命令を再掲しておく。 メモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, j 演算を行うためにはALUが必要だけど、今回使用するALUは、以下の演算を行う事が出来るものとする。 Cプログラマからするとアセンブリ命令は非常に限られている(=表現力が乏しい)けど、アセンブリからみるとALU回路が行える計算処理は非常に限られている。 ALU制御コード 機能 演算内容 …


続きを読む

[パタヘネ:読書メモ]第4章 プロセッサ

2012年6月18日 (カテゴリ: 読書メモ:)

4.1 はじめに この章では、CPUの設計について考える。 だけど、いきなり本格的なCPU設計を考えると難しいので、まずはシンプルなものを設計する。 最初のバージョンで実行可能な命令は以下の9つだけをサポートする。 メモリ参照命令 : lw(load word), sw(store word) 算術論理演算命令: add, sub, and or, slt ジャンプ命令 : beq, j CPUの実装をしたいのだけど、CPUが最初にすることを考えると、以下の3つになる。 1.プログラムカウンタの値を取得し、メモリから命令をフェッチする 2.命令で指定されたレジスタの値を読み込む 3.ALUを使…


続きを読む

[パタヘネ][C]シフトと加算だけで、掛け算を行う

2012年6月17日 (カテゴリ: C, 読書メモ:)

パタヘネの”第3章:コンピュータにおける算術演算”にある、3.3乗算の補足説明です。 “乗算は、ハードウェア的には、前述した加算処理とシフト処理で実装できる”を確認するために、Cでコードを作成しました。 当然ながら、乗算命令が下記のような形でソフトウェア的に実装されているというわけではないです。 下記のような振る舞いを行う”電子回路が組まれる”という意味だけど、 回路的として説明すると分かり辛いので、説明としてコードとして記述しただけです。 #include <stdio.h>   main(…


続きを読む

[パタヘネ:読書メモ]第3章 コンピュータにおける算術演算

2012年6月14日 (カテゴリ: 読書メモ:)

3.1 はじめに この章で取り扱う話題の確認 実数や小数のあわら仕方(内部表現) 32bitに収まらない、大きな数の管理方法 四則演算などの計算は、ハードウェア的にどうやって実装されているのか 3.2 加算と減算 2進の加算処理の基本 -> 情報処理試験レベルなので省略 演算処理では、オーバーフローの考慮が必要。 ソフトウェアの都合で、オーバーフローの検出を行いたい場合があるので、どうやって検出すればよいかを考えてみる。 加算において2つの値の符号が異なる場合は、絶対オーバーフローしない(減算では、符号が同じ時はオーバーフローしない)。 符号が同じ場合はオーバーフローのリスクがあるが、1bit…


続きを読む

cygwinでgcc開発メモ

2012年6月14日 (カテゴリ: C:)

cygwin環境の確認(win7, x64) $ uname CYGWIN_NT-6.1-WOW64 とりあえずhello world $ cat test01.c #include <stdio.h> main() { printf( "hello world\n" ); } コンパイルしてexeの出力と実行 (cygwinでは、出力ファイル名を省略するとa.outではなくa.exeになる) $ gcc test01.c -o test01.exe $ ./test01.exe hello world アセンブラのコードに変換する $ gcc -S test0…


続きを読む

[パタヘネ:読書メモ]2章 命令:コンピュータの言葉 その4

2012年6月13日 (カテゴリ: 読書メモ:)

2.10 32ビットの即値およびアドレスに対するMIPSのアドレシング方式 MIPSの命令長は32bitなので、32bit値をレジスタにセットしたり、32bitアドレス空間の任意の場所にジャンプさせるには工夫が必要。理由は、32bitの中にopcodeやオペランドを指定する場所が必要なので、値の指定には16bitとかしか使えないから。 というわけで、レジスタへの値セットと、ジャンプ命令で指定するアドレスの指定方法を考える。 レジスタに,32bitの値をセットする まず、値のセット方法について。 これは、lui命令(load upper immediate) + ori命令(or immedia…


続きを読む

[パタヘネ:読書メモ]2章 命令:コンピュータの言葉 その3

2012年6月11日 (カテゴリ: 読書メモ:)

2.8 コンピュータ・ハードウエア内での手続きのサポート 関数の呼び出し まずは用語の確認 caller 関数の呼び元(親側) callee 関数の呼び出され側(子供側) プログラムカウンタ 現在実行中の命令がある場所(address) 関数呼び出しの手続きは以下の流れで行われる。 パラメータのセット ($a0-$a3レジスタを使用) 手続きに処理を移す 手続きに必要なメモリを確保 手続きの実行 結果のセット ($v0-$v1レジスタを使用) 制御を元に戻す ($raにreturn addressが保存されてる) 関数呼び出しは、アセンブラ的にはjal(jamp and link)命令を使用す…


続きを読む