본문 바로가기
공부,일/atmega328P

EEPROM 사용하기

by fromnothing1 2021. 7. 18.

아두이노는 특이하게 EEPROM 이 존재한다. 

이는 갑작스러운 종료나 꼭 저장하고 있어야 되는 변수값들을 저장해놓을 수 있다.

(EEPROM 은 비휘발성이니까)

datasheet 에서는 글로벌 변수를 저장하기 좋다고 적혀있다. 

 

 

먼저 데이타 시트에는 eeprom 을 다룰수 있는 메모리에 대해서 적혀있다.

EEAR = 사용할 eeprom 의 메모리 주소를 적는 레지스터 

cf) 데이타 sheet에는 eeprom 이 1KB 존재 하는데 위에 글을 읽어보면 8bit 만으로 어드레스를 입력한다. (최대 255) 

즉 4분의 1 부분만 사용 가능하다. 

 

이는 사실 eeprom 은 페이지 개념이 존재 하는데 나머지 4분의 3 부분은 다른 하드웨어적인 부분에서 사용한다. 

8번 bit 는 무조건 0 쓰라고 되어 있는데, 쓰지 말라하면 쓰지 말자 

 

 

EEDR : 메모리에 쓸 데이타를 적는 부분

EECR : eeprom 을 컨트롤 하는 부분 

 

사용 순서 

 

 

위 글을 읽어보면 알수 있지만 

 

EECR 의 EEMPE bit 를 1로 바꾸고 4 클럭 안에 EEPE bit 를 1 bit 로 바꿔야지 정상적인 wirte 동작이 이루어진다. 

 

그래서 그냥 1로 바꾸고 내버려 두면  4클럭 후에 자동으로 0으로 되돌아 오는 것을 볼 수 있다. 

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
}
void loop() {
Serial.println(EECR,BIN);
EECR |= (1<<EEMPE);
Serial.println(EECR,BIN);
Serial.println(EECR,BIN);
Serial.println(EECR,BIN);
Serial.println(EECR,BIN);
Serial.println(EECR,BIN);
Serial.println(EECR,BIN);
Serial.println("clear");
}

대충 Serial println  명령어가 2 클럭정도 걸린다는 것을 알 수 있다 .(내생각)

 

 

 

 

읽기 BIT 설명 

읽을 때 사용하는 bit 

일기 쓰기 

void setup() 
{
  // put your setup code here, to run once:
  Serial.begin(9600); 
}

void loop() 
{
 char cSREG;
 cSREG = SREG; 
 SREG = 0;  // INTERRUP 안나게 설정
 EECR = 0; // EEPM0,1 초기화 , 읽기 지우기 가능 
 EEPROM_write(0x01,'2');
 Serial.println(EEPROM_read(0x01));
 SREG = cSREG; 
}

void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
  /* Wait for completion of previous write */
  while(EECR & (1<<EEPE)); //EEPE bit 가 0 인지 확인하는 코드
  /* Set up address and Data Registers */
  EEAR = uiAddress;
  EEDR = ucData;
  /* Write logical one to EEMPE */
  EECR |= (1<<EEMPE);
  /* Start eeprom write by setting EEPE */
  EECR |= (1<<EEPE);
}

unsigned char EEPROM_read(unsigned int uiAddress)
{
  /* Wait for completion of previous write */
  while(EECR & (1<<EEPE));
  /* Set up address register */
  EEAR = uiAddress;
  /* Start eeprom read by writing EERE */
  EECR |= (1<<EERE);
  /* Return data from Data Register */
  return EEDR;
}

 

 

 

 

 

 

CF)  SPMCSR

- eeprom write 도중 인터럽트가 발생하지 않게 설정 하는데 사용함

댓글