3

2 つの 8 ビット数値を unsigned int に結合しようとしていますが、使用する型キャストに関係なく、結果は符号付き数値のままです。このコードは、フリースケール マイクロ プロセッサ MC9S08LH64 用の CodeWarrior 10.1 を使用してコンパイルされています。

私が試したことはうまくいきませんでした.2つの8ビットの数値をシフトして追加し、すべてのステップでそれらをunsigned intにキャストします。- 2 つの 8 ビット型キャストと結果の数値を unsigned int に結合する union/struct。- unsigned int ポインターを使用する (以下のコード)

unsigned int acquire_sensor_voltage_internal_adc()
{ //this is internal ADC
     unsigned int result;
     unsigned int* data_ptr;
     char print_buffer [50];
     int_convert cvt;
    //internal adc collecting counts of input voltage
    //______________________________________________

    //writing to ADCSC1A initiate the conversion sequence
    ADCSC1A= 0x09;
    while(!ADCSC1A_COCOA){}

    cvt.parts.p0 = ADCRHA;
    cvt.parts.p1 = ADCRLA;
    data_ptr = &cvt.int_number;
    result = (unsigned int)*data_ptr;

    sprintf(print_buffer,"here!!!>>>>>>>%d\r\n",result);
    serial_sendString(print_buffer,strlen(print_buffer));
    //_______________________________________________
    return (unsigned int) result;
}

//definition of int_convert from.h file
typedef union{
unsigned int int_number;
struct{
    unsigned char p0;
    unsigned char p1;
}parts;
}int_convert;
4

4 に答える 4

3

あなたは試すことができます:

result = ((unsigned)ADCRHA) << 8 | (unsigned)ADCRHB;

そして、%u代わりに正しいフォーマット指定子を使用して%dください。

于 2012-08-16T19:02:58.617 に答える
0

符号なしを表示したい場合は、符号なし形式を使用してその値を出力する必要があります。%dそのための正しい形式ではありません。を使用する%uと、 と表示されunsignedます。

于 2012-08-16T19:06:46.250 に答える
0

の形式をresult使用しているため、符号付き整数として出力しています。符号なし整数を示すために使用します (または、16 進数の出力が必要な場合)。%dprintf%u%x

sprintf(print_buffer, "here!!!>>>>>>>%u\r\n", result);

ところで、2 バイトを単一のunsigned int. そうすれば、コードはunsigned2 バイトを超える他のコンパイラに移植しやすくなります。Land Hin ADCRLAandADCRHAが「低」と「高」を意味すると仮定すると、次のようになります。

result = (ADCRHA << 8) & ADCRLA;
于 2012-08-16T19:07:50.940 に答える
0

物事を過度に複雑にする必要はありません。これは、どの HC08 でも機能します。

unsigned int ADC_result = *(unsigned int*) &ADCRHA;

HC08 アーキテクチャは、ADC への 2 つの読み取りが同期していることを保証し、内部ハードウェア バッファーを使用して、上位バイトが読み取られるとすぐに下位バイトを保存します。

于 2012-08-17T06:40:38.727 に答える