2

我正在尝试将 char 变量转换为 Unsigned int。我的代码是

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 位,然后将其分配给一个 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)学习和理解整数提升规则。令人恐惧的是,有多少程序员不了解或不了解它们。

整理好上述两个基础知识后,您的代码应该类似于以下代码:

(我冒昧地修复了各种可疑的、可能的错误和蹩脚的、不一致的缩进。加上一些风格挑剔。)

#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 回答