FrontPage

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

今回は、大野さんの「アナログ・マイコン!?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出力ディジタル出力

大野さんの本では、

を使っているそうです。

ピンの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

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

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

コメント

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

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


(Input image string)

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

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc