1

pic18f14k50 コントローラーを搭載した一種のマウスのアナログ信号を読み取ろうとしています。ここに簡単な回路があります: http://dl.dropbox.com/u/14663091/schematiconew.pdf . AN9 回路ポートからアナログ信号を読み取る必要があります。メイン関数はポートから読み取り、しきい値に達すると 30 回点滅します。

 void main(void) {
      InitializeSystem();

      #if defined(USB_INTERRUPT)
         USBDeviceAttach();
     #endif

     while(1) {

             if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1)) continue;

      if(!HIDTxHandleBusy(lastTransmission))
      {
       int readed = myReadADC2(); //Here i tried both myReadADC2() or myReadADC1()
       if(readed>40) { //If read threshold > 40, blink led 30 times
        int i;
        for(i=0; i<30; i++) {
         Delay1KTCYx(0);
         mLED_1_On();
         Delay1KTCYx(0);
         mLED_1_Off();
        }
              }
              lastTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);


     }//end while
 }//end main

AN9 ポートから読み取るには、OpenADC() API メソッドを使用する myReadADC() という 2 つのメソッドを使用しました。

int myReadADC(void) {
   #define ADC_REF_VDD_VDD_X 0b11110011                      
   OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_12_TAD, ADC_CH9 & ADC_INT_OFF, ADC_REF_VDD_VDD_X & ADC_REF_VDD_VSS, 0b00000010); // channel 9
   SetChanADC(ADC_CH9);
   ConvertADC();                 // Start conversion
   while(BusyADC());             // Wait for completion
   return ReadADC();           // Read result
}

ポートからの手動読み取りを実装する myReadADC2()。

int myReadADC2() {

  int iRet;
  OSCCON=0x70;         // Select 16 MHz internal clock
  ANSEL = 0b00000010;  // Set PORT AN9 to analog input
  ANSELH = 0;          // Set other PORTS as Digital I/O
  /* Init ADC */
  ADCON0=0b00100101;   // ADC port channel 9 (AN9), Enable ADC
  ADCON1=0b00000000;   // Use Internal Voltage Reference (Vdd and Vss)
  ADCON2=0b10101011;   // Right justify result, 12 TAD, Select the FRC for 16 MHz
  iRet=100;


  ADCON0bits.GO=1;
  while (ADCON0bits.GO);   // Wait conversion done
  iRet=ADRESL;           // Get the 8 bit LSB result
  iRet += (ADRESH << 8); // Get the 2 bit MSB result
  return iDelay; 

}

どちらの場合も機能しません。(アナログ信号を送信する) ポート AN9 に触れますが、高いしきい値 (~50) を設定すると、LED は点滅しません。低いしきい値 (~0) では、PIC に電力を供給するとすぐに点滅します。多分私は間違ったポートを使用していますか?私は実際に AN9 を読み取りポートとして渡していますか? それとも、しきい値が間違っているのでしょうか? どうすれば正しい値を見つけることができますか? ありがとうございました

MPLAB C18 Api http://dl.dropbox.com/u/14663091/API%20microchip%20C18.pdf .

4

1 に答える 1

1

関数 myReadADC2() について: ANSELH のビット 1 で RC7/AN9 が構成されているため、ANSEL 構成と ANSELH 構成を切り替える必要があります。また、私をパラノイアと呼んでください。

iRet += (ADRESH << 8);

私は常に、最初に一時変数を保存するか、シフトアップする前に値 ADRESH を明示的にキャストすることを好みます。

iRet += (((UINT) ADRESH) << 8);

そうすれば、シフトアップ時にビットが失われないことが確実にわかります。

関数 myReadADC() について: OpenADC() は 2 つのパラメーターしか取りません。3 番目のパラメーター フィールドのビットフィールドは、アナログ イネーブル (ADRESH/ADRES) 用だと思います。これは SetChanADC() によって処理されると想定していますが、ADRESH/ADRES を手動で設定する必要がある場合があります。デバッガーでブレークポイントを設定し、構成が完了したら停止して、レジスターが適切に設定されていることを確認すると役立つ場合があります。

于 2010-12-14T01:32:17.883 に答える