|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
又有問題啦,最近問題多多... |
| 作者:ddtv 欄目:單片機 |
Q1: 用C怎樣讀FLASH里的數(shù)據(jù)? 我用s = *(volatile uchar *)0xde00; 讀是錯誤的數(shù)據(jù),不知道是讀到什么地方了. Q2: 怎樣校準8M下RC的頻率,如果是4M CPROG08SZ可以自動校準,但是在8M下編 程到校準CRC-8的時候就出錯(error 50). 編程用的P&E,時鐘來自debuger,7.5MHz. 程序只是移植過來,本以為很快搞定,結果搞了2星期,離項目完成時間越來越短了,可查的資料也太少了點 |
| 2樓: | >>參與討論 |
| 作者: ambercctv 于 2006/12/8 12:36:00 發(fā)布:
你怎么知道錯了,0xDE00這個地址對嘛? |
|
| 3樓: | >>參與討論 |
| 作者: 冷若寒 于 2006/12/8 12:37:00 發(fā)布:
你用的哪款芯片? |
|
| 4樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/8 14:13:00 發(fā)布:
這么快就有回復啦 芯片是mc68hc908QB8,0xde00--0xdeff是我保留的地址,通過調用on chip rom里的程序已經可以寫入和擦除了,是用codewarrior編譯下載和查看的(P&E調試器),地址0xde00開始的10個字節(jié)我寫入了0,1,2... 但是上述程序讀出來的值是錯的(0x36,0xe7,..0xe7,0xe7,0xe7..)記得不太準確. |
|
| 5樓: | >>參與討論 |
| 作者: imwangyi 于 2006/12/8 17:18:00 發(fā)布:
建議 Q1:要確定語句是否給編譯時給優(yōu)化了.對于不需要被優(yōu)化的,請用volatile定義變量,比如volatile unsigned CHAR S. Q2:需要知道你們的工作電壓等,才能知道怎么辦. |
|
| 6樓: | >>參與討論 |
| 作者: xzliu 于 2006/12/11 19:47:00 發(fā)布:
imwangyi: 工作電壓是5V,usb的P&E仿真器供電 如果用外部電源供電則不能下載,每次下載都失敗. |
|
| 7樓: | >>參與討論 |
| 作者: imwangyi 于 2006/12/11 22:52:00 發(fā)布:
您用的是什么工具? QB對4M/8M CYCLONE PRO有兩個算法,您是否可以將流程說來聽聽? |
|
| 8樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/13 17:15:00 發(fā)布:
以下流程 因是專門上網(wǎng)機器,圖、軟件等都沒有。憑印象了 Q1: 已經加了volatile 了啊 Q2: CODEWARRIOR中選debug,(make圖標的后一個),自動啟動調試軟件。 之前已選好(第二個選項:P&E...,不是ICS p&E....),選擇p&E提供的5V,選擇來自p&E的時鐘分頻(5.0M或7.5M都可).校準選項選8M. 連接...,出現(xiàn)"擦除并編程FLASH",確定. 下載中.... 到校驗CRC8的時候就出錯了. 其實2個都試過好幾次了. |
|
| 9樓: | >>參與討論 |
| 作者: imwangyi 于 2006/12/14 22:19:00 發(fā)布:
:) Q1: s = *(volatile uchar *)0xde00; volatile需要對s定義. Q2: 看不到你說的界面,能否貼個圖?不能肯定你手上的p&E Debug QB時,是用的內部時鐘. 另,你CW用的是什么版本? |
|
| 10樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/15 18:25:00 發(fā)布:
老問題加舊問題一起又來了 imwangyi你說的Q1方法也試過了. 調試時用的p&E的時鐘7.5MHz. Vcw=5.7. 圖沒法貼,專用的上網(wǎng)機器,任何代碼都拷不出來,程序都是敲上來的. 現(xiàn)在的問題依然沒解決.我把問題重新說一下. 問題1: 這樣讀寫FLASH 前幾天調用ROM里的程序可以寫數(shù)據(jù)了,今天改了點程序后發(fā)現(xiàn)寫也不對了,寫入了錯誤的數(shù)據(jù),懷疑是絕對定位時沒有保留地址造成的,不知會不會這樣?再改了改寫入就好了. 讀還是錯誤的數(shù)據(jù). 問題2: 怎樣校準8M下RC的頻率,如果是4M CPROG08SZ可以自動校準,但是在8M下編 程到校準CRC-8的時候就出錯(error 50). 編程用的P&E,時鐘來自debuger,7.5MHz. 單片機MC68HC908QB8,5V,8M內部RC,以下程序: //定義 uchar CTRLBYT @0X88; //擦除頁/ALL uchar CPUSPD @0X89; //震蕩器頻率:8M 內部RC uint LAST_ADDR @0X8A; //寫入的最后地址 uchar PROG_DATA[10] @0X8C; //要寫入數(shù)據(jù)存儲區(qū) void main(void) { uchar s,t; MCU_init(); self_test(); //自檢測,約需3s //FLASH erase CTRLBYT = 0; //erase page CPUSPD = 8; //8M rc asm ldhx #$de00; //要擦除的頁 asm jsr $2806; //調用ROM擦除程序 //FLASH write for(s=0; s<10; s++) PROG_DATA[s] = s; // CTRLBYT = 0; //與編程無關 CPUSPD = 8; //8M rc LAST_ADDR = 0xde09; //編程結束地址 asm ldhx #$de00; //要編程的頁 asm jsr $2809; //調用ROM編程程序 putch(0xaa); for(s=0; s<12; s++) { t = *(volatile const uchar *)(0xde00+s); //讀是錯誤的數(shù)據(jù),匯編代碼也沒看明白,地址好象是丟掉了高字節(jié) putch(t); } while(1) { RED_LIGHT = 1; } } |
|
| 11樓: | >>參與討論 |
| 作者: imwangyi 于 2006/12/16 0:11:00 發(fā)布:
CPUSPD = f(op) times 4 for QB So, CPUDPF=32. 下次說問題要明了點,否則,呵呵,難以明白是什么問題. |
|
| 12樓: | >>參與討論 |
| 作者: JerryBJ 于 2006/12/16 0:14:00 發(fā)布:
試試看 “今天改了點程序后發(fā)現(xiàn)寫也不對了,寫入了錯誤的數(shù)據(jù),懷疑是絕對定位時沒有保留地址造成的,不知會不會這樣?再改了改寫入就好了.” “t = *(volatile const uchar *)(0xde00+s); //讀是錯誤的數(shù)據(jù),匯編代碼也沒看明白,地址好象是丟掉了高字節(jié)” 讀內容的代碼本身沒有問題。在調試的MEMORY窗口中看0xDE00以及后續(xù)單元的內容,看正確的數(shù)據(jù)是什么(寫錯了還是讀錯了)。 感覺好像是地址分配沖突的問題。檢查PRM文件,地址0xDE00這一頁是否從ROM段中剝離出來; |
|
| 13樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/16 13:32:00 發(fā)布:
下面是調試界面,傳上來不容易啊 匯編的看不明白 ![]()
|
|
| 14樓: | >>參與討論 |
| 作者: JerryBJ 于 2006/12/16 21:17:00 發(fā)布:
奇怪 TSX ; 把SP的值送到HX(使HX指向s) CLR ,X ; s = 0 LDX ,X ; jump here ; CLRH ; 這一句果然有問題哦,H=0xde才對。 LDA ,X ; 讀取HX指向的單元 TSX ; 把SP的值送到HX(使HX指向s) STA 1,X ; 存放到t INC ,X ; s += 1 LDA ,X ; s >= 12? CMP #0x0C BCS *-10 ; not, loop 可不可以把你的整個工程zip發(fā)給我看看?jerry.shi@tom.com |
|
| 15樓: | >>參與討論 |
| 作者: imwangyi 于 2006/12/16 22:26:00 發(fā)布:
試試volatile uchar s,t; 這么定義就可以啦,否則,可能給優(yōu)化掉了. 因為t你沒用,呵,太智能了也不好.:P |
|
| 16樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/17 17:02:00 發(fā)布:
好,明天再借個電腦傳上來 imwangyi :局部變量前加volatile沒試,不過全局變量前曾加了volatile也試過了.大概我能想到的都試過了 |
|
| 17樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/17 17:26:00 發(fā)布:
下載后改成rar,各位大蝦有錢的出錢有力的出力啊 上面的圖我怎么看是2張啊。 ../uploadfile/200705142316406299.jpg
|
|
| 18樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/17 17:28:00 發(fā)布:
這個是 http://bbs.21ic.com/upfiles/img/200612/2006121717287461.rar |
|
| 19樓: | >>參與討論 |
| 作者: imwangyi 于 2006/12/17 21:10:00 發(fā)布:
ddtv:我其實已經試過OK后才發(fā)的,應該沒問題,呵 |
|
| 20樓: | >>參與討論 |
| 作者: JerryBJ 于 2006/12/17 22:53:00 發(fā)布:
MEMORY MODEL 檢查了你的工程設置,果然選擇了Tiny模式的MEMORY MODEL。而在此模式下,所有的指針都是8bit長度的。使用HX作為指針訪問內存的時候,H會被自動清零。解決辦法: 1)重新建立一個Small模式的工程;蛘咴赑roject Option Settings里邊,Code Generation,MEMORY MODEL選擇Small MEMORY MODEL。 或者: 2)使用一個被__far修飾的指針指向FLASH地址: unsigned CHAR* __far ptr; //定義一個全局的FAR指針; 在main中讀取FLASH的地方, ptr = (unsigned CHAR * __far)0xde00; // 初始化指針ptr // …… t = *(uCHAR * __far)(ptr + s); // 使用FAR指針讀取FLASH |
|
| 21樓: | >>參與討論 |
| 作者: JerryBJ 于 2006/12/17 23:07:00 發(fā)布:
軸了 其實不用定義ptr,在讀取的時候,用__far直接強制轉換就行了: t = *(unsigned CHAR * __far)(0xde00 + s); |
|
| 22樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/18 10:56:00 發(fā)布:
太感謝JerryBJ斑竹了!!!! 這個問題困擾了我好長時間,問了好多人都沒解決.真不知怎么感謝才好!等這個項目忙完了一定好好看看資料. 其他各位幫助過的也一并感謝!! * - 本貼最后修改時間:2006-12-18 10:58:41 修改者:ddtv |
|
| 23樓: | >>參與討論 |
| 作者: JerryBJ 于 2006/12/18 19:09:00 發(fā)布:
呵呵,不用客氣 祝調試愉快! |
|
| 24樓: | >>參與討論 |
| 作者: ddtv 于 2006/12/18 21:11:00 發(fā)布:
有時間來南京我請你吃飯哦! |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |