[PIC]C30コンパイラをインストールする(dsPIC,PIC24用)

本記事ではPICのC言語向けコンパイラである、C30コンパイラのインストールと動作確認を行います。
C30コンパイラの正式名称は”MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs”で、dsPICや,PIC24シリーズなどの16bitマイコンで使用可能なCコンパイラです。

C30コンパイラはPRO、Standard、Liteと3つのバージョンがありますが、今回は無償で利用可能なLite版を使用します。Lite版でもコンパイラとしてはフル機能が利用できますが、最適化が部分的にしか使用できないため生成される実行ファイルのサイズが若干大きくなります。


今回のインストール&動作確認の作業は、以下の4ステップとなります。

MPLABをインストールする
C30コンパイラをインストールする
動作確認用プログラムを作成する
作った確認プログラムをPICに書き込む




動作確認には、今回PIC24FJ32GA002を使用しました。
PIC24FJxxGA002のxxはROMサイズなので、以下の辺りのチップは全く同じように作業できます。

PIC24FJ16GA002
PIC24FJ32GA002
PIC24FJ48GA002
PIC24FJ64GA002


PIC24の他の型番やdsPICでも、コンフィグの設定とライタ-PIC間の配線以外は同様に作業できるはずです。


PICへのプログラム書き込みはPICkit3を使用します。
ライタからPICへの回路は、簡単な配線なのでブレッドボードを使用することとします。


MPLABをインストールする

Cコンパイラの導入の前に、IDEであるMPLABをインストールします。
MPLAB無しでもコマンドラインからC30コンパイラを使用することも可能ですが、最初はMPLABからプロジェクトを作って方が動作確認が簡単なので、上手く動作しない場合に問題の切り分けが楽です。

MPLABのインストールについては、前に書いたのでこちらの記事を参考にしてください。
PIC用IDEのMPLABをインストールする


C30コンパイラをインストールする


MPLABがインストールできたら、次にC30コンパイラをインストールします。

まずは、下記のページへアクセスします。
MPLAB C Compiler for PIC24 MCUs and dsPIC DSCs



ページ下にある「MPLAB C Compiler for PIC24 and dsPIC」のリンクより、コンパイラをダウンロードします


ダウンロードしたら、installerのexeを実行します。


SetupのWelcomeページです。Nextをクリックします。


ライセンスを確認後、I accept…にチェックを入れてNextをクリックします。


インストールディレクトリの指定です。
1台のPCに複数バージョンのC30コンパイラをインストールする場合は、下側にチェックを入れます。
今回は、複数バージョンのコンパイラを同時に使用しないので、上の”Legacy Directory Name”にチェックを入れます。



バージョンの選択です。今回は無償利用が可能なLite版を使うので一番下のLite Compilerを選択します。


最終確認です。


インストールは時間が掛かるので暫く待ちます。


インストールが完了しました。Finishをクリックします。


これでコンパイラのインストールは完了です。


動作確認用プログラムを作成する


次は、インストールしたC30コンパイラを使用してLED点滅のプログラムを作成してみます。

MPLABのIDEを起動し、Project -> Project Wizardを選択します。


プログラムを作成するターゲットのマイコンを指定します。
今回はPIC24FJ32GA002を使用しました。


次にコンパイラを選択するのですが…
選択肢を見ると、先ほどインストールしたC30コンパイラが選択肢に表されません!!


ここは一旦落ち着いて、Show all installed toolsuitesをチェックします。


その後再度選択肢を開くとC30 Toolsuiteが表示されましたので、これを選択します。


Toolsuite Contentsから、Cコンパイラを選択します。


プロジェクトの作成先フォルダを指定します。


そのまま次へをクリックします。


最終確認です。
Deviceが、選択したものになっているかを確認し、完了をクリックします。


プロジェクトを作成したら、まずはmain.cをプロジェクトに追加しておきます。





次に使用するマイコンのヘッダをプロジェクトに追加しておきます。本作業は必須では有りませんが、このヘッダは頻繁に参照するので、プロジェクトに足しておくとダブルクリックするだけで中身が確認できるようになるので便利です。

Header Files -> Add Filesを選択し、ヘッダファイルを選択します。





ヘッダは、C30コンパイラのセットアップでデフォルトのインストール先を選択した場合、以下のフォルダにあります。

C:\Program Files\Microchip\MPLAB C30\support\PIC24F\h


フォルダの中身は以下のように、マイコンの型番毎にヘッダが有ります。


ヘッダを追加後、ダブルクリックするとファイルが開くようになります。



次にmain.cに動作確認用のプログラムを作成します。

#include <libpic30.h> 
#include <p24FJ32GA002.h>
 
//--------------------------------------
// コンフィグレーションビットの設定
//--------------------------------------
_CONFIG2(   POSCMOD_NONE  &       // Primary oscillator disabled
            IOL1WAY_OFF   &       // IOLOCK may be changed via unlocking seq
            OSCIOFNC_ON   &       // OSC2/CLKO/RC15 functions as port I/O (RC15)
            FCKSM_CSDCMD  &       // Clock switching and Fail-Safe Clock Monitor are disabled
            WUTSEL_LEG            // Legacy Wake-up Timer
        );
 
_CONFIG1(   FWDTEN_OFF &          // Watchdog Timer is disabled
            ICS_PGx1   &          // Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1
            COE_ON     &          // Reset Into Clip On Emulation Mode
            BKBUG_ON   &          // Device resets into Debug mode
            GWRP_OFF   &          // Writes to program memory are allowed
            GCP_OFF    &          // Code protection is disabled
            JTAGEN_OFF            // JTAG port is disabled
         );
 
int main( void )
{
    volatile unsigned long int loop;
    TRISB = 0x00;
 
	// 一定周期でLEDを点滅させる
    while( 1 ) {
        PORTB = 0xFF;
        for ( loop = 0; loop < 100000; loop++ ) { // 0.8sec
            ; /* nop */
        }
 
        PORTB = 0x00;
        for ( loop = 0; loop < 100000; loop++ ) {
            ; /* nop */
        }
    }
 
    return 0;
}


ほとんどがコンフィギュレーションビットの設定ですね。
_CONFIG1(),_CONFIG2()で何が指定できるかは、先ほどのヘッダに書かれています。今回は開発向けの無難な設定にしておきました。
コンフィギュレーションビットはPICの型番毎に違うので、PIC24FJxxGA002以外を使う場合は必ずヘッダの中身を確認してください。

プログラムの中身は、TrisBでPortBのBR0-BR7を出力ピンに設定した上で、PortBの全ピンを一定周期でOn-Offさせています。


プログラムを書いたらProject->Makeをクリックしてコンパイルします。
OutputウィンドウにBUILD SUCCESSEDと出る事を確認してください。


これで、テスト用プログラムの作成は完了です。


作った確認プログラムをPICに書き込む


次はいよいよプログラムを書き込みます。
書き込みにはPICkit3を使用します。

PICkit3の役割や、基本的な使い型はこちらを参考にしてください。
PICkit3を使ってMPLABからプログラムを焼く方法


今回はPIC24で28ピンのモノなので、上記の記事とは書き込みに使用するピンの割り当てが変わります。今回は小さいブレッドボードで書き込み用回路を作成しました。

まずは、今回使用するPIC24FJxxGA002のデータシートより、ピンアサインを確認します。
PCD1,PGC1がある4,5番ピンが書き込みを行うためのピンです。ほかにMCLR、Vdd, VssをPICkit3と接続する必要があります。


PICkit3のユーザガイドを見ると、PICkit3側のピンアサインが分かります。


両者を見比べつつ、作成した回路がこちら。
両者のPin1,4,5の配置が同じなので、とてもシンプルな回路になりました。
15ピンにつながっているLEDと470オームの抵抗は動作確認用です(PortBのBR6につながってます)。
また、左下から出ているピンヘッダがPICkit3の差込み口で、左端が1番ピンです。



Programmer->Select Programmerより ライターとしてPICkit3を選択します。


次にProgrammer->Settingsより、PowerタブのPower target circuit form PICkit3にチェックを入れます。PIC24FJxxGA002は3.3V駆動なので最も近い電圧の3.250を指定します。


すると、Outputウィンドウに以下のようにDevice IDが表示されるはずです。
ここで赤字でエラーメッセージが出る場合は、配線が間違っているか、上記のSettings漏れなので、再確認してください。



プログラムをコンパイルしたら、ツールバーのProgramをクリックし、プログラムを書き込みます。


これでブレッドボード上のLEDが周期的に点滅するはずです。
以上で、C30コンパイラのインストールと動作確認は完了です。


4774132470
C言語ではじめる PIC24F活用ガイドブック

[C#]ファイルの中身を2進数で出力するツール(TextToBinaryDigit.exe)

ファイルの中身を2進数でダンプする必要があったので、勉強もかねてC#で作ってみました。
コマンドラインプログラムで、以下の様な感じで使います。

c:\> type c:\input.txt
Hello world
にほんご
 
c:\> type c:\input.txt | TextToBinaryDigit.exe
01001000
01100101
01101100
01101100
01101111
00100000
01110111
01101111
01110010
01101100
01100100
00001101
00001010
10000010
11001001
10000010
11011001
10000010
11110001
10000010
10110010
00001101
00001010



ちなみに「にほんご」は,SJISで、0x82c9 0x82d9 0x82F1 0x82B2のバイト列です。
改行文字の0x0d, 0x0aの後(それぞれ1101,1010)に上記のバイトがある事が分かるかと思います。

ダンプ出力する元データの渡し方は標準入力だけなので、ファイルの中身をダンプしたい場合はtypeコマンドの出力をリダイレクトさせて下さい。

単機能のツールなので、mainメソッドは6行しか有りません。

class Program {
 
    static void Main( string[] args ) {
        using ( Stream reader = Console.OpenStandardInput( 32 ) ) {
            int data;
            while ( ( data = reader.ReadByte() ) != -1 ) {
                Console.WriteLine( Convert.ToString(data, 2).PadLeft( 8, '0' ) );
            }
        }
    }
 
}



この手のプログラムは探せば幾らでも有りそうな気もしますが、シンプルなものが欲しい人のために、exeも置いておきます(ソースは上記の6行で全部なので配布しません)。
ダウンロード: TextToBinaryDigit.zip

[C#]StreamReaderのRead()がcharではなくintを返す理由

ファイルなどのストリームからデータを1文字読み込むためのメソッドとしてRead()というものが有ります。このメソッドは”1文字”読み込むのだから戻り値はcharでよいはずなのですが、なぜかint型になっています。

なぜintを返すような仕様となっているのでしょうか?


それは、Read()メソッドの戻り値は、ファイルから取得した文字に加えて、ファイルの終端(EOF)を返してくるからです。EOFというのは、読み込んでいるファイルがファイルの最後に達してしまい、それ以上読むべきデータが無い状況です。
(ちなみに、EOFに達している状態でさらにRead()をコールしても-1が返され続けます)

C#のcharは2byteなので、65536種類の文字が表現できます。
一方、Readの戻り値として返されるデータは、65536種類の文字+EOFの65537種類です。

なので、char型だと65537パターンのデータを表現できず、より表現範囲が多いint型が使われているという仕組みです。Read()はEOF以外の場合は正の値、EOFの場合は-1を返すという仕様になっています。

Read()メソッドで読み込んだデータは、後続の処理ではchar型の変数に入っていると何かと便利な場合が多いですが、上記の理由により、EOFチェックを行った後ならキャストしてしまってOKです。

StreamReader reader = ...;
 
int data = reader.Read();
if ( data == -1 ) {
	//EOFが来た時の処理
}
 
// ここでchar型にキャストする
char ch = (char)data;


[C#]指定されたASCIIコードをstring型の文字列に変換する

C#で、数字で指定されたASCIIコードをstring型の文字列に変換する方法です。
基本的には、charにキャストした上でToString()をコールすれば良いです。

int data = 2;
string ans = ((char)data).ToString();


これで、ans には0x02(制御コードのSTX)が入ります。


キャストを忘れると正しく動作しません。
以下のコードだとansには”2″(数字の2)が入ってしまいます。

string ans = (data).ToString();

[C#]WebBrowerコントロールで、jQueryを使用して任意のJavaScriptを実行する

.Net Frameworkで用意されているWebBrowerコントロールを使用して、JavaScriptを実行できるプログラムを作成しました。実行するJavaScriptは素のままだと使い辛いので、jQueryを自動ロードしています。

例えば、Yahooのトップページに対して下記のコードを実行させると…

$('input#srchtxt').val( "hello world" );
$('input#srchbtn').click();




指定されたキーワードで検索を行ってくれます。





行っている事は非常に簡単で、Formのボタンをクリックしたら、jQueryをロードした上で、指定されたスクリプトを実行するブックマークレットを走らせるだけです。コードも以下のようにシンプルです(C#のコードの中にJavaScriptのコードが入っているので可読性が低いですが…)。

		private void btnRunJs_Click( object sender, EventArgs e ) {
 
			string header = @"
(function(d, j, b) {
    function r() {
        setTimeout(function() {
            (typeof jQuery == 'undefined') ? r() : b(jQuery);
        }, 100);
    }
    if (j) { b(jQuery);
    } else {
        var s = d.createElement('script');
        s.src = 'http://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js';
        d.body.appendChild(s);
        r();
    }
})(document, this.jQuery, function($) {";
 
			string footer = @"});";
 
			webBrowser1.Url = new Uri( "javascript:" + header + txtJs.Text + footer );
		}




jQueryのロードは、下記のページの内容を参考にさせて頂きました。
jQueryでブックマークレットを書く 3




せっかく作ったので、ソースと実行ファイルをダウンロードできるようにしておきます。
プロジェクトは、VisualStudio2010で作成しています。

ダウンロード(src,exe)
WebBrowser_WithScriptTest.zip

[PIC]Timer2をPWMモードで使用時のレジスタ値と周波数の対応表

PICに搭載されているTimer2タイマにはCCP機能というものがあり、PWMとして使用することが出来ます。この際、レジスタにセットした値とPWMで出力できる周波数の対応が分かり辛かったので、Excelで一覧表を計算できるようにしてみました。

例えば8MHz駆動時にの周波数は以下の通りです。PIC16F88は、T2CONbits.T2CKPSレジスタの値によって最大1/16まで分周することが出来るのですが、8Mhz駆動だと限界まで遅くしても488Hz以下には出来ない事がわかります(クロックを落とせばもっと低い音も出せます)。


スピーカーから音を鳴らすのに使えないかと思って調べてみたのですが、下限が488Hzだと高すぎる(基準のラの音が440Hzなのでそれすら出ない)のでどうやら使えなさそうです。PICによっては1/64まで分周出来るものもあり、この場合は122Hzまで落とせるので、おもちゃの電子オルガン程度なら作れそうです。

Excelファイルもダウンロードできるようにしました。周波数などの値を変えれば一覧が再計算されるようにして有るので興味があれば使ってみてください。
ダウンロード:PIC_Timer2PWM.zip

[C#]WebBrowserコントロールで、指定されたURLのページを表示させる

以下のコードで、指定されたアドレスのページを表示させる事が出来ます。

private void button1_Click( object sender, EventArgs e ) {
	webBrowser1.Url = new Uri( "http://yahoo.co.jp/" );
}






UrlプロパティにUriオブジェクトではなく文字列をセットすると、エラーになるので注意してください。

ダメなパターンのコード

private void button1_Click( object sender, EventArgs e ) {
	webBrowser1.Url = "http://yahoo.co.jp/";	// これはNG
}



表示されるエラー

エラー  型 'string' を型 'System.Uri' に暗黙的に変換できません。

ドレミの音と周波数の関係


ドレミのそれぞれの音と、周波数の関係は以下の通り

ラ      440.00 
ラ♯    466.16 
シ      493.88 
ド      523.25 
ド♯    554.37 
レ      587.33 
レ♯    622.25 
ミ      659.26 
ファ    698.46 
ファ♯  739.99 
ソ      783.99 
ソ♯    830.61 
ラ      880.00



ラの音が基準で440Hzになる。
1オクターブ上げるには周波数は2倍になる。
基準のラから1オクターブ上のラまでは、12等分された等比級数で周波数を求める事が出来る(1/12乗づつ掛ける)。


ちなみに、電話のダイアル音で使用しているDTMFは2音を合成して作る。
各数字で合計すべき周波数は以下の通り

    | 1209 1336 1477
----+---------------
697 |    1    2    3
770 |    4    5    6
852 |    7    8    9
941 |    *    0    #


[WordPress]titleタグの表示をカスタマイズする

WordPressのテーマ編集で、以下の様なタイトル表示を行わせてみます。

ページタイトルを表示する
トップページの場合は、ブログ名をタイトルに表示
カテゴリ、タグ別の記事一覧ページの場合は「xxxの記事一覧」という表記にする
複数ページの場合は、ページ番号を表示




上記の要件を満たすコードは以下の通りとなります。

<title><?php
    // ページタイトルを表示する
    wp_title( '', true, 'right' );
 
    // トップページの場合は、ブログ名をタイトルに表示
    if ( !wp_title(' ', false) ) { 
        bloginfo('name');
    }
 
    // カテゴリ、タグ別の記事一覧ページの場合は「xxxの記事一覧」という表記にする
    if( is_category() || is_tag() ) {
        echo "の記事一覧";
    }
    // 複数ページの場合は、ページ番号を表示
    global $page, $paged;
    if ( $paged >= 2 || $page >= 2 )
        echo ' &laquo; ' . sprintf( __( 'Page %s', 'nest' ), max( $paged, $page ) );
?></title>



wp_title()は第二引数をtrueにすると実際にタイトルを表示し、falseだと戻り値としてタイトル文字列を返します。ですので、”if ( !wp_title(‘ ‘, false) )”で、トップページかどうかを判定しています。

blogタイトルは、管理ページで設定された値をbloginfo(‘name’)で取得しています。

カテゴリ/タグ別の記事一覧ページだった場合は、それぞれis_category()、is_tag()がtrueになるのでチェックした上で文言を追加しています。

[PIC]16F88でRB6,RB7が入出力ピンとして使えない時にチェックする事

PIC16F88等の18ピンのPICを使用している場合、RB6,RB7ピンが入力として使えない場合があります。
このような際ににチェックする事を羅列してみました。

RB6,RB7が入出力ピンとして使用できないときのチェックポイント


Check1:アナログ入力ピンとの競合

RB6,RB7は、アナログ入力のAN5,AN6と共用になっています。
PORTBのデジタル入出力として利用したい場合は,ANSELレジスタの値を0にする必要があります。
[PIC]PIC16F88でPortAを入出力ピンとして動作しない場合にチェックする事

HI-TECH Cによるコード例

void main( void )
{
    ANSEL = 0;
    ...
}



Check2:デバッグピンとの競合

16F88は、RB6,RB7がデバッグ用のピンになっています。
__CONFIG()マクロでDEBUG_ONにしている場合は、OFFにしてデバッグ機能を無効にします。

PicKit3などのライタを使用している場合、ライタが接続されていると、RB6,RB7を入力用ピンとして使用できません(PicKit3側の回路が生きるため)。
この為、テストを行う場合は都度、ライタを外す必要があります。

HI-TECH Cによるコード例

#include <htc.h>
 
__CONFIG (  DEBUG_OFF & ... )   // ICDデバッグを無効にする
 
void main( void )
{
    ...
}




Check3:Timer1機能との競合

Timer1タイマを使用している場合、RB6,RB7はクロック供給のピンとして使用可能です。

内部オシレータ等をクロックソースとして使用する場合は、T1CONレジスタのT1OSCENビットを0にする必要があります。外部オシレータを使用する場合は、RB6,RB7をデジタル入出力として使えません。

HI-TECH Cによるコード例

void main( void )
{
    T1CONbits.T1OSCEN = 0;
    ...
}




Check4:Input/Outputの指定が逆になっている

該当ポートを出力として使いたいのに入力モードになっている(もしくはその逆)になっていると、当然ながら正しく動作しません。

PORTBのピンに対する入出力モードはTRISBレジスタで指定でき、入力モードにしたい場合は対応するビットを”1″、出力にしたい時は”0″にします。

HI-TECH Cによるコード例
1:RB6,7を入力にする場合

void main( void )
{
    TRISBbits.TRISB7 = 1;   // RB7を入力モードにする
    TRISBbits.TRISB6 = 1;   // RB6を入力モードにする
    ...
}



2:RB6,7を出力にする場合

void main( void )
{
    TRISBbits.TRISB7 = 0;   // RB7を出力モードにする
    TRISBbits.TRISB6 = 0;   // RB6を出力モードにする
    ...
}


[PIC]PIC16F88でPortAが入出力ピンとして動作しない場合にチェックする事

PIC16F88にあるPortAのうち、RA0-RA4はアナログ入力と兼用になっているのですが、デフォルトではアナログ入力側が有効になっているのでデジタルのI/Oとして使用できません。


この為、ANSELレジスタ(Analog Select Register)をデジタル入出力として設定する必要があります。

ANSELレジスタ(0x9B)

bit7  unimpremented
bit6  ANS6
bit5  ANS5
bit4  ANS4
bit3  ANS3
bit2  ANS2
bit1  ANS1
bit0  ANS0


ANSnはANnピンのモード指定で、0でデジタル入出力、1でアナログ入出力となります。
PIC16F88は、RA0~RA4がAN0~AN4にマッピングされているので下位5bitを操作すればOKです。
RB6,7も同様にデジタル入出力として使う場合はbit5,6を操作します。

例えば,RA0-RA5をデジタル出力ピンにする設定をHI-TECH Cのコードで書くと以下のようになります。

TRISA  = 0x00;			// PortAをすべて出力にする
ANSEL  = 0x00;			// AN1-AN6を使用しない(すべてデジタル出力にする)


DB開発を行うときのベストプラクティス

データベースのテストについての記事、Tips for Testing Database Codeを読んでのメモです。
元記事を訳したものと、感想・意見がごちゃまぜで箇条書きで書いてあります。

DBの自動テストは遅く、管理が難しい
 
DBの変更は全て、人が読める形でバージョン管理システムで管理する。
 
DB定義の仕様書から、ワンクリックでDB定義のスクリプトが生成できること
    DB定義の仕様書は、Excelなどで作成することも多いが、この際、Excelのマクロでcreate table等の
    DBオブジェクト生成を行えるようにしておく。
    また、この際、直前の生成内容との差分を取れる仕組みを作っておくとChangeLogの自動生成も可能となる。
 
各開発者に個別のDB(スキーマ)を提供し、DBのセットアップを簡単に素早く行える環境を作ること
    複数人で開発を行っている場合、DBが1つしかないと
    また、この為に設定ファイルだけで、接続先DBを切り替えられるような構成をとる必要がある。
 
ワンクリックで、DBのエクスポート・インポートを可能にすること。
    エクスポートしたファイルは、タイムスタンプ付きのファイル名にし、複数世代管理可能とすること
 
UIの処理と、DB処理(トランザクション処理)を分離すること。
 
トランザクション処理は、統一されたインターフェースとなっていること。
    例えば、GUIアプリでボタンのクリックイベントハンドラ内に直接SQLを記述することも可能だが、
    この構成にしてしまうとDBのトランザクション処理をテストするだけのために画面操作が必要になる。
    また、UI処理とビジネスロジックを分離した方がプログラムの見通しも良くなる。
    引数、戻り値の数が可変個になる為、この点を考慮する必要がある。
    例えばC#のbackgroundWorkerクラスは、このあたりの処理をうまく行っている。
 
テスト用、デモ用、自動単体テスト用などのDBは、開発用のDBとは別に設けること
 
DB操作を受け持つためのデータアクセス層の用クラスを設けること。
    dbi,jdbc,ODBCやOADOなどのDBアクセスクラスをアプリケーションから直接コールすることは避ける。
 
DBの設定で、データをインメモリで管理できるようであればこの設定を使う。
それが無理なら、RAMディスクやSSDにDBを置けないか検討する
    開発・単体テスト時は、必ずしも大量データでテストを行う必要はない。
 
DBの整合性チェック用のスクリプトを作成し、各単体テスト後にスクリプトを実行して確認が行えるようにする。
 
自動で初期マスタデータ・テストデータをロードするスクリプトを設ける
 
テストデータを用意に生成できるための仕組みを設ける。
    エクセルのマクロでも良い。
 
単体テストを自動化する場合は、スキーマ定義の処理から再実行する。
    いわゆるcreate userやcreate tableを行う処理を最初に実行させる。
    この手段をとると、当然テストに時間が掛かるようになるが、インフラ部の変更に伴う不具合を
    早期に検出可能となり、メリットは大きい。
 
 
各テストを実行するたびに、ロールバックする。トランザクション内で勝手にコミットしていないかを確認する。
 
 
スキーマ定義のためのスクリプトを設け、バージョン管理に入れる
    テストを行うのが簡単になる
 
但し、大量データのテストや、マックス値のデータでテストすることも忘れてはいけない

[PIC16F88]HI-TECH CでTimer1割り込みを使用する

PICの16F88はTimer0,1,2という3つのタイマーモジュールを持っており、それぞれのタイマーは役割が異なっています。

今回は、16F88でHI-TECH Cを使用してTimer1割り込みを利用し、0.5秒周期でLEDを点灯させてみます。
クロックは16F88の内部オシレータを8MHzで駆動させます。

#include <stdio.h>
#include <htc.h>
 
#define TIMER_INTERVAL (0xffff - 20000) // TMRモジュールのカウント初期値
                                        // 8MHz, 1/1プリスケーラで、10msecごとに割り込みが入る
 
 
void main( void )
{
    __CONFIG ( FOSC_INTOSCIO &  // 内部クロック
              WDTE_OFF &        // watchdogオフ
              PWRTE_OFF &       // Power-up Timer
              MCLRE_OFF &       // MCLRピンを汎用I/Oとして使用
              BOREN_OFF &       // 電圧降下によるリセットオフ
              LVP_OFF &         // Low-Voltage Programmingオフ
              CPD_OFF &         // EEPROM  プロテクトオフ
              WRT_OFF &         // FrashROMプロテクトオフ
              DEBUG_ON &        // ICDデバッグを有効にする
              CCPMX_RB0 &       // RB0をCCPとして使用
              CP_OFF );         // コードプロテクトオフ
 
    OSCCONbits.IRCF = 7;        // 内部クロックを8MHz駆動にする
    TRISB  = 0x00;          // PortBをすべて出力にする
 
 
    INTCONbits.GIE  = 1;    // Grobal interruptを有効にする
    INTCONbits.PEIE = 1;    // 外部割込みを有効にする
 
    PIR1bits.TMR1IF = 0;    // Timer1割り込みフラグを落としておく
    PIE1bits.TMR1IE = 1;    // Timer1割り込みを有効
 
 
    T1CONbits.T1CKPS = 0;   // プリスケーラを1/1にする
    TMR1 = TIMER_INTERVAL;  // タイマー値をセットします
 
    T1CONbits.TMR1ON = 1;   // Timer1を有効にする
 
    // 割り込みベースで動作させるので何もしない
    while( 1 ) {
        NOP();
    }
 
}
 
 
// 割り込み処理(10msec周期)
static void interrupt intr( void )
{
    volatile static int intr_counter;
 
    //------------------------------------
    // Timer1割り込みが発生したときの処理
    //------------------------------------
    if ( PIR1bits.TMR1IF == 1 ) {
        TMR1 = TIMER_INTERVAL;  // タイマーをリセット
 
        intr_counter++;
        if ( intr_counter >= 100 ) {
            intr_counter = 0;
        }
 
        // 0.5sec周期でRB0を点滅させる。    
        if ( intr_counter >= 50 ) {
            PORTBbits.RB0 = 0;
        } else {
            PORTBbits.RB0 = 1;
        }
 
        // 10msec周期でRB1を点滅させる。    
        // (点滅が速すぎて目視では確認できませんが...)
        if ( intr_counter % 2 == 0 ) {
            PORTBbits.RB1 = 0;
        } else {
            PORTBbits.RB1 = 1;
        }
 
        PIR1bits.TMR1IF = 0;    // 割り込みフラグを落とす
    }   
 
    return;
 
}



main()ではまず内部オシレータを使用させています。

    __CONFIG ( FOSC_INTOSCIO & ... ); // 内部クロック
    OSCCONbits.IRCF = 7;        // 内部クロックを8MHz駆動にする


__CONFIG()でFOSC_INTOSCIOを指定する事で内部オシレータを使用します。
内部オシレータはデフォルトでは31.25kHzという非常に遅い周波数になっているため、OSCCONレジスタのIRCFビット(以後OSCCON.IRCFと表記します)を7にセットし、8MHz駆動に変更します。


次にタイマー割り込みの設定を行います。

    INTCONbits.GIE  = 1;    // Grobal interruptを有効にする
    INTCONbits.PEIE = 1;    // 外部割込みを有効にする
 
    PIE1bits.TMR1IE = 1;    // Timer1割り込みを有効
    PIR1bits.TMR1IF = 0;    // Timer1割り込みフラグを落としておく


タイマー割り込みは、INTCON.GIE、INTCON.PEIE、PIE1.TMR1IEの2ビットを立てることで有効になります。
タイマー割り込みが発生すると、PIR1.TMR1IFビットが立つので、0で初期化します。


以下のコードは、タイマー割り込みの周期を設定しています。

#define TIMER_INTERVAL (0xffff - 20000) // TMRモジュールのカウント初期値
                                        // 8MHz, 1/1プリスケーラで、10msecごとに割り込みが入る
...
 
    T1CONbits.T1CKPS = 0;   // プリスケーラを1/1にする 0:1/1 1:1/2 2:1/4 3:1/8
    TMR1 = TIMER_INTERVAL;  // タイマー値をセットします
 
    T1CONbits.TMR1ON = 1;   // Timer1を有効にする


T1CON.T1CKPSでプリスケーラを1/1にセットします。これによって4クロック毎にタイマーが1増える事になります。もしプリスケーラを他の値、例えば1/2にセットすると分周がかかるので8クロック毎にタイマー値が加算されます


次にTMR1レジスタにタイマーの周期をセットします。
TMR1は16bitのレジスタで、Timer1はTMR1が0xffffからオーバーフローした時に割り込みが掛かります。
今回は,タイマー割り込みを10msec周期でかけるようにしてみます。

今までの設定で、8MHz駆動、4クロック毎にカウンタインクリメントさせているので…

0.001(msec) = 1/8000000(hz) * 4 * x
x = 20000


となり、カウンタが20000回る毎に割り込みが発生すればよい事がわかります。TMR1はアップカウンタなので、結果的にTMR1には0xffff – 20000セットすれば良いです。




タイマーの事前準備が出来たら、次は割り込み処理です。
HI-TECH Cではinterruptをつけた関数が割り込み関数になります。

// 割り込み処理(10msec周期)
static void interrupt intr( void )
{
    volatile static int intr_counter;
 
    //------------------------------------
    // Timer1割り込みが発生したときの処理
    //------------------------------------
    if ( PIR1bits.TMR1IF == 1 ) {
        TMR1 = TIMER_INTERVAL;  // タイマーをリセット
 
        intr_counter++;
        if ( intr_counter >= 100 ) {
            intr_counter = 0;
        }
 
        // 0.5sec周期でRB0を点滅させる。    
        if ( intr_counter >= 50 ) {
            PORTBbits.RB0 = 0;
        } else {
            PORTBbits.RB0 = 1;
        }
 
        PIR1bits.TMR1IF = 0;    // 割り込みフラグを落とす
    }   
 
    return;
 
}



割り込みハンドラは、Timer0に限らずどんな割り込みでもここに飛んでくるので、PIR1.TMR1IFを見て、Timer0割り込みが発生したかをまずチェックします。0.5msec毎に点滅させるのが目的だったので、割り込み関数内でカウンタを回して50回ごとにRB0の値をトグルさせています。

割り込みハンドラ内では、PIR1.TMR1IFを落とし忘れないように注意してください。
これを落とし忘れると、直ぐに再度割り込み処理が走ってしまい、想定した振る舞いになりません。

[C#]文字列中の制御文字を、[CR][LF]や[0D][0A]のように可視化する

Stringオブジェクトの文字列中に制御文字(0x00~0x19)が入ると、TextBoxなどに値を表示する際、制御文字が入っている事を確認する事が出来ません。
このような場合、制御文字を他のテキスト文字に置き換えると分かりやすいです。

という訳で今回は、制御文字を可視化(例えば0x02を[STX]に置き換えるなど)させるコードを紹介します。


変換作業は、正規表現による置換機能を利用します。正規表現を使って制御文字をマッチさせたいのですが、幸いな事に.Netでは、制御文字は「\p{Cc}」というパターンであらわす事が可能です。

「\p{Cc}」って何???と思われるかもしれませんが、分解して考えると以下の形になります。

 \p{name}
    nameで指定されたUnicode一般カテゴリまたは名前付きブロック内の任意の1文字と一致
 Cc
    Unicodeで定義されているGeneral Categoryの一種で,制御文字を意味する



入門 正規表現



という訳で、制御コードを可視化するには下記のコードになります。

1.制御コードが含まれる文字列を、コード名称に変換する。

string inData = "data\r\n";
string[] ctrlStr = { "NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
                     "BS",  "HT",  "LF",  "VT",  "NP",  "CR",  "SO",  "SI", 
                     "DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB", 
                     "CAN", "EM",  "SUB", "ESC", "FS",  "GS",  "RS",  "US" };
outStr = Regex.Replace( inStr, @"\p{Cc}", str=> {
    int offset = str.Value[0];
    if ( ctrlStr.Length > offset ) {
        return "[" + ctrlStr[ offset ] + "]";
    } else {
        return string.Format("<{0:X2}>", (byte)str.Value[0]);
    }
});
//outStr -> "data[CR][LF]"



2.制御コードが含まれる文字列を、16進文字列に変換する。

string inData = "data\r\n";
outStr = Regex.Replace( inData, @"\p{Cc}", str=>string.Format("[{0:X2}]", (byte)str.Value[0]) );
//outStr -> "data[0D][0A]"



後者は分かりやすいですが、前者はちょっと見づらくなってしまいました。
前者例のパターンで制御文字の前後に付与する文字(例だと”[“,”]”)が決まっている場合は、ctrlStr配列へ直に書いた方がパフォーマンスが良いです。



4774145092
反復学習ソフト付き 正規表現書き方ドリル (WEB+DB PRESS plus)

[C#]各種データ型と16進数文字列の変換方法

byteの配列に入った値を16進文字列に変換する

byte[] inData = { 0x01, 0x02, 0x88 };
string outStr = BitConverter.ToString( inData );
// 01-02-88




16進文字列をbyteに変換する

byte outByte = Convert.ToByte( "0A" );




intの値を16進文字列に変換する

int i = 10;
string outStr = i.ToString( "X2" )
// 0A




16進文字列をintに変換する

string inStr  = "FF";
int    outNum = Int32.Parse( inStr, NumberStyles.AllowHexSpecifier );
// outNum = 255




制御文字を[xx]の形式に変換する

string inData = "data\r\n";
Regex.Replace( inData, @"\p{Cc}", str=>string.Format("[{0:X2}]", (byte)str.Value[0]) );
// data[0D][0A]




文字列をcharの配列に変換後、1文字づつ16進文字列に変換する

string inStr = "test";
foreach (char c in inStr ) {
    int    intVal = Convert.ToInt32( c );
    string outStr = String.Format("{0:X2}", intVal );
}


[C#]ComboBoxのSelectedIndexをオブジェクト指定でセットする。

ComboBoxでどの項目が選択されているかを,コードから指定(変更)したい場合があります。
このような場合、SelectedIndexプロパティをセットする事で目的を達成できるのですが、Index番号では無くItemsに登録されたオブジェクトで指定を行いたい場合も有ります。

このような場合は、以下のようにSelectedItemを使用すればOKです。

// フロー制御の選択肢を追加
cmbHandshake.Items.Add( System.IO.Ports.Handshake.None );
cmbHandshake.Items.Add( System.IO.Ports.Handshake.XOnXOff );
cmbHandshake.Items.Add( System.IO.Ports.Handshake.RequestToSend );
cmbHandshake.Items.Add( System.IO.Ports.Handshake.RequestToSendXOnXOff );
 
// RequestToSendの選択肢が選ばれた状態にする
cmbParity.SelectedItem = System.IO.Ports.Handshake.RequestToSend;



[WordPress]カテゴリ別/タグ別のRSSリンクをプラグインを使わずに追加する

WordPressでカテゴリ別やタグ別のリンク集を、プラグインを使用せずに作ってみます。
出来あがりはこんな感じ↓



カテゴリ別のRSSフィードを取得する


まずは、カテゴリ別のRSSフィードを取得する必要があるのですが、実はWordPressでは何もしなくてもデフォルトでフィード配信をしてくれています。

例えばカテゴリwordpressのカテゴリページが以下のURLだったとすると…
http://nanoappli.com/blog/archives/category/wordpress
以下のように末尾に”/feed”をつければ、wordpressカテゴリだけのRSSフィードが表示されます。
http://nanoappli.com/blog/archives/category/wordpress/feed

というわけで、各カテゴリのURLさえ求まれば、目的は達成できるという事が分かります。
また、タグに関しても同様にタグのページの末尾に/feedを付けてあげればよいです。


WordPressのAPIでカテゴリ一覧を取得する


WordPressには、カテゴリの一覧を取得するためのAPIが用意されています。
以下のコードで、データの一覧を配列で取得できます。

//カテゴリ一覧を取得
get_terms( "category", "fields=all&get=all" );
 
//タグ一覧を取得
get_terms( "post_tag", "fields=all&get=all" );



上記の例では、名称のコード順にデータを取得していますが、第二引数にorderby=countなどと指定を追加すれば、件数の順に取得する事も可能です。


データを取得したら、nameで名称、countで件数が取れます。
リンクURLはget_category_link()やget_tag_link()で取得可能なので、末尾に”/feed”を追加します。

$cat_all = get_terms( "category", "fields=all&get=all" );
foreach($cat_all as $value) { 
    echo get_category_link($value->term_id) + "/feed"
    echo $value->name + "(" + $value->count ")"
}




cssによる装飾を追加

htmlを出力した上で、cssで装飾を追加した最終形のコードです。

<!-- ******************************** -->
<!-- カテゴリ/タグ別RSS            -->
<!-- ******************************** -->
<style type="text/css">
<!--
.rssLinks { font-size:8pt; }
.rssLinks ul li {
    float: left;
    background-color:#F0F0F0;
    border:1px solid #DDDDDD;
    list-style-type: none;
    margin:4px 3px;
    padding: 1px 1px;
}
.rssLinks a:hover {
    background: url("/rss.png") no-repeat scroll 0 0 transparent;
    background-position:left center;
    text-decoration: none;
}
.rssLinks a {
    background: url("/rss.png") no-repeat scroll 0 0 transparent;
    background-position:left center;
    text-decoration: none;
    padding: 0px 10px 0px 20px;
}
-->
</style>
<div style="background-color:#F9F9F9; border:1px solid #DDDDDD; padding:25px; margin-top:20px;">
    カテゴリ別RSS
    <div class="rssLinks">
        <ul>
            <?php $cat_all = get_terms( "category", "fields=all&get=all" ); ?>
            <?php foreach($cat_all as $value) { ?>
                <li><a class="rssItem" target="_blank" href="<?php echo get_category_link($value->term_id); ?>/feed">
                    <?php echo $value->name;?>(<?php echo $value->count;?>)</a>
                </li> 
            <?php } ?>
        </ul>
        <div style="clear:both"></div>
 
        <br />
        タグ別RSS
        <ul>
            <?php $tag_all = get_terms("post_tag", "fields=all"); ?>
            <?php foreach($tag_all as $value) { ?>
                <?php if ( $value->count < 3 ) continue; ?>
                <li>
                <a class="rssItem" target="_blank" href="<?php echo get_tag_link($value->term_id); ?>/feed">
                    <?php echo $value->name;?>(<?php echo $value->count;?>)</a>
                </li> 
            <?php } ?>
        </ul>
    </div>
    <div style="clear:both"></div>
</div>



カテゴリは全部表示させているのですが、タグは大量にあるので件数が膨大になってしまいました。そのため下記のコードで件数を絞り、記事が3件以上あるタグのみを表示させます。

<?php if ( $value->count < 3 ) continue; ?>



このコードを実行した結果です。いい感じに仕上がってくれました。



上記画像で使用しているRSSのアイコンは、以下のサイトで提供されているものを利用しました。
Feed Icons – Home of the free Standard RSS Icon


RSSアイコンの利用ガイドラインは以下の通りです。

The Mozilla Foundation has made these icons freely available for use by others; this document contains suggested guidelines for use of the icons, and is published and maintained by the Mozilla Foundation as a service to

the community of individuals and organizations wishing to use the feed icon in connection with their own products and services and

members of the general public who use those products and services and rely on the standard meaning of the feed icon as indicating the use of open web syndication formats.



4883377830
WordPressデザインブック3.x対応

レンタルサーバのデータをバッチファイルで自動バックアップする

ちょっと前の事になりますが、ファーストサーバのデータ消失事件があったので、レンタルサーバのバックアップ取得を自動化する事にしました。

方針は、サーバに保存されているファイルを、手元にあるWindowsのPCにバッチでダウンロードする事でバックアップを取ります。
ダウンロードしたファイルはミラーリングします。MySQLのDBデータは、mysqldumpコマンドを使用してバックアップ時刻までにバックアップしておく事にします。



今回は、設定内容の保存・バッチ実行・ミラーリングが行えるffftpを使用します。

まずはffftpの接続->ホストの設定からサーバの設定を行い、対話的にファイルのダウンロードが出来る事を確認します。

この際、ホストとローカルの初期フォルダを適切に設定しておきます(それぞれバックアップ元・先フォルダになります)。また、ホストの設定名を控えておきます。


また、オプション->環境設定のメニューより、ミラーリングダウンロードで”ファイル削除前の確認”からチェックを外しておきます。




ffftpの設定が出来たら、次は以下のバッチファイルを作成します。

rem --set        : 接続するホストの設定名を指定する
rem --mirrordown : 接続後ミラーリングダウンロードを行う
rem --force      : ミラーリング開始の確認をしない
rem --quit       : ミラーリング終了後、FFFTPを閉じる
 
rem 開始時刻を記録する
echo start  > log.txt
date /t    >> log.txt
time /t    >> log.txt
 
rem バックアップを行う
"C:\Program Files\ffftp\FFFTP.exe" --set "backup_setting" --mirrordown --force --quit
 
rem 終了時刻を記録する
echo end   >> log.txt
date /t    >> log.txt
time /t    >> log.txt




設定が出来たら、手でバッチを起動してバックアップが取れることを確認後、タスクに登録して自動実行させます。

注意点としては、バックアップを行っている最中に、サーバに致命的なトラブルがあると、サーバのデータが消失した上に、手元のバックアップも不整合が起きてしまいます。
この為、バックアップは2世代以上取る事をお勧めします。

ffftpを使用する場合は、以下の手順で複数世代バックアップを行います。

1.ffftpの設定を2つ作成し、それぞれローカルの初期フォルダを異なるものにします。
2.タスクに登録するバックアップを2つ作り、偶数日と奇数日で使用する設定を変えます。




[Win7] WSHから電源オプションの設定を変える

前回はコマンドラインプログラムであるpowercfg.exeを使用して、電源プランを変更しました。
今回はVBScriptを使用して、WSHから電源プランの列挙・変更を行ってみます。

Set objWMIService = GetObject("WinMgmts:\\.\root\cimv2\power")
 
Set PowerPlans = objWMIService.InstancesOf("Win32_PowerPlan")
 
;-------------------------------
;全ての電源プランを列挙する
;-------------------------------
For Each PowerPlan in PowerPlans
  WScript.StdOut.Write PowerPlan.ElementName
 
  ;-----------------------------------------
  ; 電源プランの名称を表示
  ;-----------------------------------------
  If PowerPlan.IsActive Then
      WScript.StdOut.Write "                 ※現在のプラン"
  End If
  WScript.StdOut.WriteLine ""
 
  ;-----------------------------------------
  ; 変更後プランのオブジェクトだったら保存
  ;-----------------------------------------
  If PowerPlan.ElementName = "省電力" Then
    Set NewPlan = PowerPlan
  End If
Next
 
 
; 新しいプランを省電力にする
NewPlan.Activate()



上記のコードを実行した結果です。
2回目の実行結果を見ると確かにプランが変更されています。

C:\home>cscript test.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
 
マックス・バッテリー・ライフ                 ※現在のプラン
ビデオの再生
バランス
パワー源最適化
高パフォーマンス
マックス・パフォーマンス
省電力
タイマー禁止 (プレゼンテーション)
 
C:\home>cscript test.vbs
Microsoft (R) Windows Script Host Version 5.8
Copyright (C) Microsoft Corporation 1996-2001. All rights reserved.
 
マックス・バッテリー・ライフ
ビデオの再生
バランス
パワー源最適化
高パフォーマンス
マックス・パフォーマンス
省電力                 ※現在のプラン
タイマー禁止 (プレゼンテーション)

[Win7]コマンドラインから電源オプションの設定を変える方法

Windows7やWindows Server2008では、ノートPCやサーバの消費電力を抑えるために電源オプションという機能があります。
この設定は通常、コントロールパネルよりGUIで設定するのですが、powercfg.exeコマンドを使用してコマンドラインから設定を変更する事も可能です。

コマンドは以下の通り。-SETACTIVEオプションの後に、変更後モードのGUIDを指定すればOKです。

powercfg.exe -SETACTIVE 0c0eadf7-9b97-4475-903f-0c488ed5b568




各電源モードのGUIDは、-Lオプションでリスティングされます。
説明文の末尾に”*”印が付いている行が、現在の設定値です。

powercfg.exe  -L
 
既存の電源設定 (* アクティブ)
-----------------------------------
電源設定の GUID: 0c0eadf7-9b97-4475-903f-0c488ed5b568  (マックス・バッテリー・ライフ)
電源設定の GUID: 3558e7e5-fb14-4b08-b301-4f29a70f3e0d  (ビデオの再生)
電源設定の GUID: 381b4222-f694-41f0-9685-ff5bb260df2e  (バランス) *
電源設定の GUID: 458ee30f-987e-4704-b7a7-166cf46c1018  (パワー源最適化)
電源設定の GUID: 8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c  (高パフォーマンス)
電源設定の GUID: 99cb46f8-ccbc-4037-852c-0e05530492c8  (マックス・パフォーマンス)
電源設定の GUID: a1841308-3541-4fab-bc81-f71556f20b4a  (省電力)
電源設定の GUID: fc3dde8b-5703-4a48-8954-d9e2790a83f7  (タイマー禁止 (プレゼンテーション))




/?オプションでヘルプが表示されます。多機能なコマンドなのでヘルプの説明だけでもかなり長いです。

powercfg.exe  /?
 
 
POWERCFG <コマンド ライン オプション>
説明:
  このコマンドライン ツールを使うと、管理者はシステムの電源
  設定を管理できます。
 
パラメーター一覧:
  -LIST, -L   現在のユーザー環境の電源設定をすべて一覧表示します。
 
              使用法: POWERCFG -LIST
 
  -QUERY, -Q  指定された電源設定の内容を表示します。
 
              使用法: POWERCFG -QUERY <SCHEME_GUID> <SUB_GUID>
 
              <SCHEME_GUID>  (オプション) 表示する電源設定の GUID を指定します。                             powercfg -l パラメーターを使用して取得できます。
              <SUB_GUID>     (オプション) 表示するサブグループの GUID を
                             指定します。SCHEME_GUID を指定する必要があります。
 
              SCHEME_GUID および SUB_GUID のどちらも指定されていない場合、
              現在のユーザーのアクティブな電源設定が表示されます。
              SUB_GUID が指定されていない場合、指定された電源設定内の
              すべての設定が表示されます。
 
  -CHANGE, -X 現在の電源設定の設定値を変更します。
 
              使用法: POWERCFG -X <設定> <値>
 
              <設定>      次のオプションのうち 1 つを指定します。
                          -monitor-timeout-ac <分>
                          -monitor-timeout-dc <分>
                          -disk-timeout-ac <分>
                          -disk-timeout-dc <分>
                          -standby-timeout-ac <分>
                          -standby-timeout-dc <分>
                          -hibernate-timeout-ac <分>
                          -hibernate-timeout-dc <分>
 
              例:
                  POWERCFG -Change -monitor-timeout-ac 5
 
              この場合、AC 電源使用時のモニターのアイドル タイムアウト値が
              5 分に設定されます。
 
  -CHANGENAME 電源設定の名前とその説明 (オプション) を
              変更します。
 
              使用法: POWERCFG -CHANGENAME <GUID> <名前> <設定の説明> 
 
              説明を省略した場合は、名前のみが変更されます。
 
  -DUPLICATESCHEME 
              指定された電源設定を複製します。その結果、
              新しい設定を表す GUID が表示されます。
 
              使用法: POWERCFG -DUPLICATESCHEME <GUID> <複製先の GUID>
 
<GUID>  powercfg -l を使用して取得したスキーム GUID を指定します。
 
              <複製先の GUID> を省略した場合、新しい GUID が、
              複製されたスキームに作成されます。
 
  -DELETE, -D 指定された GUID の電源設定を削除します。
 
              使用法: POWERCFG -DELETE <GUID>
 
              <GUID> は LIST パラメーターを使って取得されます。
 
  -DELETESETTING 
              電源設定を削除します。
 
              使用法: POWERCFG -DELETESETTING <SUB_GUID> <SETTING_GUID> 
 
              <SUB_GUID>      サブグループ GUID を指定します。
              <SETTING_GUID>  電源設定 GUID を指定します。
 
  -SETACTIVE, -S 
              指定された電源設定をシステム上でアクティブにします。
 
              使用法 : POWERCFG -SETACTIVE <SCHEME_GUID>
 
              <SCHEME_GUID>  スキーム GUID を指定します。
 
  -GETACTIVESCHEME 
              現在アクティブになっている電源設定を取得します。
 
              使用法: POWERCFG -GETACTIVESCHEME 
 
  -SETACVALUEINDEX
              指定された電源設定に関連付けられている値を設定します
              と関連付ける値を設定します。
 
              使用法: POWERCFG -SETACVALUEINDEX <SCHEME_GUID> <SUB_GUID>
                                               <SETTING_GUID> <SettingIndex>
 
              <SCHEME_GUID>   電源設定の GUID を指定します。
                              これは PowerCfg /L を取得して使用できます。
              <SUB_GUID>      電源設定の GUID のサブグループを指定します。
                              これは "PowerCfg /Q" を使って取得できます。
              <SETTING_GUID>  個々の電源設定の GUID を指定します。
                              これは "PowerCfg /Q" を使って取得できます。
              <SettingIndex>  この電源設定を設定できる
                              値の一覧を指定します。
 
              例:
                  POWERCFG -SetAcValueIndex <GUID> <GUID> <GUID> 5
                  この場合、電源設定の AC 値は、この電源設定に
                  使用できる値の一覧のうち 5 番目のエントリに設定されます。
 
  -SETDCVALUEINDEX 
              指定された電源設定に関連付けられている値を設定します
              と関連付ける値を設定します。
 
              使用法 : POWERCFG -SETDCVALUEINDEX <SCHEME_GUID> <SUB_GUID>
                                               <SETTING_GUID> <SettingIndex>
              <SCHEME_GUID>   電源設定の GUID を指定します。
                              これは PowerCfg /L を使って取得できます。
              <SUB_GUID>      電源設定の GUID のサブグループを指定します。
                              これは "PowerCfg /Q" を使って取得できます。
              <SETTING_GUID>  個々の電源設定の GUID を指定します。
                              これは "PowerCfg /Q" を使って取得できます。
              <SettingIndex>  この電源設定に使用できる
                              設定値の一覧を指定します。
 
              例:
                  POWERCFG -SetDcValueIndex <GUID> <GUID> <GUID> 5
                  この場合、電源設定の DC 値は、この電源設定に
                  使用できる値の一覧のうち 5 番目のエントリに設定されます。
 
  -HIBERNATE, -H
              休止状態機能を有効または無効にします。休止状態のタイムアウトは
              すべてのシステムでサポートされるわけではありません。
 
              使用法: POWERCFG -H <ON|OFF>
                     POWERCFG -H -Size <PercentSize>
              -Size  希望するハイバネーション ファイルのサイズを全メモリに対す
                     る割合で指定します。既定のサイズは 50 未満にはできません。
                     また、休止状態ファイルを自動的に有効にします。
 
  -AVAILABLESLEEPSTATES, -A  
              システムで利用可能なスリープ状態を報告します
              スリープ状態を利用できない理由の報告を試みます。
 
  -DEVICEQUERY
              指定された条件を満たすデバイスの一覧を返します。
 
              使用法 : POWERCFG -DEVICEQUERY <queryflags>
 
              <queryflags>  次の基準のうち 1 つを指定します。
 
              wake_from_S1_supported  浅いスリープ状態の解除を
                                      サポートするデバイスをすべて返します。
              wake_from_S2_supported  深いスリープ状態の解除を
                                      サポートするデバイスをすべて返します。
              wake_from_S3_supported  最深のスリープ状態の解除を 
                                      サポートするデバイスをすべて返します。
              wake_from_any           スリープ状態の解除をサポートする 
                                      デバイスをすべて返します。
              S1_supported            浅いスリープをサポートするデバイスの一覧
                                      を表示します。
              S2_supported            深いスリープをサポートするデバイスの一覧
                                      を表示します。
              S3_supported            最深のスリープをサポートするデバイスの
                                      一覧を表示します。
              S4_supported            システムの休止状態をサポートするデバイス
                                      の一覧を表示します。
              wake_programmable       システムのスリープ状態の解除をユーザーが
                                      構成できるデバイスの一覧を表示します。
              wake_armed              スリープ状態を解除できるように現在
                                      構成されているデバイスの一覧を表示します。
              all_devices             システムにあるデバイスをすべて返します。
              all_devices_verbose     デバイスの詳細な一覧を返します。
              例:
                  POWERCFG -DEVICEQUERY wake_armed
 
  -DEVICEENABLEWAKE
              システムのスリープ状態を解除するデバイスを有効にします。
 
              使用法 : POWERCFG -DEVICEENABLEWAKE <devicename>
 
              <デバイス名>  "PowerCfg -DEVICEQUERY wake_programmable"を使用して
                            取得するデバイスを指定します。
 
              例:
                  POWERCFG -DEVICEENABLEWAKE
                                       "Microsoft USB IntelliMouse Explorer"
 
  -DEVICEDISABLEWAKE
              システムのスリープ状態を解除するデバイスを無効にします
 
              使用法: POWERCFG -DEVICEDISABLEWAKE <devicename>
 
              <デバイス名>  "PowerCfg -DEVICEQUERY wake_armed"を使用して
                            取得するデバイスを指定します。
 
  -IMPORT     指定されたファイルから電源設定をすべてインポートします。
 
              使用法 : POWERCFG -IMPORT <filename> <GUID> 
 
              <filename>  "PowerCfg -EXPORT parameter" を使用して生成された
                          ファイルへの完全修飾パス名を指定します。
              <GUID>      (オプション) 設定は、電源設定に読み込まれ、
                          この GUID で表されます。指定しない場合は、powercfg
                          新しい GUID を生成して使用します。
 
              例:
                  POWERCFG -IMPORT c:\scheme.pow
 
  -EXPORT     指定された GUID で表される電源設定を、指定された 
              ファイルにエクスポートします。
 
              使用法: POWERCFG -EXPORT <filename> <GUID> 
 
              <filename>  宛先ファイルへの完全修飾パスを指定します。
              <GUID>      電源設定 GUID を指定します。次から取得できます。
                          "PowerCfg /L" の使い方
 
              例:
                  POWERCFG -EXPORT c:\scheme.pow
                                   381b4222-f694-41f0-9685-ff5bb260df2e
 
  -LASTWAKE   システムの最後のスリープ状態の解除元に関する情報を
              報告します。
 
  -HELP, -?   コマンドライン パラメーターに関する情報を表示します。
 
  -ALIASES    すべてのエイリアスとそれに対応する GUID を表示します。
              これらのエイリアスはコマンドライン上の GUID の代わりに
              使用できます。
 
  -SETSECURITYDESCRIPTOR
              指定された電源設定または操作に
              関連付けられたセキュリティ記述子を設定します。
 
              使用法 : POWERCFG -SETSECURITYDESCRIPTOR <GUID|ACTION> <SDDL>
 
              <GUID>       電源設定の GUID を指定します。
              <操作>       次の文字列のうちいずれか 1 つを指定できます。
                           ActionSetActive、ActionCreate、ActionDefault
              <SDDL>       有効なセキュリティ記述子文字列を SDDL 形式で指定
                           します。SDDL 文字列の例を確認するには、
                           POWERCFG -GETSECURITYDESCRIPTOR を呼び出します。
 
  -GETSECURITYDESCRIPTOR
              指定された電源設定または操作に 
              関連付けられたセキュリティ記述子を取得します。
 
              使用法: POWERCFG -GETSECURITYDESCRIPTOR <GUID|ACTION> 
              <GUID>       電源設定 GUID を指定します。
              <ACTION>     次のいずれかの文字列を指定します。
                           ActionSetActive, ActionCreate, ActionDefault
 
  -REQUESTS
              アプリケーションとドライバーの電源要求を列挙します。電源要求は、 
              コンピューターが自動的にディスプレイの電源を切ったり、省電力の 
              スリープ モードに切り替わらないようにします。 
 
  -REQUESTSOVERRIDE
              特定のプロセス、サービス、またはドライバーに対する電源要求の優先
              を設定します。パラメーターを指定しないと、現在の電源要求の優先設
              定の一覧が表示されます。 
 
              使用法: POWERCFG -REQUESTSOVERRIDE <呼び出し元の種類> <名前> 
                        <要求> 
              <呼び出し元の種類> 次のいずれかの呼び出し元の種類を指定します:
                               PROCESS、SERVICE、DRIVER。この取得には 
                               POWERCFG -REQUESTS コマンドを使用します。 
              <名前>           呼び出し元の名前を指定します。この名前を返すに 
                               は、POWERCFG -REQUESTS コマンドを呼び出します。
              <要求>           次の電源要求の種類を 1 つ以上指定します:
                               Display、System、Awaymode。
              例:
                  POWERCFG -REQUESTSOVERRIDE PROCESS wmplayer.exe Display System
 
  -ENERGY
              エネルギー効率とバッテリ寿命に関する一般的な問題がないかシステム
              を分析します。ENERGY コマンドはコンピューターがアイドル状態で、開
              いたプログラムやドキュメントがない場合に使用してください。ENERGY
              コマンドにより現在のパスに HTML レポート ファイルが生成されます
              。ENERGY コマンドは、次のパラメーター (省略可) をサポートします:
 
              使用法: POWERCFG -ENERGY [-OUTPUT <ファイル名>] [-XML]
                                       [-DURATION <秒>]
                      POWERCFG -ENERGY -TRACE [-D <ファイル パス>]
                                              [-DURATION <秒>]
              -OUTPUT <ファイル名> ? エネルギー レポート HTML ファイルを保存
                                     するパスとファイル名を指定します。
              -XML                 - レポート ファイルの形式を XML にします。
              -TRACE               - システムの動作を記録し、分析を実行しませ
                                     ん。-D パラメーターが指定されていない場合
                                     トレース ファイルは現在のパスに生成されま
                                     す。
              -D <ファイル パス>     - トレース データを保存するディレクトリを
                                     指定します。-TRACE パラメーターが指定され
                                     ている場合のみ、使用できます。
              -DURATION <秒>       ? 秒数を指定して、システムの動作を監視
                                     します。既定値は 60 秒です。
  -WAKETIMERS
              アクティブなスリープ解除タイマーを列挙します。有効な場合、
              スリープ解除タイマーの期限切れ時に、システムのスリープ/休止状態は
              解除されます。