2

char変数をUnsignedintに変換しようとしています。私のコードは

char spi(char data) 
{ 
    //Start transmision 
    SPDR = data; 
    //Wait for transmision complete 
    while(!(SPSR & 0x80)); 
    return SPDR; 
} 

unsigned int ReadAd(void) 
{ 
    unsigned int data; 

    ChipSelectAd(1); 
    //Read data 
    CheckStatus();                                            
    spi(0x58);                                                
    data = (spi(0xFF)<< 8);    
    data |= spi(0xFF);         

    return data; 
} 

実際、私の問題は、spi関数が8ビットのcharを返すため、上記のコードが8ビットのchar変数を左にシフトし、それを16ビットの変数に割り当てると、結果は常に0になります。実際にデータを左にシフトするには、次のようにする必要があります。最初にそれらを16ビット型変数に型キャストします。私はこのように試しました

char spi(char data) 
{ 
    //Start transmision 
    SPDR = data; 
    //Wait for transmision complete 
    while(!(SPSR & 0x80)); 
    return SPDR; 
} 

unsigned int ReadAd(void) 
{ 
    unsigned int data; 

    ChipSelectAd(1); 
    //Read data 
    CheckStatus();                                            
    spi(0x58);                                                
    data = (unsigned int)((unsigned char)spi(0xFF)<< 8);    
    data |= (unsigned int)((unsigned char)spi(0xFF));         

    return data; 
} 

void CheckStatus(void)
{
//char adcStatus;
adcStatus = 0xFF;                                           
//Read status
while(!(adcStatus & 0x80))
{
    spi(0x40);
    adcStatus = spi(0xFF);
 }
}

void ChipSelectAd(char s)
{


if(s == 1){
    PORTB.3 = 0;    //Switch on ADC
    //while(PINB.3);  //Wait for chip select pin
}
    else
        PORTB.3 = 1;    //Switch off ADC
 }

動いていない。どの関数を使用する必要があるかを教えてください。

前もって感謝します。

4

2 に答える 2

5

あなたの問題はキャストではありません。汎整数拡張ルールにより、それらがなくても同じように機能します。

#include <stdio.h>

char spi ( char data )
{
  char SPDR = data;
  return SPDR;
}

unsigned int ReadAd ( void )
{
  unsigned int data;

  data = spi ( 0x81 ) << 8;
  data |= spi ( 0x42 );

  return data;
}

int main ( void )
{
  printf ( "Result %x\n", ReadAd() );
  return 0;
}

Result ffff8142これは、charが符号付きタイプであるシステムで出力されます。実際の問題を解決するには、変数へのspi()呼び出しの値を評価してから、それらの値を出力してみてください。の宣言/定義も示してくださいSPDR

于 2012-10-02T11:25:57.100 に答える
1

1)組み込みシステムの場合:標準の整数型、特にデフォルトのchar型を取り除きます。最新のコンパイラを使用している場合は、stdint.hのuint8_t、uint16_tなどを使用してください。古代のコンパイラを使用している場合は、以下同様typedef unsigned char uint8_tです。組み込みシステムで既知のサイズの符号なしタイプを使用していない場合は、バグ、バグ、バグを求めています。

2)整数拡張ルールを学び、理解します。それらについて知らない、または理解していないプログラマーが何人いるのかは恐ろしいことです。

上記の2つの基本事項を整理すると、コードは次のようになります。

(私は、さまざまな疑わしい、起こりうるバグと、くだらない、一貫性のないインデントを修正するために自由を取りました。さらに、いくつかのスタイルの落とし穴もあります。)

#include <stdint.h>

uint8_t spi (uint8_t data) 
{ 
  SPDR = data; //Start transmision 

  while((SPSR & 0x80) > 0) //Wait for transmision complete 
    ; 

  return SPDR; 
} 

uint16_t ReadAd(void) 
{ 
  uint16_t data; 

  ChipSelectAd(true); 

  CheckStatus(); //Read data 
  (void) spi(0x58);                                                

  data  = ((uint16_t)spi(0xFF)) << 8;
  data |=  (uint16_t)spi(0xFF);

  return data; 
} 

void CheckStatus(void)
{
  uint8_t adcStatus;

  do
  {
    (void) spi(0x40);
    adcStatus = spi(0xFF);
  } while((adcStatus & 0x80) > 0);
}

void ChipSelectAd(bool on)
{
  if(on)
  {
    PORTB.3 = 0;    //Switch on ADC
  }
  else
  {
    PORTB.3 = 1;    //Switch off ADC
  }
}
于 2012-10-02T11:53:13.983 に答える