找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2354|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)+24C08 EEPROM保存和讀取對應(yīng)數(shù)據(jù)的程序思路

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:997026 發(fā)表于 2022-10-17 01:04 來自觸屏版 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
現(xiàn)在單片機(jī)需要外接一顆24C08的eeprom,需要保存100-200之間的隨機(jī)數(shù)字,在eeprom開辟一個(gè)5地址空間來保存,從0地址開始寫,寫到4滿后,再回頭從0開始寫,如此循環(huán)。

要保存的數(shù)100-200是隨機(jī)的,只需在上電開機(jī)讀最后一次保存的數(shù)字,其他不關(guān)注,比如,數(shù)字變化了6次,依次是,101,112,122,133,145,166,那么101寫到0地址,依次寫,145寫到4地址,寫滿后,166寫到0地址覆蓋了101,現(xiàn)在需要在開機(jī)時(shí)檢測最后一個(gè)數(shù)字166,有什么好的思路,怎么知道166是最后一個(gè)數(shù)字呢,怎么知道166在0地址呢?有什么方法檢測到這個(gè)166?這個(gè)舉例是是數(shù)字變化了6次,要求在數(shù)字變化10次,100次依然可以檢測到。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:883242 發(fā)表于 2022-10-17 05:50 | 只看該作者
按頁擦除,從后往前讀,第一個(gè)不是0xff的166就是你要的166。
回復(fù)

使用道具 舉報(bào)

板凳
ID:997026 發(fā)表于 2022-10-17 09:27 來自觸屏版 | 只看該作者
Hephaestus 發(fā)表于 2022-10-17 05:50
按頁擦除,從后往前讀,第一個(gè)不是0xff的166就是你要的166。

感謝回復(fù)!你的回復(fù)猶如醍醐灌頂!我知道怎么寫了,感謝
回復(fù)

使用道具 舉報(bào)

地板
ID:624769 發(fā)表于 2022-10-17 09:59 來自觸屏版 | 只看該作者
24c系列,只有讀寫的eeprom,比較適合插標(biāo)法,即6個(gè)字節(jié)存5個(gè)字節(jié)數(shù)據(jù),寫完數(shù)據(jù),后面寫個(gè)0,下次寫,新數(shù)據(jù)覆蓋0,再后面寫個(gè)0,讀的時(shí)候,讀0前面的數(shù)據(jù),如果第一個(gè)是0,讀最后一個(gè),
回復(fù)

使用道具 舉報(bào)

5#
ID:123289 發(fā)表于 2022-10-17 14:39 | 只看該作者
地址【0,1,2,3,4】寫隨機(jī)數(shù)據(jù),地址【5】寫指針0-4,記錄當(dāng)前位置
例:開機(jī)讀到【5】=3,即上次寫的是地址【3】,則本次寫地址【4】,并改【5】=4。
回復(fù)

使用道具 舉報(bào)

6#
ID:997026 發(fā)表于 2022-10-18 10:05 | 只看該作者
yzwzfyz 發(fā)表于 2022-10-17 14:39
地址【0,1,2,3,4】寫隨機(jī)數(shù)據(jù),地址【5】寫指針0-4,記錄當(dāng)前位置
例:開機(jī)讀到【5】=3,即上次寫的是 ...

謝謝!你這種方法是不是每寫一次隨機(jī)數(shù)據(jù),就會在地址【5】記錄一次?比如我在地址0寫110,就會在地址5記錄0,在地址1寫150,就會在地址5記錄1,是這個(gè)意思嗎?這個(gè)方法很好,但是頻繁在地址5寫數(shù)據(jù),時(shí)間長了會不會不太好?我實(shí)際上想用一種所謂均攤法,讓每個(gè)地址寫數(shù)據(jù)的機(jī)會幾乎均等
回復(fù)

使用道具 舉報(bào)

7#
ID:997026 發(fā)表于 2022-10-18 10:11 | 只看該作者
188610329 發(fā)表于 2022-10-17 09:59
24c系列,只有讀寫的eeprom,比較適合插標(biāo)法,即6個(gè)字節(jié)存5個(gè)字節(jié)數(shù)據(jù),寫完數(shù)據(jù),后面寫個(gè)0,下次寫,新數(shù) ...

謝謝!我的理解是,比如地址0,1,2,3,4,5,地址0寫一個(gè)數(shù)據(jù)后,再在地址1寫0,然后在地址1寫數(shù)據(jù)后,覆蓋原先的0,然后再在地址2寫0,以此類推,然后讀的時(shí)候,從后往前讀,讀到第一個(gè)0的時(shí)候,0前面的就是我要找的數(shù),不知道我的理解對不對
回復(fù)

使用道具 舉報(bào)

8#
ID:624769 發(fā)表于 2022-10-18 11:26 | 只看該作者
hxdby 發(fā)表于 2022-10-18 10:11
謝謝!我的理解是,比如地址0,1,2,3,4,5,地址0寫一個(gè)數(shù)據(jù)后,再在地址1寫0,然后在地址1寫數(shù)據(jù)后,覆蓋 ...

對,就是這個(gè)意思,當(dāng)然,因?yàn)槟銛?shù)據(jù) 范圍是100~200  不會出現(xiàn) 0,所以,用插標(biāo)法比較經(jīng)濟(jì)。因?yàn)樗凶止?jié)均攤這個(gè)標(biāo)志的寫入次數(shù)。同理,只要數(shù)據(jù)中有 絕對不會出現(xiàn)的某個(gè)值,你都可以把它定為你的“標(biāo)記” 都可以用插標(biāo)法。
回復(fù)

使用道具 舉報(bào)

9#
ID:883242 發(fā)表于 2022-10-18 11:34 | 只看該作者
hxdby 發(fā)表于 2022-10-18 10:11
謝謝!我的理解是,比如地址0,1,2,3,4,5,地址0寫一個(gè)數(shù)據(jù)后,再在地址1寫0,然后在地址1寫數(shù)據(jù)后,覆蓋 ...

你的理解完全錯(cuò)誤,eeprom和flash不可能“覆蓋原先的0”。

必須先把原先的數(shù)據(jù)全部擦除成1,字節(jié)表達(dá)就是全擦除成0xff,才可把需要的0寫成0,1不變。

既然你的數(shù)據(jù)不可能出現(xiàn)0xff,那么優(yōu)化均攤寫法就很容易實(shí)現(xiàn),不要像某些二傻子那樣找個(gè)“記錄當(dāng)前位置”把這個(gè)位置寫壞掉。
回復(fù)

使用道具 舉報(bào)

10#
ID:997026 發(fā)表于 2022-10-18 16:08 | 只看該作者
Hephaestus 發(fā)表于 2022-10-18 11:34
你的理解完全錯(cuò)誤,eeprom和flash不可能“覆蓋原先的0”。

必須先把原先的數(shù)據(jù)全部擦除成1,字節(jié)表達(dá) ...

對于flash而言,確實(shí)需要在重新寫數(shù)據(jù)之前先擦除,也就是需要寫一個(gè)函數(shù),專門來干擦除的活,但是eeprom,你的意思是也需要先擦除嗎?我之前用過的eeprom都是直接覆蓋寫入了,并沒有先做擦除的動(dòng)作,還是你表達(dá)的意思是芯片內(nèi)部幫我們做了擦除動(dòng)作,我們不需要自己在家擦除了?
回復(fù)

使用道具 舉報(bào)

11#
ID:624769 發(fā)表于 2022-10-18 17:20 | 只看該作者
hxdby 發(fā)表于 2022-10-18 16:08
對于flash而言,確實(shí)需要在重新寫數(shù)據(jù)之前先擦除,也就是需要寫一個(gè)函數(shù),專門來干擦除的活,但是eeprom ...

你看一下 24C08 的手冊 就知道了, 壓根沒有擦除指令, 只有讀寫指令, 難道你去寫0xff ?  這不是多此一舉么?   網(wǎng)上找答案,也需要學(xué)會自己思考
回復(fù)

使用道具 舉報(bào)

12#
ID:997026 發(fā)表于 2022-10-18 21:24 | 只看該作者
188610329 發(fā)表于 2022-10-18 17:20
你看一下 24C08 的手冊 就知道了, 壓根沒有擦除指令, 只有讀寫指令, 難道你去寫0xff ?  這不是多此一 ...

FLASH我用過很多,eeprom也用過,所以我覺得他說的我非常驚訝,第一次聽說eeprom要先擦除再寫,我之前都是覆蓋寫入。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表