ATMega16內(nèi)部EEPROM存儲器的應(yīng)用
位2-EEMWE:EEPROM主機寫入允許。該位決定是否允許對EEPROM進行寫入操作。當(dāng)EEMWE被置位時,在EEWE為1的4個時鐘周期內(nèi),將寫數(shù)據(jù)到指定的地址;當(dāng)EEMWE為0,設(shè)置EEWE為1不能觸發(fā)寫EEPROM操作。
位1-EEWE:EEPROM寫允許。 該位作為EEPROM的寫入觸發(fā)。當(dāng)?shù)刂泛蛿?shù)據(jù)被正確設(shè)置以后,且EEMWE為1,則置位EEWE,將觸發(fā)數(shù)據(jù)寫入EEPROM。如果EEMWE不為1,EEWE不能觸發(fā)寫EEPROM的操作。寫EEPROM應(yīng)該遵循以下步驟:
(1)等待EEWE為0,即EEPROM為空閑狀態(tài);
(2)等待SPMCR寄存器中的SPMEN位為0;
(3)寫新的EEPROM地址到寄存器EEAR(視具體情況可選);
(4)寫新的EEPROM數(shù)據(jù)到寄存器EEDR(視具體情況可選);
(5)寫1到EEMWE,并同時寫0到EEWE;
(6)在寫1到EEMWE后的4個時鐘周期內(nèi),寫1到EEWE位。
步驟(2)一般情況下可以省略,還需要注意的是,在步驟(5)和步驟(6)之間發(fā)生中斷將使寫入過程失敗,因此建議在對EEPROM進行寫操作時清零全局中斷允許標(biāo)志位以屏蔽所有中斷。
位0-EERE:EEPROM讀允許。該標(biāo)志作為讀取EEPROM操作的觸發(fā)。當(dāng)EEAR寄存器被設(shè)置了正確的地址后,向EERE位寫入1,將觸發(fā)EEPROM的讀取操作。
簡單的讀寫EEPROM的C代碼見本期配刊光盤的本文目錄。
有了上述內(nèi)容,實現(xiàn)“密碼保管箱”實例的程序流程就比較簡單了。先完成ATMega16單片機的初始化,其初始化代碼可以通過ICC AVR軟件自動生成。之后,程序開始檢測4×4小鍵盤上的輸入,如果小鍵盤的輸入與程序中設(shè)定的密碼管理箱密碼相同,則將存儲在EEPROM中的密碼送到串口中通過電腦或液晶顯示模塊進行顯示。當(dāng)然,我們還需要考慮一些編程細節(jié),比如如何比較設(shè)定的密碼與用戶輸入的密碼等。關(guān)于小鍵盤的操作我們在今年第5期第39頁的文章中已經(jīng)用匯編語言實現(xiàn)過,本期配刊光盤中給出了采用C語言編寫的程序,代碼看起來更清晰易懂。
設(shè)計好程序后,我們可以用上期介紹的ICC AVR軟件進行程序的編譯。打開ICC AVR,建立一個工程psmanager,并在工程選項里設(shè)定芯片為ATMega16,然后選擇Tools→Application Builder,或者點擊菜單欄上的快捷圖標(biāo),進入應(yīng)用程序生成器,可以幫助用戶快速生成初始化等相關(guān)代碼。
如次啊圖所示,Target CPU選擇M16,Xtal speed根據(jù)實際使用情況選擇。在Ports項里面是端口初始狀態(tài)的設(shè)置。Timer0、Timer1、Timer2中分別是ATMega16的3個定時器的設(shè)置。UART中是串口的設(shè)置。根據(jù)實際需要選擇合適的設(shè)置,然后點擊OK,ICC AVR會按照所設(shè)置的選項產(chǎn)生初始化代碼,用戶也可以自行編寫初始化代碼。
將Application Builder。產(chǎn)生的代碼保存為main.c,并且加入工程。接下來將需要寫入EEPROM的密碼生成*.eep文件,假設(shè)有兩組密碼需要存儲,分別是建設(shè)銀行卡密碼(為123456)和EMAIL ABC@163.COM密碼(為ABCDEFG),并設(shè)定密碼保管箱的密碼為“567890”。
ICC AVR用以下方法產(chǎn)生用于寫入EEPROM的eep文件:
#pragma data:eeprom
?。O(shè)置數(shù)據(jù)區(qū)到EEPROM
char key[]={‘5’,‘6’,‘7’,
‘8’,‘9’,‘O’}
char password[]={“CBC:
123456%ABC@163.COM:
ABCDEFG$")
?。僭O(shè)我們用“%”作為密碼之
間的分割;“$”為密碼結(jié)束標(biāo)志
#pragma data:data
?。O(shè)置數(shù)據(jù)區(qū)回到數(shù)據(jù)存儲器
將以上代碼添加在main.c中,注意必須緊跟著頭文件之后。這樣ICC AVR編譯完成后,除了生成單片機執(zhí)行文件}.hex,同時還將產(chǎn)生一個eep文件,可以通過Ponyprog軟件寫入ATMega16的EEPROM存儲器中。由于某種原因,在ATMega16的O~511共512個字節(jié)的EEPROM中,在地址O處的字節(jié)是不能使用的,所以上面的密碼將從EEPROM的地址1處依次存儲,即ATMega16可用的EEPROM為511個字節(jié)。
本例程中將功能相關(guān)的函數(shù)放在一起構(gòu)成一個C文件,因此在一個工程中會有多個C源文件,這樣做的好處是使得結(jié)構(gòu)清晰,修改和擴充都很方便。但是要注意文件包含問題,可以查閱相關(guān)的C語言書籍。
在完成所有的代碼后進行編譯,將編譯后生成的hex文件和eep文件一起寫入ATMega16。步驟如下:打開Ponyprog軟件,選擇File→OpenProgram(FLASH)File,選中生成的hex文件;再選擇File→Open Data(EEPROM)File,將文件類型更改為*.eep,然后選中eep文件。連接好硬件后,點擊Command→Write All,即可寫入。
工作中的系統(tǒng)如上圖所示。 因為本文介紹的“密碼保管箱”要借助于電腦進行顯示,還不夠獨立,筆者將在下期介紹如何使用ATMega16控制液晶顯示屏,讓密碼保管箱可以獨立使用。
存儲器相關(guān)文章:存儲器原理
評論