C 使用ATTiny和Atmel Studio处理32位数字

C 使用ATTiny和Atmel Studio处理32位数字,c,avr,avr-gcc,atmelstudio,attiny,C,Avr,Avr Gcc,Atmelstudio,Attiny,我想知道ATTiny,特别是ATTiny24如何在内存中存储32位无符号整数。我试图获取一个32位的值,并将其写入EEPROM中的32位位置。我曾尝试使用一个简单的掩码,但每次尝试时,我都会正确地得到下面两个字节(lsb),上面两个字节都是零。例如,当我尝试写入:0x12345678时,输出为:0x00005678。在Atmel Studio中是否有需要设置的设置,或者是否需要使用除掩蔽之外的其他方法 最终,我希望能够读取32位计数器值,并将其写入EEPROM中的特定位置。我正在修改一个现有的电

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

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

代码片段:

大体上:

unsigned long test_val = 305419896;  //0x12345678
EEprom_Long_Write(0x25,test_val);
职能:

EEprom_Long_写入:

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长写(无符号字符eeadr,无符号长EEU数据)
{
无符号字符温度=0;
无符号字符数=eeadr+3;
无符号长掩码=0;
无符号字符位置=24;
(1你掉进了。
的坑中)你掉进了。
的坑中(1你掉进了。
的坑中)(1你掉进了。
的坑中)(1改变这个:

mask = ((1<<8)-1) << position;
temp = (EE_Data & mask) >> position;
更改此项:

mask = ((1<<8)-1) << position;
temp = (EE_Data & mask) >> position;
更改此项:

mask = ((1<<8)-1) << position;
temp = (EE_Data & mask) >> position;
更改此项:

mask = ((1<<8)-1) << position;
temp = (EE_Data & mask) >> position;

使用
stdint.h
类型,而不是内置名称来定义宽度的类型。使用
stdint.h
类型,而不是内置名称来定义宽度的类型。使用
stdint.h
类型,而不是内置名称来定义宽度的类型。使用
stdint.h
类型,而不是内置名称来定义宽度的类型宽度。谢谢!我还需要将我的函数定义更改为
void EEprom\u Long\u Write(无符号字符eeadr,uint32\u t EE\u Data)
?@soupaloop:你应该始终使用正确的类型。如果
eeadr
保证小于256,使用
uint8\u t
,否则
uint16\u t
,等等。阅读
stdint.h
(维基百科或链接标准)。嗯,我会编辑我的答案,
shift
应该是AVR上的
uint8\u t
(对不起,我现在更习惯于ARM,32位是标准的。):请阅读链接的文本!这是至关重要的。@ SouPaloop:如果我的答案解决了你的问题,你应该考虑接受它。谢谢!我还需要把我的函数定义改为<代码>无效eMePosiLangyWrad(无符号char EEADR,uTIN 32×t EEX数据)
?@soupaloop:你应该始终使用正确的类型。如果
eeadr
保证小于256,使用
uint8\u t
,否则
uint16\u t
,等等。阅读
stdint.h
(维基百科或链接标准)。嗯,我会编辑我的答案,
shift
应该是AVR上的
uint8\u t
(对不起,我现在更习惯于ARM,32位是标准的。):请阅读链接的文本!这是至关重要的。@ SouPaloop:如果我的答案解决了你的问题,你应该考虑接受它。谢谢!我还需要把我的函数定义改为<代码>无效eMePosiLangyWrad(无符号char EEADR,uTIN 32×t EEX数据)
?@soupaloop:你应该始终使用正确的类型。如果
eeadr
保证小于256,使用
uint8\u t
,否则
uint16\u t
,等等。阅读
stdint.h
(维基百科或链接标准)。嗯,我会编辑我的答案,
shift
应该是AVR上的
uint8\u t
(对不起,我现在更习惯于ARM,32位是标准的。):请阅读链接的文本!这是至关重要的。@ SouPaloop:如果我的答案解决了你的问题,你应该考虑接受它。谢谢!我还需要把我的函数定义改为<代码>无效eMePosiLangyWrad(无符号char EEADR,uTIN 32×t EEX数据)
?@soupaloop:你应该始终使用正确的类型。如果
eeadr
保证小于256,使用
uint8\u t
,否则
uint16\u t
,等等。阅读
stdint.h
(维基百科或链接标准)。嗯,我会编辑我的答案,
shift
应该是AVR上的
uint8\u t
(对不起,我现在更习惯使用ARM,32位是标准的。):请阅读链接的文本!这是至关重要的。@ SouPaloop:如果我的答案解决了你的问题,你应该考虑接受它。