我想知道ATTiny,特别是ATTiny24是如何在内存中存储32位未签名的in的。我试图获取一个32位值,并将其写入EEPROM中的32位位置。我尝试使用一个简单的掩码,但是每次尝试,我都会正确地得到下两个字节(lsb),而上面的两个字节都是零。例如,当我试图写: 0x12345678时,输出是: 0x00005678。是否需要设置Atmel Studio中的设置,或者是否需要使用屏蔽以外的其他方法。
最终,我希望能够读取32位计数器值,并将其写入EEPROM中的特定位置。我正在修改一个现有的电路,因此没有奢侈的调试与串行输出。
代码片段:
主要是:
unsigned long test_val = 305419896; //0x12345678
EEprom_Long_Write(0x25,test_val);功能:
EEprom_Long_Write:
void EEprom_Long_Write(unsigned char eeadr, unsigned long EE_Data)
{
unsigned char temp=0;
unsigned char count= eeadr + 3;
unsigned long mask=0;
unsigned char position=24;
while (eeadr <= count)
{
mask = ((1<<8)-1) << position;
temp = (EE_Data & mask) >> position;
EEPROM_write(eeadr, temp);
position = position-8;
eeadr++;
}
}EEPROM_write:
void EEPROM_write(unsigned char ucAddress, unsigned char ucData)
{
while(EECR & (1<<EEPE)); //Wait for completion of previous write
EECR =(0<<EEPM1) | (0>>EEPM0); // Set Programming mode
EEARL = ucAddress; // Setup address and data registers
EEDR = ucData; // Load Data Register
EECR |= (1<<EEMPE); // Write logical one to EEMPE
EECR |= (1<<EEPE); // Start eeprom write be setting EEPE
}发布于 2015-07-14 14:24:36
你掉进了 and coercion的坑里。((1<<8)-1)被处理为int,而不是long (更好:uint32_t)。在AVR上,int具有标准允许的最小大小: 16位。
由于太复杂了,所以可以使用以下方法:
uint8_t shift = 32U; // enough is enough
do {
shift -= 8U;
EEPROM_write(eeadr++, (uint8_t)(EE_Data >> shift));
} while ( shift ) ;这将为您提供额外的移位和显式掩蔽以及一些寄存器。
注意我对stdint.h类型的使用(当然,您必须包括标题)。您应该相应地更正所有声明。对uint8_t的转换意味着掩蔽。
发布于 2015-07-14 14:28:13
改变这一点:
mask = ((1<<8)-1) << position;
temp = (EE_Data & mask) >> position;对此:
temp = (EE_Data >> position) & 0xFF;https://stackoverflow.com/questions/31409029
复制相似问题