複数用ボリューム入力

ブロックとして数値データを受けてラジコンサーボが動作するようなラジコンサーボ用ブロックのプログラムを作ります。


関数化の方法などについて


複数用ボリューム入力モジュール

 

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変換関数

  1. ini_AD() 初期化関数
  2. スキャンモード
    高速変換
    AN0

  3. AD_Vlm( div ) ボリュームAD変換関数
  4. <機能>
    入力動作 :  ボリュームの回転
    出力    :  ボリュームの回転に応じた出力値
    調節    :  引数divで出力数値の範囲を変更できる

 

7通りの出力範囲 設定
引数div 16 32 64 128 256
出力値 0~3 0~7 0~15 0~31 0~63 0~127 0~255

 


H8の市販の書籍に、同様のモジュール化を解説した書籍もありますが、本記事群の内容は、それ以前に公開したもの。モジュール,汎化は大規模開発では取り立てて珍しい方法でもありませんが、

その書籍の内容をここで同じように解説したものではないこととは、ここに記しておきます
(6月/2015)


 

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena