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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3249|回復: 15
打印 上一主題 下一主題
收起左側

STC8F單片機EEPROM神奇事件

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

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

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

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

  5. 到發射數組后卻能正常控制。


  6. 建立兩組數組

  7. uint  remotedata[207]; //發射數組
  8. uint  temp[207];        //臨時數組



  9. 紅外接收頭收到數據后存到發射數組里然后通過紅外發射頭發射能正常控制設備

  10. 然后把發射數組數據存到EEPROM里

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


  26.                                                                                

  27. for(i=0;i<207;i++)//把學到的數據保存到內存
  28.                                                                                 {
  29.                                                                                        

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

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

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


  39. 官方寫入代碼,應該沒問題吧,同時也把數據寫入到臨時數組里



  40. 然后把EEPROM數據讀回到發射數組里

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

  44. 內存中數據讀到數組
  45.                                 }


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

  47. 完全沒毛病的,但通過紅外發射頭發射這組數據卻不正常了

  48. 不服真不行啊,把臨時數組里的數據寫回到發射數組里就又發射正常了

  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 需要加上相應的偏移
  58.                 return *(unsigned char code *)(addr); //使用 MOVC 讀取數據       
  59. }



復制代碼
回復

使用道具 舉報

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

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

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

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

使用道具 舉報

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

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

使用道具 舉報

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

數據是一致的,數據不一致那就好辦了
回復

使用道具 舉報

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

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

使用道具 舉報

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

使用道具 舉報

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

for(i=0;i

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

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

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

使用道具 舉報

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

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

使用道具 舉報

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

紅外線發射是經38kHz調制后輸出的
對時間有極高的要求

到現時為止你發的代碼只有數據的存取
而沒有數據轉輸出的那部分

會不會是直接讀取EEPorm會對發射有影響?
回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色国产| 午夜精品久久久久99蜜 | 男女免费观看在线爽爽爽视频 | 一级免费在线视频 | 国产乱码精品1区2区3区 | 91av免费看 | 欧美男人天堂 | 色视频网站 | 免费精品 | 日本视频在线播放 | 欧美一区二区三区在线 | 一区二区精品 | 99国产精品99久久久久久 | 天堂av影院 | 欧美黑人一级爽快片淫片高清 | 中文天堂在线一区 | 久久精品视频网站 | 一级毛片网 | 国产日韩一区二区三免费高清 | 国产日韩欧美 | 国产精品视频一区二区三区 | 亚洲一二三区精品 | 国产这里只有精品 | 亚洲成人激情在线观看 | 99在线资源| 精品影院| 日本精品裸体写真集在线观看 | 亚洲成人高清 | 日韩资源| 亚洲区一区二区 | 中文字幕一区二区三区乱码在线 | 91视频一区二区三区 | 一区二区三区在线观看视频 | 亚洲视频一区 | 99这里只有精品视频 | 亚洲精品久久久久久久久久久久久 | 日韩欧美黄色 | 人人爽日日躁夜夜躁尤物 | 网站黄色在线免费观看 | 亚洲精品视频免费观看 | 欧美日韩a |