複数用ボリューム入力モジュール
ADsarvo2FNC
/*
レジスタAD.ADDRAも引数に加える
AD.ADDRAはヘッダで unsigned int で定義されている
*/
#include<3664.h>
#include
void ini_AD(void){
AD.ADCSR.BYTE = 0x39; /* 0011 1000*/
/* A/D変換開始 */
/* スキャンモード */
/* 高速変換 */
/* AN0 AN1 */
}
int AD_Vlm(int div,volatile unsigned int *ADDRX){
/**************************************
引数 :・ div (VLキザミ値)
4,8,16,32,64,128,256 で指定
・ *ADDRX
&AD.ADDRA~
返値 : 0~div を返す
VLボリュームの回転に応じて
**************************************/
int i;
switch(div){
case 4: i=14; break;
case 8: i=13; break;
case 16: i=12; break;
case 32: i=11; break;
case 64: i=10; break;
case 128: i=9 ; break;
case 256: i=8; break;
default: i=14;
}
while(AD.ADCSR.BIT.ADF==0); // 変換結果がでるまで待つ
// return( (int)( AD.ADDRA>> i ) ); // ビットシフト(i桁ずらす)
return( (int)( *ADDRX>> i ) ); // ビットシフト(i桁ずらす)
}
void main()
{
int ledpA=0;
int ledpB=0;
LCD_init( 16 ); //LCD初期化
ini_AD(); //AD変換初期化
while(1){
/*** AD変換関数 ***/
ledpA = AD_Vlm( 32 ,&AD.ADDRA) ;
ledpB = AD_Vlm( 256 ,&AD.ADDRB) ;
// ledp = AD_Vlm( 64) ;
/*** AD変換関数 ***/
//LCD表示 ledpA
LCD_locate(1,2);
LCD_dataout(ledpA );
//LCD表示 ledpB
LCD_locate(2,2);
LCD_dataout(ledpB );
}
}
少しだけ変更。AD変換設定を AN0 , AN1 とか複数の入力にできるよう変更します。
関数内で変換結果が出るAD.ADDRAを受けて、それを返値にしていたのを変更します。
最初のものではAD入力を増やしたり減したりする場合 毎回、 AD.ADDRAの部分を書き換えることになるので、
引数を加えもっと関数らしく、変換結果が出るAD.ADDRA部分をアドレス渡しにしました。
int AD_Vlm (int div,volatile unsigned int *ADDRX)
--(AD.ADDRA部分はヘッダで unsigned int で定義されています)
入力したいAD入力を
ledpB = AD_Vlm( 256 , &AD.ADDRA)
このようにアドレスで渡します。渡されたAD入力が数値になって返値となり、表示される。
サーボ入力ブロックもこのようにアドレス渡しにして同様に変更できます。
実行結果
ボリューム1をAN0 、 ボリューム2をAN1 につないでおきます。
AN0 の変換数値が 1行目に
AN1 の変換数値が 2行目に 表示されます
まとめ
ボリュームAD変換関数
- ini_AD() 初期化関数
-
スキャンモード
高速変換
AN0 - AD_Vlm( div ) ボリュームAD変換関数
-
<機能>
入力動作 : ボリュームの回転
出力 : ボリュームの回転に応じた出力値
調節 : 引数divで出力数値の範囲を変更できる
7通りの出力範囲 設定 | |||||||
引数div | 4 | 8 | 16 | 32 | 64 | 128 | 256 |
出力値 | 0~3 | 0~7 | 0~15 | 0~31 | 0~63 | 0~127 | 0~255 |
H8の市販の書籍に、同様のモジュール化を解説した書籍もありますが、本記事群の内容は、それ以前に公開したもの。モジュール,汎化は大規模開発では取り立てて珍しい方法でもありませんが、
その書籍の内容をここで同じように解説したものではないこととは、ここに記しておきます
(6月/2015)
- twtter
- google+
- hatena