我正在尝试将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
}
它不起作用。请告诉我我必须使用哪种功能。
提前致谢。
答案 0 :(得分: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;
}
在char为签名类型的系统上输出Result ffff8142
。要解决实际问题,请尝试确定spi()调用变量的值,然后打印它们的值。另请告诉我们SPDR
的声明/定义。
答案 1 :(得分:1)
1)在嵌入式系统中:摆脱标准的整数类型,特别是默认的char类型。如果您有一个现代编译器,请使用stdint.h中的uint8_t,uint16_t等。如果您有一个古老的编译器,那么typedef unsigned char uint8_t
等等。如果你没有在嵌入式系统中使用已知大小的无符号类型,那么你就是在寻找bug错误。
2)学习并理解integer promotion rules。令人恐惧的是,有多少程序员不了解或理解它们。
一旦你完成了上面两个基础知识,你的代码应该看起来像这样的代码:
(我冒昧地修复了各种可疑的,可能的错误以及蹩脚,不一致的缩进。加上一些风格的挑剔。)
#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
}
}