PSoCを使用したラジコン・サーボのプログラムです。

シリアル通信速度38400bps割込み処理、16ビットPWMが6個、9ビットD/Aが4チャンネル出力でメインプログラムは受信割込み処理だけです。

PSoCでなければ出来ない事です。

参考になればプログラムの一部です。

(訳が解らんかもしれませんが、容赦のほど)

 

//-----------------------------------------------------------------------------

void rx_chck(void)

{

unsigned char c;

     bCrStatus = FALSE;            //文字列受信フラグクリア

     t = 0;                        //読込みポインタ初期化

     c = buffer[0];                //先頭の文字を記憶 軸情報a,b,c,d,e,fが入る

     buffer[0] = 0;                //軸文字を消去

     i = atoi(buffer);             //残っている数値文字列を数値に変換

         switch(c){                //軸をチェック

            case a:             //1               //a軸の処理

                pos1 = i ;                        //軸データを記憶

                PWM16_1_Stop();

                PWM16_1_WritePulseWidth(pos1*3); //パルス幅のデータを書込み

                PWM16_1_Start();

                DAC9_1_WriteStall(pos1*2);        //DACにもパルス幅に対応したデータを書き込む

                break;

            case b:             //2

                 pos2 = i ;

                 PWM16_2_Stop();

                 PWM16_2_WritePulseWidth(pos2*3);

                 PWM16_2_Start();

                 DAC9_2_WriteStall(pos2*2);        // update DAC2

                 break;

            case c:             //3

                 pos3 = i ;

                 PWM16_3_Stop();

                 PWM16_3_WritePulseWidth(pos3*3);

                 PWM16_3_Start();

                 DAC9_3_WriteStall(pos3*2);         // update DAC3

                 break;

            case d:             //4

                 pos4 = i ;

                 PWM16_4_Stop();

                 PWM16_4_WritePulseWidth(pos4*3);

                 PWM16_4_Start();

                 DAC9_4_WriteStall(pos4*2);         // update DAC4

                 break;

            case e:             //5

                 pos5 = i ;

                 PWM16_5_Stop();

                 PWM16_5_WritePulseWidth(pos5*3);

                 PWM16_5_Start();

                 break;

            case f:             //6

                 pos6 = i ;

                 PWM16_6_Stop();

                 PWM16_6_WritePulseWidth(pos6*3);

                 PWM16_6_Start();

                 break;

            case *:         //1-8

                 pos1 = pos2 = pos3 = pos4 = pos5 = pos6 = i ;

                 break;

            }

}

//-----------------------------------------------------------------------------

//      MAIN proguram

void main()

{

 PRT1DM0 = 0xff;                // P1[0..7] storong out

 PRT1DM1 = 0x00;

 PRT1DM2 = 0x00;

 

 RX8_1_Start(RX8_1_PARITY_NONE);        //シリアル初期化

 RX8_1_EnableInt();

 TX8_1_Start(TX8_1_PARITY_NONE);

 PWM8_1_Start();

 M8C_EnableGInt;

 TxString(theStr1) ;            //Opning Mes.

 

 DAC9_1_Start(DAC9_1_FULLPOWER); // power up the DAC1

 DAC9_2_Start(DAC9_2_FULLPOWER); // power up the DAC2

 DAC9_3_Start(DAC9_3_FULLPOWER); // power up the DAC3

 DAC9_4_Start(DAC9_4_FULLPOWER); // power up the DAC4

 

 PWM16_1_Start();

 PWM16_2_Start();

 PWM16_3_Start();

 PWM16_4_Start();

 PWM16_5_Start();

 PWM16_6_Start();

 

// --- MAIN LOOP ---

 while (1){

        if(     bCrStatus == TRUE){    // シリアル文字列受信チェック ?

                rx_chck();                // 受信処理

        }

                                            //メインループでは何も処理していない

 }

}