아두이노는 특이하게 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 도중 인터럽트가 발생하지 않게 설정 하는데 사용함
'공부,일 > atmega328P' 카테고리의 다른 글
atmega 328p PWM & timer counter (1) 분주비 , 타이머 vs 카운터 (0) | 2021.07.27 |
---|---|
ISR() 분석 - 전처리문 분석 (0) | 2021.07.20 |
i/o register 0x0(0x20)메모리 주소의 의미 (기본기) (0) | 2021.07.20 |
Register 이용해서 LED 켜기 (0) | 2021.07.16 |
ATmega328P 기본 개념 정리(기본기) (0) | 2021.07.15 |
댓글