此範例將寫入數值到 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; } |
留言列表