トップページ > dsPIC入門 > テストプログラム

LEDが流れるプログラムを書く

TeraPadをダウンロード

便利なエディタのTera Padをインストールしておきます。
絶対必要というわけではありません。メモ帳でもプログラムは書けます。

全ソースコード


//********************************************************************
//あまり深く考えないでナイトライダー @dsPIC30F4012
//********************************************************************




//********************************************************************
//ヘッダファイルをインクルード
#include "p30f4012.h"



//********************************************************************
//コンフィギュレーション・ワードの設定

_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);



//********************************************************************
//メイン関数

int main(void)
{

 //===================================================================
 //変数を定義

 char a=0;
 int i=0;
 int j=0;
 int k=0;

 //===================================================================
 //入出力ポートの設定、初期化

 TRISB = 0x00;
 TRISE = 0x00;
 PORTB = 0x00;
 PORTE = 0x00;	

 //===================================================================
 //whileで回します。

 while(1)
 {

  a = 0x01;	

  for(k=0;k<5;k++)
  {
  
   //ポートBに出力
   PORTB = a;

   //=================================================================
   //時間稼ぎのためにfor文で回します。
   for(i = 0;i<10000;i++)
   {
    for(j=0;j<10;j++){}
   }
   //=================================================================
   
    //1つシフト
    a = a<<1; 
  }

  //なぜかポートBは6bitしかないので、ポートEも使います。
  PORTB = 0x00;
  PORTE = 0x01;

  //=================================================================
  //例のごとく、時間稼ぎ。
  for(i = 0;i<10000;i++)
  {
   for(j=0;j<10;j++){}
  }
  //=================================================================



  PORTE = 0x02;
  
  //=================================================================
  //時間稼ぎ
  for(i = 0;i<10000;i++)
  {
   for(j=0;j<10;j++){}
  }
  //=================================================================

  //消しとく。
  PORTE = 0x00;

 }
}

//********************************************************************

ヘッダファイル

#include "p30f4012.h"

この記述によって、ソースコード中で30F4012の内部レジスタ等をそのまま書いても、 コンパイルされる際にdsPIC内の絶対アドレスに変換されます。でも、シリアル通信モジュール あたりにバグがあるとか、ないとか…。

コンフィギュレーション

_FOSC(CSW_FSCM_OFF & XT_PLL8);
_FWDT(WDT_OFF);
_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);
_FGS(CODE_PROT_OFF);

“コンフィギュレーション・ワード”は、dsPIC内のハードウェア的というか、動作の根本に関連する設定をするためのものです。 特に、一番最初はウォッチドッグタイマの設定なんかでハマった覚えがあります…。


_FOSC(CSW_FSCM_OFF & XT_PLL8);

クロック発振回路の設定です。要約すると、
クロック停止の際の処理→監視もしないし、内部の別クロック源に切り替えもしない
クロック発振のタイプ→外付け発振子による発振で、周波数は8倍


_FWDT(WDT_OFF);

ウォッチドッグタイマの設定です。特にシステムの監視を行わない場合は、コレをOFFにしておかないと勝手にリセット がかかってしまってプログラムが進みません…。このコンフィギュレーションワードは、
ウォッチドッグタイマの機能→無効


_FBORPOR(PBOR_ON & BORV_20 & PWRT_64 & MCLR_EN);

いろいろ内容が詰まっているところです。主に“電源まわり”で統一されている感じがしますが…。要約すると、
電源ONおよび電源OFFの際の動作→電源ON直後に自動でリセット。電源OFF直前に自動で停止する。
電源OFFを検知する電圧→2.0V
電源ON直後のリセットパルス幅→64msec
MCLRピン→有効


_FGS(CODE_PROT_OFF);

dsPICに書き込んだプログラムを、他の開発者に読み出されないようにするための設定です。(コードプロテクト) また、読み出しだけではなく書き込みもプロテクトすることができます。今回のコンフィグは…
コードプロテクト→読み出し・書き込み共にOFF。(プロテクト無し)

入出力ポートの設定

TRISB = 0x00;
  TRISE = 0x00;

入出力ポートの入力・出力は“TRISxレジスタ”(xの部分にはポート名のアルファベットが入ります)を使います。 このレジスタに直接値を書き込むことで入力or出力を決定します。入力なら“1”、出力なら“0”を各ビットごとに 指定します。 今回は、ポートBとポートEのすべてのピンを出力として設定しています。

あとは、かなりテキトーです

while(1)ループとか、for文でタイマーとか、残念ですね。
次はタイマーモジュールを使いましょう。


 

projectがあるディレクトリに保存

こうしてソースコードを書いたら、C言語ファイルとして保存しょう。名前は“test.c”など。
メモ帳などで編集している場合は拡張子が勝手に.txtになってしまう(気がします)。 テキトーにフォルダを 開いて、[ツール]→[フォルダ オプション]にて、“登録されている拡張子は表示しない”のチェックを OFFにして、拡張子が表示されるようにしておくとラクです。

保存先のディレクトリは、前回projectを作った場所と同じにすると便利です。 今の場合なら、Cドライブ内の“dsPIC”ディレクトリになります。




前へ  次へ