FrontPage

2013/02/16からのアクセス回数 4126

今回は、大野さんの「アナログ・マイコン!?PSoCに目覚める本」の6章に挑戦します。

プログラミングだけでポートを操作

最初は、ピンの設定とプログラムだけでIOを制御するじゃんけんゲームが紹介されています。

回路は、以下の様になっています。

fig6_6.png

ブレッドボードで組んだ回路は以下の様になりました。

デジタルの回路では、10KΩ, 4.7KΩ, 1KΩ, 470Ωの4種類を用意しておけば、実験ができます。 今回の回路では、330Ωとありますが、ここでは470Ωを代わりに使っています。

B6_1.png

IOピンの設定と制御

IOポートには、以下の設定が可能ですが、

名称種別概要
Hight Z入力ディジタル入力
High Z Analog入力アナログ入力
Open Drain Hight出力ハイ側オープン・ドレイン
Open Drain Low出力ロー側オープン・ドレイン
Pull Down出力プルアップ&ロー側オープン・ドレイン
Pull Up出力プルアップ&ハイ側オープン・ドレイン
Strong出力ディジタル出力
Strong Slow出力ディジタル出力

大野さんの本では、

  • 出力: Strong
  • 入力: High Z
  • スイッチ: Pull Up

を使っているそうです。

ピンのIO設定は、縦に隠れているPinout-プロジェクト名のタグをクリックすると表示されます。

今回は、P0[7], P0[5], P[3]のLED制御のピンをStrong出力で初期値0とします。 P2[1]をプルアップ出力で初期値1にします。

L6_1_pin_setting.png

main関数の定義

本題のmain関数ですが、ポートのデータレジスタは、PRTnDRでnにポート番号を指定します。 6章レッスン1では、スイッチは、P2[1]なので、PRT2DRの2bit目の値をチェックするため、0x2とのアンドを取ります。 スイッチが押されるとP2[1]が0となるので、それまで待つ場合には、

while ((PRT2DR & 0x2) != 0) continue;

とします。

また、LED点灯するのは、P0[7], P0[5], P0[3]なので、PRT0DRに0x8(4bit目)をセットして順番に2ビットシフトすることで、 P0[3], P0[5], P0[7]へと点灯するLEDをシフトさせています。

main関数は、以下の様になっています。

void main(void)
{
	// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
	// Insert your main routine code here.
	BYTE	i = 0x8;
	WORD	dly;
	for (;;) {
		while((PRT2DR & 0x2) != 0)continue;			// スイッチが押されるまで待つ
		for (dly = 0; dly < 500; dly++)continue;	// ディレイ10msくらい
		while ((PRT2DR & 0x2) == 0) {				// スイッチが押されている間、パラパラ点灯
			PRT0DR = i;
			i = i << 2;
			if (i == 0)	i = 0x8;
			for (dly = 0; dly < 1000; dly++)continue;// ディレイ20msくらい
		}
		for (dly = 0; dly < 500; dly++)continue;	// ディレイ10msくらい
	}
}

キャラクタLCDに文字を表示

次のレッスン6_2は、「キャラクタLCDに文字を表示」でした。

通常のLCDをそのままブレッドボードで使うと配線がめんどうなので、 後閑さんの「C言語によるPICプログラミング入門」で紹介されていた3行表示のLCDを用意しておくと便利です。 *1

LCD.png

この液晶は、DB7, DB6, DB5, DB4の4bitのデータバスでも表示ができるので、電子工作でよく使われます。

3LineLCD-sch.png

コネクターの配線は、以下の様にしています。

  • 1(白)5V
  • 2 DB7
  • 3 DB6
  • 4 DB5
  • 5 DB4
  • 6 E
  • 7 RS
  • 8, 9 は未接続
  • 10 GND

PSoCとLCDの接続以下の様にします。

fig6_7.png

モジュールの配置

Misc DigitalからLCDを配置します。 LCDモジュールはディジタルブロックを使用しないのでブロック図にはでませんが、Parameterタブが表示されいますので、 以下の様にPort2を出力ポートに設定します。

L6_2_Param_Setting.png

main関数

main関数で文字列を出力します。

void main(void)
{
	// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
	// Insert your main routine code here.
	char	str[] = "Welcome";
	int	i = 0x2011;	
	
	LCD_1_Start();
	LCD_1_Position(0, 4);
	LCD_1_PrString(str);			// RAM文字列表示
	LCD_1_Position(1, 0);
	LCD_1_PrCString("PSoC World");		// ROM文字列PSoC Worldを表示
	LCD_1_Position(1, 11);
	LCD_1_PrHexInt(i);			// 2バイト16進数を表示
}

実行結果

PSoCにプログラムを書き込み、電源を入れると以下の様に表示されました。

B6_2.png

割り込みを使う

6章の最後は、関門の割り込みでです。

ブレッドボードは、レッスン4_1を使用します。 Counter8は、4kHzで動作するように設定し、割り込みで0と1を交互に出力することで2kHzの 周波数を出力するプログラムを作成します。

ユーザモジュールの配置

デジタルブロックにCounter8を配置します。今回は割り込みを使うので、配線はしません。

L6_3D_Block.png

P0[2]にAGNDを出力するようにセットします。

L6_3A_Block.png

グローバルセッティングは、VC2が400kHzとなるようにVC1=6, VC2=10にセットします。

L6_3_Global_Setting.png

Counter8の設定は、Counter8のTerminal Countに99*2とし、4kHzになるように設定します。

L6_3_Counter8_param.png

P0[0]の出力をStrongに変更します。

L6_3_pin_setting.png

Generate Configurationのメニューを実行して、Counter8のアセンブラコードが作成されます。

L6_3_Workspace.png

Counter8_1INT.asmの74に以下のようにカスタムコード(Cの関数へのジャンプ命令)を書きます。

   ;---------------------------------------------------
   ; Insert your custom assembly code above this banner
   ;---------------------------------------------------
   ljmp _Counter8_1_Int

Build->Compileを選択してCounter8_1INT.asmをコンパイルします。

Cでの割り込み関数の定義

Cで割り込み関数を定義する場合、#pragma宣言で割り込み関数であることを明記します。 関数名には、Counter8_1INT.asmで宣言した関数の先頭の_を除いた名前を指定します。

#pragma interrupt_handler Counter8_1_Int	// 割り込み関数宣言
void Counter8_1_Int(void) {					// 割り込み関数本体
	PRT0DR ^= 0x1;			// ビット0を反転
}

main関数の定義は、以下の様にします。

void main(void)
{
	// M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
	// Insert your main routine code here.
	Counter8_1_Start();
	Counter8_1_EnableInt();	// Counter8_1を割り込み許可する
	M8C_EnableGInt;			// PSoCの割り込みを許可するマクロ
	while(1) continue;
}

動作チェック

プログラムを書き込み、動かすとピーとなります。 P0[2]とP0[0]の周波数をテスターで調べて1.990と2kHzに近い値となっており、 無事割り込みが働いていることを確認することができました。

L6_3_running.png

コメント

選択肢 投票
おもしろかった 3  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)


*1 単にキャラクターLCDにコントラスト用の半固定抵抗を付け、コネクターケーブルを付けてだけです
*2 100-1

添付ファイル: fileL6_3_running.png 468件 [詳細] fileL6_3_pin_setting.png 440件 [詳細] fileL6_3_Workspace.png 448件 [詳細] fileL6_3D_Block.png 481件 [詳細] fileL6_3A_Block.png 498件 [詳細] fileL6_3_Global_Setting.png 467件 [詳細] fileL6_3_Counter8_param.png 469件 [詳細] fileL6_2_Param_Setting.png 436件 [詳細] fileB6_2.png 431件 [詳細] filefig6_7.png 477件 [詳細] fileLCD.png 454件 [詳細] fileL6_1_pin_setting.png 461件 [詳細] filefig6_6.png 474件 [詳細] fileB6_1.png 477件 [詳細] file3LineLCD-sch.png 451件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-11-14 (土) 13:37:28 (708d)
SmartDoc