Arduino使用EEPROM練習(1)
電子設備難免都會用到需要斷電後依然可以保存設定或記路蒐集到的資料的功能,例如你可能想做一個可以學習的萬用遙控器,你可能使用紅外線模組接收家中電視或冷氣的遙控器的訊號,將其訊號特徵"儲存"在某種非揮發性(non-volatile)的記憶元件中,然後等到要使用時根據儲存的資料控制紅外線模組打出一樣的訊號,
EEPROM就是其中一種非揮發性(non-volatile)的記憶元件,選擇要使用那種型號的EEPROM最簡單不外乎依照所需儲存的資料量以及該EEPROM的存取介面.
這個範例使用IC 24LC128, 所能儲存的資料為128Kbits (約16K Bytes),而傳輸介面採用I2C.
在電路的設計上SCL和SDA上我原先是沒又加1.5k的提升電組,我也確實看過有人沒加也是可以用,不過我自己使用時,如果沒加SCL上面的波形都是亂的,所以我後來還是加上了這對提升電組,有興趣的朋友可以參考這篇,作者有嘗試使用不同的大小的提升電組,然後觀察其波形的變化 http://www.gammon.com.au/forum/?id=10896
這個練習我將寫入和讀取分開為兩個獨立的程式,實驗步驟如下
1.電路製作
2.寫入程式
使用邏輯分析儀確認送出的波形如預期
3.讀取程式
使用邏輯分析儀確認送出及接收的波形如預期,並在程式中將讀取到的資料print在Arduino開發環境的"序列埠監控視窗"
電路製作:
焊的很醜....另外模組間的接線就直接用插線的(有人知道這種插線叫什麼,麻煩跟我講,thanks)
寫入程式:
這個程式會讓Arduino在開機後自動寫入一筆資料"0xAA"到EEPROM的位置0x00
相關參數
I2C address: 0x50
EEPROM address: 0x0
資料內容:0xAA
#include <Wire.h>
byte datain=0;
void setup() {
Serial.begin(9600);
// put your setup code here, to run once:
Wire.begin();
Wire.beginTransmission(0x50);
Wire.write(0x00);
Wire.write(0x00);
Wire.write(0xAA);
Wire.endTransmission();
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("Hello world.");
delay(1000);
}
完成後使用邏輯分析儀如下圖
EEPROM就是其中一種非揮發性(non-volatile)的記憶元件,選擇要使用那種型號的EEPROM最簡單不外乎依照所需儲存的資料量以及該EEPROM的存取介面.
這個範例使用IC 24LC128, 所能儲存的資料為128Kbits (約16K Bytes),而傳輸介面採用I2C.
在電路的設計上SCL和SDA上我原先是沒又加1.5k的提升電組,我也確實看過有人沒加也是可以用,不過我自己使用時,如果沒加SCL上面的波形都是亂的,所以我後來還是加上了這對提升電組,有興趣的朋友可以參考這篇,作者有嘗試使用不同的大小的提升電組,然後觀察其波形的變化 http://www.gammon.com.au/forum/?id=10896
這個練習我將寫入和讀取分開為兩個獨立的程式,實驗步驟如下
1.電路製作
2.寫入程式
使用邏輯分析儀確認送出的波形如預期
3.讀取程式
使用邏輯分析儀確認送出及接收的波形如預期,並在程式中將讀取到的資料print在Arduino開發環境的"序列埠監控視窗"
電路製作:
焊的很醜....另外模組間的接線就直接用插線的(有人知道這種插線叫什麼,麻煩跟我講,thanks)
寫入程式:
這個程式會讓Arduino在開機後自動寫入一筆資料"0xAA"到EEPROM的位置0x00
相關參數
I2C address: 0x50
EEPROM address: 0x0
資料內容:0xAA
#include <Wire.h>
byte datain=0;
void setup() {
Serial.begin(9600);
// put your setup code here, to run once:
Wire.begin();
Wire.beginTransmission(0x50);
Wire.write(0x00);
Wire.write(0x00);
Wire.write(0xAA);
Wire.endTransmission();
}
void loop() {
// put your main code here, to run repeatedly:
Serial.print("Hello world.");
delay(1000);
}
完成後使用邏輯分析儀如下圖
以上這個練習就是一個簡易的寫入練習,至於怎麼讀? 下次再跟大家一起討論!!
參考資料:
AVR的EEPR範例
這份說明有波型
不好意思 請問一下 為甚麼要有0x00呢?
回覆刪除有點不懂@@
不好意思,現在才看到你的留言,
刪除由於這棵EEPROM的大小為"128Kbits"="16384Bytes",
所以如果以Byte為單位,EEPROM提供的儲存空間為0~16384,
我這邊的"0x00"就是"0~16384"的"0", 只是我是以16近制的寫法,如果你想讀寫下一個byte,可以嘗試換成"1" ("0x01").
至於前段的"0x50"則是包含了這EEPROM在I2C上的裝置編號及讀寫模式~~