2017-10-23 34 views
2

PIC16LF1554を使用してI2Cを通じてBQ24259と通信しようとしています。デバイスの7番目のレジスタには、バッテリをオフにするためのビットがあります。 MplabのMCCを使用してI2C設定を構成しました。ヘッダーファイルのサンプルコードを使用して、私は同様の機能を書いた。MPLABのMCCを使用してI2CとADCを構成する

は、ここでは、コード

#define RETRY_MAX  100 
    #define ON    0x4B //register 7 toggle 5th bit to turn ON/OFF 
    #define OFF    0x6B 
    I2C_MESSAGE_STATUS status; 

    uint16_t  timeOut; 
    uint8_t   writeBuffer[1];    // writeBuffer[0] = 07, writeBuffer[1] = data 01001011b(on) 01101011b(off) 
    uint8_t   stat; 
    uint16_t  address = (0x6B/2) ;   //Bit shifting to the write, and having '0' for write opertaoin, at MSB 

uint8_t bat_fet(uint8_t val){ 
    writeBuffer[0] = 7;      //slave's seventh register 
    writeBuffer[1] = val; 
    timeOut=0; 
    while(status != I2C_MESSAGE_FAIL){ 
     I2C_MasterWrite(writeBuffer,  // address of data to be sent 
         2,     // number of data bytes 
         address,   // address of the peripheral 
         &status);   // address of status register 

     while(status == I2C_MESSAGE_PENDING); 

     if(status == I2C_MESSAGE_COMPLETE){ 
      return 1; 
      break; 
     } 
     if(timeOut == RETRY_MAX){ 
      return 0; 

      break; 
     } 
     else 
      timeOut++; 
    } 
    if(status == I2C_MESSAGE_FAIL) 
     return 0; 

} 

が、関連の抜粋であるその、何も起こらない、時々コントローラだけでフリーズする、主にそれが動作し続けて働いていません。私は未使用のIOピンにLEDを接続し、関数が1を返すたびにオンになるようにプログラムし、それがオンになりました。しかし、バッテリーはオンのままです。

同様に、私はバッテリー電圧をチェックするためにPICのADC 1を使用しようとしています、ここ

コードは、

uint16_t check_bat_voltage(){ 

    uint16_t bat_v; 

    ADC1_StartConversion(01011); //i am using Channel AN11, but no matter what variation of channel and AN11 i passed, it just wouldn't recognize. so i just pass the 5 bit values of the ADCON1 register. 

    while(ADC1_IsConversionDone()); 

    bat_v = ADC1_GetConversionResult(); 

//digital value = [analog voltage/(vref+ - vref-)] * 1024 
//analog value minimum = 2.5/2, voltage divider network 
//vref+ 5 
//vref- 0 
// 1.25/5 * 1024 = 256 
    return bat_v; 
} 

ですが、再び何も起こりません。 誰でもレビューしていただけますか?私はちょうど立ち往生しています。ありがとう。

MCCのスクリーンショットを添付することもできますが、周辺機器を正しく設定していない可能性があります。

P.S.私はmain()の両方のモジュールを初期化します。

+0

adcが動作していますが、値が正しく計算されませんでした。私の悪い。 – aamir

答えて

0

私はあなたの問題は、あなたのループの前にI2C_MESSAGE_FAIL以外にstatusを初期化するために忘れていることであると信じています(私はあなたのグローバルstatがタイプミスであることを仮定している - それはstatusをする必要があります)。

変数が__attribute__((persistent))(XC16コンパイラ - XC8についてはわかりません)を使用して永続性が宣言されていない限り、スタートアップコードはすべてのグローバル変数をゼロに初期化します。私は定数I2C_MESSAGE_FAILがゼロでないと推測しているので、ループが実行されないことを意味します。

コンパイラは、変数を初期化する前に変数の使用に関する警告を表示した可能性があります。

代わりにdo {} whileループを使用してみてください。

+0

変数の命名については私は創造的ではありません。 statusとstatは異なる変数です。ステータスをI2C_MESSAGE_PENDINGに初期化しましたが、何も起こりません。 – aamir

+0

ああ、私は 'status'の宣言を見ました。初期化が行われたので、おそらく問題はI2Cポートの設定です。私はこの特定のMPUに精通していません。複数のI2C周辺機器を備えていますか? PPC(プログラマブルポート構成)を使用していますか? IMHOでは、未処理のポートの読み書きを書き込む作業がハードウェアをよりよく理解できるため、缶詰のルーチンを使用しないと便利です。 – EBlake

0

あなたの宣言に誤字がありますか?変更してみてください:

uint8_t writeBuffer[1]; 

uint8_t writeBuffer[2]; 

にSCL、SDAラインをスコープとLEDがオンになると、実際に送られているものをチェック勧め。

関連する問題