| 
  |||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe  | 
  
讀寫(xiě)外部ram不正確,疑問(wèn)。。。。。。 | 
  
| 作者:012278 欄目:單片機(jī) | 
我用的是meg162的板子,外擴(kuò)32K的ram,只寫(xiě)了一個(gè)測(cè)試讀寫(xiě)功能的小程序,卻始終運(yùn)行不正常。 程序如下: // Target : M162 // CRYSTAL: 11.0592MHZ #include <iom162v.h> #include <macros.h> #define RUN_LIGHT PORTD|=0x10 //PC0 RUN LED light #define RUN_BLACK PORTD&=0xEF //PC0 RUN LED black unsigned int i; extern unsigned CHAR data[2000]; //define mappings void mapping_init(void) { asm( ".area MEMORY(abs)\n" ".org 0x2000\n" " _data:: .blkb 2000\n" ".text\n" ); } void port_init(void) { PORTA = 0xff; //PA OUTPUT DDRA = 0xFF; PORTB = 0xFF; //PB0-PB2 input, others OUTPUT DDRB = 0xb8; PORTC = 0xf3; //PC OUTPUT DDRC = 0xFF; PORTD = 0XeF; DDRD = 0x72; PORTE = 0x07; DDRE = 0x00; } void InitSys() { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR= 0x80; EMCUCR = 0x00; TIMSK= 0x00; //timer interrupt sources ETIMSK=0x00; GICR= 0x00; PCMSK0=0x00; PCMSK1=0x00; SEI(); //re-enable interrupts //all peripherals are now initialised } void main(void){ unsigned int j; InitSys(); for (j=0;j<2000;j++){ data[j]=0xf0; } if (data[5]==0xf0) {RUN_LIGHT;} //讀取數(shù)組某一位的值,如果與寫(xiě)入的一致,測(cè)試燈亮 } 程序運(yùn)行的結(jié)果應(yīng)該是測(cè)試燈直接變亮才對(duì),可是它根本沒(méi)反應(yīng) 測(cè)試燈沒(méi)有問(wèn)題,已經(jīng)檢查過(guò)了 我也翻過(guò)以前的帖子,數(shù)組的定義和操作沒(méi)看出什么不同 想不出來(lái)是哪里的問(wèn)題 我用的ICCAVR,哪位大蝦可以答疑解惑嗎? 先行謝過(guò)。  | 
  
| 2樓: | >>參與討論 | 
| 作者: huangxz 于 2006/9/15 21:40:00 發(fā)布:
         片選有問(wèn)題沒(méi)有?  | 
  |
| 3樓: | >>參與討論 | 
| 作者: xwj 于 2006/9/16 8:50:00 發(fā)布:
         地址鎖存器要用74AHC或74F 再核對(duì)下SRAM的速度 必要時(shí)插入等待周期  | 
  |
| 4樓: | >>參與討論 | 
| 作者: 012278 于 2006/9/18 15:12:00 發(fā)布:
         感謝樓上兩位的幫助 我根據(jù)你們的意見(jiàn)更改了設(shè)置后出現(xiàn)了個(gè)新現(xiàn)象 如果我寫(xiě)入常量給數(shù)組賦值時(shí),程序運(yùn)行正常,測(cè)試燈亮 如果換成變量給數(shù)組賦值,結(jié)果就不對(duì)了 哪位大蝦指點(diǎn)一下啊  * - 本貼最后修改時(shí)間:2006-9-18 20:17:34 修改者:012278  | 
  |
| 5樓: | >>參與討論 | 
| 作者: dadodo 于 2006/9/18 15:22:00 發(fā)布:
         還是速度問(wèn)題  | 
  |
| 6樓: | >>參與討論 | 
| 作者: 極限思考 于 2006/9/18 15:29:00 發(fā)布:
         同意樓上  | 
  |
| 7樓: | >>參與討論 | 
| 作者: 012278 于 2006/9/18 20:40:00 發(fā)布:
         求助求助 不光是這個(gè)地方 在我寫(xiě)的另一個(gè)串口測(cè)試小程序里 也出現(xiàn)了同樣的問(wèn)題 可以給串口常量 但是給他個(gè)變量就不行了 不過(guò)在沒(méi)有外擴(kuò)ram時(shí)是沒(méi)有這個(gè)現(xiàn)象的  | 
  |
| 8樓: | >>參與討論 | 
| 作者: 壞孩子 于 2006/9/19 10:49:00 發(fā)布:
         不要使用絕對(duì)定位 使用ICC的外擴(kuò)存儲(chǔ)器功能的時(shí)候,不要使用他的絕對(duì)定位代碼。有BUG。 外擴(kuò)了存儲(chǔ)器以后,直接使用就可以了。 系統(tǒng)會(huì)自動(dòng)把全局變量放到外部存儲(chǔ)器中。 ICC自動(dòng)把軟件堆棧和硬件堆棧放到內(nèi)部的存儲(chǔ)器中,而外部存儲(chǔ)器就全部用來(lái)存放全局變量了。 ICC的BUG是,他自己絕對(duì)定位的代碼,使用以后,系統(tǒng)回仍然無(wú)視那段已經(jīng)占用的空間,其他全局變量會(huì)覆蓋那段區(qū)域。 樓主雖然使用了絕對(duì)定位,但是在初始化的時(shí)候忘記了調(diào)用函數(shù) void mapping_init(void); 事實(shí)上,在初始化的時(shí)候調(diào)用一下就可以了。 但是,仍然會(huì)有錯(cuò)誤。 正確的使用方法是: include <iom162v.h> #include <macros.h> #define RUN_LIGHT PORTD|=0x10 //PC0 RUN LED light #define RUN_BLACK PORTD&=0xEF //PC0 RUN LED black unsigned int i; unsigned CHAR data[2000]; void port_init(void) { PORTA = 0xff; //PA OUTPUT DDRA = 0xFF; PORTB = 0xFF; //PB0-PB2 input, others OUTPUT DDRB = 0xb8; PORTC = 0xf3; //PC OUTPUT DDRC = 0xFF; PORTD = 0XeF; DDRD = 0x72; PORTE = 0x07; DDRE = 0x00; } void InitSys() { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR= 0x80; EMCUCR = 0x00; TIMSK= 0x00; //timer interrupt sources ETIMSK=0x00; GICR= 0x00; PCMSK0=0x00; PCMSK1=0x00; SEI(); //re-enable interrupts //all peripherals are now initialised } void main(void){ unsigned int j; InitSys(); for (j=0;j<2000;j++){ data[j]=0xf0; } if (data[5]==0xf0) {RUN_LIGHT;} //讀取數(shù)組某一位的值,如果與寫(xiě)入的一致,測(cè)試燈亮 }  | 
  |
  | 
    
 
  | 
  
| 免費(fèi)注冊(cè)為維庫(kù)電子開(kāi)發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 | 
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號(hào)  |