3

AtMega32 の EEPROM にデータを保存する必要がある大学のプロジェクトに取り組んでいます。メモリの特定の場所でデータを読み書きできます。しかし、アドレス 0 から 1023 まで順番にデータを書き込もうとすると、間違った値が取得されます。

ここに私が書いた関数があります。

データを読み書きする関数定義

#include "eeprom.h"

uint8_t EEPROMRead(uint16_t uiAddress)
{
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE));
    /* Set up address register */
    EEAR = uiAddress;
    /* Start eeprom read by writing EERE */
    EECR |= (1<<EERE);
    /* Return data from data register */
    return EEDR;
}

void EEPROMWrite(uint16_t uiAddress, uint8_t ucData)
{
    /* Wait for completion of previous write */
    while(EECR & (1<<EEWE));
    /* Set up address and data registers */
    EEAR = uiAddress;
    EEDR = ucData;
    /* Write logical one to EEMWE */
    EECR |= (1<<EEMWE);
    /* Start eeprom write by setting EEWE */
    EECR |= (1<<EEWE);
}

主な機能はこちら

static int epadr=0;
epread=EEPROMRead(epadr);      //reading from address stored in epadr
printf("%d",epread);           //printing values


if(epadr<=1023)
    {
        EEPROMWrite(epadr,high);    //writing at address stored in epadr
        epadr++;                   //increment address
    }
}

if(epadr>1023)
printf("Memory Full\n");

0 から 1023 までのデータを保存したいのですが、このコードの問題点を教えてください。

4

2 に答える 2

0

読み取りの前に読み取りが完了するのを待ちませんEEDR。値を読み取ったときに値を読み取る準備ができているという保証はありません。EERE設定後、読み取り前に約 1ms の遅延を追加する必要がありますEEDR

詳細については、 EEPROM の読み取り/書き込み手順の下のエントリを参照してください。

于 2016-10-17T10:18:15.893 に答える