2016-10-17 4 views
3

저는 Atemega32의 EEPROM에 데이터를 저장해야하는 대학 프로젝트를 진행하고 있습니다. 메모리의 특정 위치에서 데이터를 쓰고 읽을 수 있습니다. 하지만 데이터를 순차적으로 쓰기 위해 주소 0 ~ 1023을 쓰면 잘못된 값이 나옵니다.EEPROM에 순차적으로 데이터 쓰기 및 읽기

다음은 내가 작성한 기능입니다.

기능 정의 읽기 및 쓰기 할 데이터

#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"); 

가이 코드에 어떤 문제가 있는지 알려주십시오 1023 위치 0에서 데이터를 저장할 주요 기능을합니다.

+0

'EEAR','EECR' 및'EEDR' 등 변수의 정의는 무엇입니까? – Dai

+1

'epadr'은 어디에서 초기화합니까? 정적 저장소 지속 시간 변수를 초기화하지 않으시겠습니까? 그렇게하는 것은 특히 임베디드 시스템에서 제로 초기화를 건너 뛰는 비표준 시작 코드가있는 경우 특히 그렇습니다. – Lundin

+0

@Dai 'EEAR, EECR, EEDR'은 AVR의 acsess EEPROM에 등록되어 등록되어 있습니다. –

답변

2

내부 EEPROM에서 데이터를 읽고 쓸 수있는 고유 한 기능을 정의 할 필요가 없습니다. AVR은 이러한 목적으로 라이브러리를 제공합니다. 다음 샘플 코드는 다음과 같습니다 -

#define F_CPU 16000000UL 
#include <avr/io.h> 
#include <util/delay.h> 
#include <avr/eeprom.h> 

int main(void) 
{ 
    char read[5]; 

    eeprom_write_byte (0, '0'); 
    eeprom_write_byte (1, '1'); 
    eeprom_write_byte (2, '2'); 
    eeprom_write_byte (3, '3'); 
    eeprom_write_byte (4, '4'); 

    for (int count=0;count<5;count++) 
    { 
     read[count]=eeprom_read_byte((const uint8_t *)(count)); 
    } 

    while (1); 

} 
0

당신은 EEDR을 읽기 전에 완료 읽기 기다리지 않는다. 값을 읽을 때 읽을 준비가되어 있다고 보장 할 수는 없습니다. EERE을 설정하고 EEDR을 읽기 전에 약 1ms 지연을 추가해야합니다.

자세한 내용은 EEPROM Read/Write Procedure 아래의 항목을 참조하십시오.