首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用ATTiny和Atmel Studio处理32位数

用ATTiny和Atmel Studio处理32位数
EN

Stack Overflow用户
提问于 2015-07-14 14:06:54
回答 2查看 1.7K关注 0票数 0

我想知道ATTiny,特别是ATTiny24是如何在内存中存储32位未签名的in的。我试图获取一个32位值,并将其写入EEPROM中的32位位置。我尝试使用一个简单的掩码,但是每次尝试,我都会正确地得到下两个字节(lsb),而上面的两个字节都是零。例如,当我试图写: 0x12345678时,输出是: 0x00005678。是否需要设置Atmel Studio中的设置,或者是否需要使用屏蔽以外的其他方法。

最终,我希望能够读取32位计数器值,并将其写入EEPROM中的特定位置。我正在修改一个现有的电路,因此没有奢侈的调试与串行输出。

代码片段:

主要是:

代码语言:javascript
复制
unsigned long test_val = 305419896;  //0x12345678
EEprom_Long_Write(0x25,test_val);

功能:

EEprom_Long_Write:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-07-14 14:24:36

你掉进了 and coercion的坑里。((1<<8)-1)被处理为int,而不是long (更好:uint32_t)。在AVR上,int具有标准允许的最小大小: 16位。

由于太复杂了,所以可以使用以下方法:

代码语言:javascript
复制
uint8_t shift = 32U;   // enough is enough
do {
    shift -= 8U;
    EEPROM_write(eeadr++, (uint8_t)(EE_Data >> shift));
} while ( shift ) ;

这将为您提供额外的移位和显式掩蔽以及一些寄存器。

注意我对stdint.h类型的使用(当然,您必须包括标题)。您应该相应地更正所有声明。对uint8_t的转换意味着掩蔽。

票数 2
EN

Stack Overflow用户

发布于 2015-07-14 14:28:13

改变这一点:

代码语言:javascript
复制
mask = ((1<<8)-1) << position;
temp = (EE_Data & mask) >> position;

对此:

代码语言:javascript
复制
temp = (EE_Data >> position) & 0xFF;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31409029

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档