0

ATTiny、特に ATTiny24 が 32 ビットの符号なし int をメモリに格納する方法を知りたいです。32 ビット値を取得して、EEPROM の 32 ビット位置に書き込もうとしています。単純なマスクを使用しようとしましたが、試行するたびに、下位 2 バイト (lsb) が正しく取得され、上位 2 バイトはすべてゼロになります。たとえば、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_書き込み:

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

}
4

2 に答える 2

2

あなたは整数の昇進と強制の穴に落ちました。ではなく((1<<8)-1)として処理されます(より良い: )。AVR では、標準で許可されている最小サイズ: 16 ビット。intlonguint32_tint

とにかく複雑すぎるので、次を使用できます。

uint8_t shift = 32U;   // enough is enough
do {
    shift -= 8U;
    EEPROM_write(eeadr++, (uint8_t)(EE_Data >> shift));
} while ( shift ) ;

これにより、1 つの追加シフトと明示的なマスキングといくつかのレジスタが保護されます。

タイプの使用に注意してくださいstdint.h(もちろん、ヘッダーを含める必要があります)。それに応じて、すべての宣言を修正する必要があります。へのキャストは、uint8_tマスキングを意味します。

于 2015-07-14T14:24:36.860 に答える
1

これを変える:

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

これに:

temp = (EE_Data >> position) & 0xFF;
于 2015-07-14T14:28:13.003 に答える