久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC8F單片機EEPROM神奇事件

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:95375 發(fā)表于 2021-9-5 16:32 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
請問有哪個大人碰到過一組數(shù)據(jù)存到EEPROM中取出后數(shù)據(jù)是一樣的,再寫回數(shù)組中卻使用異常的嗎?從串口發(fā)送數(shù)據(jù)到電腦對比是數(shù)據(jù)存進去的和取出來的是真的一模一樣的,但用來發(fā)射紅外信號卻異常,原數(shù)組數(shù)據(jù)卻正常,再把備用數(shù)組數(shù)據(jù)寫回原數(shù)組里也正常,太神奇了。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:624769 發(fā)表于 2021-9-5 16:48 | 只看該作者
STC8F 系列 直接用 MOVC 讀Eeprom 效率高,系統(tǒng)還不會暫停,會比較好一點。而且活用extern unsigned char code 可以直接當數(shù)組用,而不用預(yù)先讀出來。
回復(fù)

使用道具 舉報

板凳
ID:57657 發(fā)表于 2021-9-5 17:05 | 只看該作者
用MOVC指令訪問,不管是ROM還是EEPROM,都是一樣的速度,部分老型號不支持用MOVC訪問EEPROM,C語言用 unsigned char code 指針。
回復(fù)

使用道具 舉報

地板
ID:160500 發(fā)表于 2021-9-5 18:04 | 只看該作者
數(shù)據(jù)寫入EEPROM,清零原數(shù)組,再讀取EEPROM中的數(shù)據(jù)賦值給數(shù)組,此時暫停程序,檢查數(shù)組中數(shù)據(jù)是否一致。如果一致,繼續(xù)運行程序,看是否正常,不正常繼續(xù)排查;如果數(shù)據(jù)不一致,則檢查讀取是否出錯、寫入數(shù)組的方法等等。
回復(fù)

使用道具 舉報

5#
ID:417092 發(fā)表于 2021-9-5 19:24 | 只看該作者
沒看懂你說的什么意思!!!
但是通信容易出問題的有
1,串口,發(fā)送和接收的波特率不一致。沒使用校驗。。。。
2,從高到低位,和 從低位到高位。弄反了。。。。
回復(fù)

使用道具 舉報

6#
ID:401564 發(fā)表于 2021-9-5 23:45 | 只看該作者
神奇的事件,在99.9999%的情況下,是由于神奇的人引起的
剛開始學(xué)單片機的時候,總覺得單片機不是這不行就是那不行
現(xiàn)在,出了問題,首先排除的就是"單片機壞了"
回復(fù)

使用道具 舉報

7#
ID:95375 發(fā)表于 2021-9-8 21:12 | 只看該作者
  1. 也許我沒有表達清楚意思,就是一組數(shù)組數(shù)據(jù)通過紅外發(fā)射后能正常控制設(shè)備,但把這組數(shù)組

  2. 數(shù)據(jù)保存到EEPROM后再取出放回數(shù)組再通過紅外發(fā)射卻不能控制設(shè)備了,可以確定這組數(shù)據(jù)在

  3. 存入前和取出后是完全一樣的,沒有出錯也沒有錯序,可為什么就不能正常了,原以為是發(fā)射

  4. 用的數(shù)組重寫數(shù)據(jù)造成出錯,但用另外一組完全一樣的數(shù)組同時保存數(shù)據(jù),再把這組數(shù)據(jù)復(fù)制

  5. 到發(fā)射數(shù)組后卻能正常控制。


  6. 建立兩組數(shù)組

  7. uint  remotedata[207]; //發(fā)射數(shù)組
  8. uint  temp[207];        //臨時數(shù)組



  9. 紅外接收頭收到數(shù)據(jù)后存到發(fā)射數(shù)組里然后通過紅外發(fā)射頭發(fā)射能正常控制設(shè)備

  10. 然后把發(fā)射數(shù)組數(shù)據(jù)存到EEPROM里

  11. /*-------------------------------
  12. 寫一字節(jié)數(shù)據(jù)到ISP/IAP/EEPROM區(qū)域
  13. -------------------------------*/
  14. void IapProgram(int addr, char dat)
  15. {
  16.     IAP_CONTR = WT_12M;                         //使能IAP
  17.     IAP_CMD = 2;                                //設(shè)置IAP寫命令
  18.     IAP_ADDRL = addr;                           //設(shè)置IAP低地址
  19.     IAP_ADDRH = addr >> 8;                      //設(shè)置IAP高地址
  20.     IAP_DATA = dat;                             //寫IAP數(shù)據(jù)
  21.     IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
  22.     IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
  23.     _nop_();
  24.     IapIdle();                                  //關(guān)閉IAP功能
  25. }


  26.                                                                                

  27. for(i=0;i<207;i++)//把學(xué)到的數(shù)據(jù)保存到內(nèi)存
  28.                                                                                 {
  29.                                                                                        

  30. IapProgram(IAP_ADDRESS+i,remotedata[i]);//寫數(shù)據(jù)到EEPROM
  31.                                                                                 }
  32.                                                                                
  33.                                                                                

  34. for(i=0;i<207;i++)//
  35.                                                                                 {
  36.                                                                                        

  37.         temp[i]=remotedata[i];//
  38.                                                                                 }


  39. 官方寫入代碼,應(yīng)該沒問題吧,同時也把數(shù)據(jù)寫入到臨時數(shù)組里



  40. 然后把EEPROM數(shù)據(jù)讀回到發(fā)射數(shù)組里

  41.                                 for(i=0;i<207;i++)//
  42.                                 {
  43.                                         remotedata[i]=IapRead(IAP_ADDRESS+i);//把

  44. 內(nèi)存中數(shù)據(jù)讀到數(shù)組
  45.                                 }


  46. 也沒問題吧,通過串口對比過寫入和讀出的數(shù)據(jù)是完全一模一樣的,如果是單單保存數(shù)據(jù)這是

  47. 完全沒毛病的,但通過紅外發(fā)射頭發(fā)射這組數(shù)據(jù)卻不正常了

  48. 不服真不行啊,把臨時數(shù)組里的數(shù)據(jù)寫回到發(fā)射數(shù)組里就又發(fā)射正常了

  49.                         for(i=0;i<207;i++)//
  50.                         {
  51.                                 remotedata[i]=temp[i];//
  52.                         }               

  53. 把EEPROM讀取換成MOVC讀取是一個樣

  54. //BYTE IapRead(WORD addr)
  55. char IapRead(int addr)
  56. {
  57.                 addr += IAP_OFFSET; //使用 MOVC 讀取 EEPROM 需要加上相應(yīng)的偏移
  58.                 return *(unsigned char code *)(addr); //使用 MOVC 讀取數(shù)據(jù)       
  59. }



復(fù)制代碼
回復(fù)

使用道具 舉報

8#
ID:95375 發(fā)表于 2021-9-8 21:20 | 只看該作者
188610329 發(fā)表于 2021-9-5 16:48
STC8F 系列 直接用 MOVC 讀Eeprom 效率高,系統(tǒng)還不會暫停,會比較好一點。而且活用extern unsigned char c ...

換MOVC讀取還是一樣,請問extern unsigned char code當數(shù)組用的話要怎么用,比如

for(i=0;i<207;i++)//
{
        temp[ i]=remotedata[ i];//
}

要怎樣用extern unsigned char code替代,我怎么感覺這個是定義常量用的呢
回復(fù)

使用道具 舉報

9#
ID:95375 發(fā)表于 2021-9-8 21:22 | 只看該作者
npn 發(fā)表于 2021-9-5 17:05
用MOVC指令訪問,不管是ROM還是EEPROM,都是一樣的速度,部分老型號不支持用MOVC訪問EEPROM,C語言用 unsig ...

謝謝,不是MOVC讀取的問題,不會指針,看到指針就暈
回復(fù)

使用道具 舉報

10#
ID:95375 發(fā)表于 2021-9-8 21:24 | 只看該作者
liuzx66 發(fā)表于 2021-9-5 18:04
數(shù)據(jù)寫入EEPROM,清零原數(shù)組,再讀取EEPROM中的數(shù)據(jù)賦值給數(shù)組,此時暫停程序,檢查數(shù)組中數(shù)據(jù)是否一致。如 ...

數(shù)據(jù)是一致的,數(shù)據(jù)不一致那就好辦了
回復(fù)

使用道具 舉報

11#
ID:95375 發(fā)表于 2021-9-8 21:30 | 只看該作者
Y_G_G 發(fā)表于 2021-9-5 23:45
神奇的事件,在99.9999%的情況下,是由于神奇的人引起的
剛開始學(xué)單片機的時候,總覺得單片機不是這不行就是 ...

這是肯定的,在未知的知識前任何人對任何事都感覺到神奇,如同魔術(shù)一般,我只是想看看有沒有人碰到我這樣的問題,實在是想不明白相同的數(shù)據(jù)能做出不同的事情來,畢竟代碼是沒有思想的,只是按我們設(shè)定的路走,現(xiàn)在卻變異了,肯定不是“單片機壞了”
回復(fù)

使用道具 舉報

12#
ID:57657 發(fā)表于 2021-9-8 22:12 | 只看該作者
單片機內(nèi)置的EEPROM,不是真正的EEPROM,而是Flash閃存 ,二進制1可以寫成0,反過來就不可以,只有擦除才可以全部恢復(fù)為1,一次擦1扇區(qū)(512字節(jié))。
24C02等EEPROM芯片沒有扇區(qū)的說法,可以直接讀寫。
回復(fù)

使用道具 舉報

13#
ID:624769 發(fā)表于 2021-9-8 23:45 | 只看該作者
liyago 發(fā)表于 2021-9-8 21:20
換MOVC讀取還是一樣,請問extern unsigned char code當數(shù)組用的話要怎么用,比如

for(i=0;i

創(chuàng)建一個匯編文件,
用  
CSEG      AT    2000H
Eeprom_DATA:      DS    0FFH
指向Eeprom 空間
然后 PUBLIC  Eeprom_DATA

然后再C語言 中 extern unsigned char code  Eeprom_DATA[];  來聲明

那么, 對于C語言的判斷, 就是引用 匯編里面定義的常量數(shù)組。 其實匯編里只是給了一個地址。
你C語言調(diào)用這個地址,就會到 0x2000 所對應(yīng)的 Eeprom 里面 MovC 讀出來了。
回復(fù)

使用道具 舉報

14#
ID:624769 發(fā)表于 2021-9-8 23:48 | 只看該作者

看你的代碼, 寫入前沒有擦除 Eeprom,  IAP的Eeprom, 必須擦除后才能正確寫入,否則會亂七八糟的東西,即使兩次寫入相同的東西,也會變成亂七八糟的東西。
回復(fù)

使用道具 舉報

15#
ID:161164 發(fā)表于 2021-9-8 23:52 | 只看該作者
最直觀的方法就是用邏輯分析儀或示波器看看輸出端的波型
比較一下成功和失敗的分別

紅外線發(fā)射是經(jīng)38kHz調(diào)制后輸出的
對時間有極高的要求

到現(xiàn)時為止你發(fā)的代碼只有數(shù)據(jù)的存取
而沒有數(shù)據(jù)轉(zhuǎn)輸出的那部分

會不會是直接讀取EEPorm會對發(fā)射有影響?
回復(fù)

使用道具 舉報

16#
ID:95375 發(fā)表于 2021-9-9 17:19 | 只看該作者
謝謝各位大大的回復(fù),問題已解決了,原來是我所有數(shù)據(jù)都是按兩位16進制來處理了,實際上數(shù)據(jù)中有3位16進制數(shù),stc-isp自帶的串口助手和XCOM V2.6都是顯示兩位16進制數(shù),所以一時沒有發(fā)現(xiàn)數(shù)據(jù)有錯。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲精品美女久久久久久久久久 | 亚洲欧美国产一区二区三区 | 国产传媒毛片精品视频第一次 | 国产我和子的乱视频网站 | 亚洲精品乱码久久久久久久久 | 久久99精品久久久久子伦 | 国产99视频精品免费播放照片 | 狠狠综合久久av一区二区老牛 | 亚洲区视频 | 国产一级特黄真人毛片 | 欧美精品三区 | 欧美精品影院 | 国产一区二区三区视频 | 亚洲成人一区 | 欧美九九 | 午夜精品一区二区三区免费视频 | 欧美日韩国产一区二区三区 | 亚洲一区二区电影在线观看 | 毛片一区二区 | 国产国语精品 | 日本久草| 久久精品小视频 | 国产精品久久久久久久久久久免费看 | 亚洲精品自在在线观看 | 人人干视频在线 | 日韩一区二区三区视频 | 免费国产一区二区 | 精品一区二区三区在线观看国产 | 一区二区三区四区av | 国产欧美精品一区 | 狠狠操av | 一级黄色毛片a | 亚洲免费一区 | 国产成人精品一区二区在线 | 国产精品久久精品 | 成人三级网址 | 日本福利一区 | 四季久久免费一区二区三区四区 | 国产网站在线播放 | 91国内精品久久 | 久久精品网 |