close

此範例將寫入數值到 ATmega16 EEPROM,在讀取EEPROM數值,如讀取出的數值與我們寫入的數值一樣時,則點亮 LED,以此驗證寫入數值到 EEPROM 是否成功,然後會另外介紹使用Avrdude 讀取EEPROM 數值方法,來驗證寫入 EEPROM 是否成功。

 

電路:

 

以下介紹外部中斷會用到的 Register

 

EEAR:

用於設定寫入 EEPROM 的寫入或讀取的位址。

 

 

EEDR:

當進行 EEPROM 寫入時,可給值 EEDR Register設定寫入資料,當進行 EEPROM 讀取時,可在 EEDR Register 直接讀取資料。

 

EERC:

對EEPROM 進行讀取或寫入操作,也可以使用此Register得知目前對 EEPROM讀寫狀態。


 


 

EEPROM 寫入流程:

1. 等待 EECR 中的 EEWE Register 不得為 1。(不得為 “正在寫入資料狀態” )

2. 設定EEAR Register。( EEPROM 寫入地址)設定 EEDR Register。( EEPROM 寫入資料)

3. 設定 EECR 中的 EEMWE Register與 EEWE Register為 1。(寫入資料到EEPROM)

 

EEPROM 讀取流程:

1. 等待 EECR 中的 EEWE Register 不得為 1。(不得為 “正在寫入資料狀態” )

2. 設定EEAR Register。( EEPROM 寫入地址)

3. 設定 EECR 中的 EERE Register為 1。(讀取EEPROM資料)

4. 到EEDR Register 讀取設定位址之 EEPROM 資料。


 

程式:

#include <avr/io.h>

 

void EEPROM_write(unsigned int uiAddress, unsigned char 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);

}

 

unsigned char EEPROM_read(unsigned int 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;

}

 

int main(){

 

   DDRA=1<<PA0; //將 PA0 設為 Output

   PORTA = 0<<PA0;//將 PA0 設為 Low (輸出高電位),此行程式碼可以省略

 

   EEPROM_write(0x2,1); //在 EEPROM 0x2 位址寫入 1

while(1){

   if (EEPROM_read(0x2)==1){ //讀取 EEPROM 0x2 位址是否為 1

    PORTA = 0<<PA0; //點亮 LED

   }else{

    PORTA = 1<<PA0; //關閉 LED

}

}

return 0;

}

 

全站熱搜
創作者介紹
創作者 iammic 的頭像
iammic

簡單過生活

iammic 發表在 痞客邦 留言(0) 人氣()