/**    TEST 02_2  完成
* PIC 12F683 使用
* RS-232Cをsoft UARTで使う。
* AD変換を使ってアナログデータを取り込む  (AN0〜AN3)
* 作成開始 2008/4/1 --> 2008/4/3
*
* PIN 1 : +5V  (VDD)
* PIN 2 : GP5       データ出力
* PIN 3 : GP4 アナログ入力3 AN3
* PIN 4 : GP3       データ入力
* PIN 5 : GP2 アナログ入力2 AN2
* PIN 6 : GP1 アナログ入力1 AN1
* PIN 7 : GP0 アナログ入力0 AN0
* PIN 8 : GND
*
*
*Clock: 8.0MHz 内蔵発振器使用
*Device Flags:
* _CP_OFF  _MCLRE_OFF _PWRTE_ON _WDT_OFF _INTRC_OSC_NOCLKOUT
*
* MikroC v8.1.0.0
*/

    extern void crlf() ; // CR+LF 関数を宣言


void main() {
    //使用変数の定義

             int temp;
    unsigned short ro = 0; // RS232C input-data
    unsigned short i=0 ;
    unsigned short j=0 ;
    unsigned short *er ; // RS232C read error pointer
    char txt[7] ;       //  IntToStr 用のバッファー
    char data  ;   //  RS232C input-data

    //マイコンの初期化
    //内臓クロック8MHzに設定
    OSCCON.IRCF2=1;
    OSCCON.IRCF1=1;
    OSCCON.IRCF0=1;

    //A/D変換clock設定 0.125us*16倍=2.0us
    ANSEL.ADCS2=1;
    ANSEL.ADCS1=0;
    ANSEL.ADCS0=1;

    // A/D利用ピンの設定 // ANALOG=1, DIGITAL=0 //0
    ANSEL.ANS3 = 1; //AN3(GP4)をアナログ使用
    ANSEL.ANS2 = 1; //AN2(GP2)をアナログ使用
    ANSEL.ANS1 = 1; //AN1(GP1)をアナログ使用
    ANSEL.ANS0 = 1; //AN0(GP0)をアナログ使用

    GPIO = 0b00000000; //GPIOの中身をきれいにする
    // 参考 TRISIO = 0b00010000; //GP4を1:入力、他5個を0:出力設定
    TRISIO = 0b00011111; //GP5を0:出力に、他5個を1:入力に設定

    //AD変換の値を、右そろえか、左そろえか決める
    ADCON0.ADFM=1;  // 右そろえ


    //マイコンの初期化終わり

    er = &ro ; // pointer er に roのアドレスを与える

    // RS232C Initialize  8bit non-parity  9600 baud rate
    //void Soft_Uart_Init(unsigned short port, unsigned short rx inport , unsigned short tx outport, unsigned short baud_rate, unsigned short inverted);
    Soft_Uart_Init(GPIO, 3, 5,9600,0) ;

    do {
       do {
          data = Soft_Uart_Read(er) ; // Receive data
       }  while (*er) ;

       //   Soft_Uart_Write(data) ;     //  send INPUT data via UART
       //   crlf() ;  // send CR+LF

        //アナログデータの取得
        //10bit(0~1023)

          switch ( data ) {
              case '0' :{
                  temp = ADC_Read( ANS0 );      //ANS0 アナログ値を読む
                  IntToStr(temp,txt);         // 数字を文字に変換

                  for ( i=0 ; i<7 ; i++ ) {
                      Soft_Uart_Write( txt[i] ) ; //  Send アナログ値 via UART
                   //   Soft_Uart_Write( ' ' ) ; //  ブランク
                  }
                  break;
              }

              case '1' : {
                  temp = ADC_Read( ANS1 );      //ANS1アナログ値を読む
                  IntToStr(temp,txt);         // 数字を文字に変換

                  for ( i=0 ; i<7 ; i++ ) {
                      Soft_Uart_Write( txt[i] ) ; //  Send アナログ値 via UART
                   //   Soft_Uart_Write( ' ' ) ; //  ブランク
                  }
                  break;
              }
              
              case '2' : {
                  temp = ADC_Read( ANS2 );      //ANS2 アナログ値を読む
                  IntToStr(temp,txt);         // 数字を文字に変換

                  for ( i=0 ; i<7 ; i++ ) {
                      Soft_Uart_Write( txt[i] ) ; //  Send アナログ値 via UART
                   //   Soft_Uart_Write( ' ' ) ; //  ブランク
                  }
                  break ;
              }

              case '3' : {
                  temp = ADC_Read( ANS3 );      //ANS3 アナログ値を読む
                  IntToStr(temp,txt);         // 数字を文字に変換

                  for ( i=0 ; i<7 ; i++ ) {
                      Soft_Uart_Write( txt[i] ) ; //  Send アナログ値 via UART
                   //   Soft_Uart_Write( ' ' ) ; //  ブランク
                  }
                  break ;
              }

              default : {
                      Soft_Uart_Write( 'E' ) ; //  Send error  via UART
              }
          }

            crlf() ;  //  send CR+LF


    }  while (1) ;

}


//  CR+LF 関数
void crlf() {
          Soft_Uart_Write(0x0D) ;   //  Send CR CODE  via UART
'          Soft_Uart_Write(0x0A) ;   //  Send LF CODE  via UART
}