|
技術(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 |
M162外擴(kuò)32k sram存儲(chǔ)器出現(xiàn)的奇怪問(wèn)題 |
作者:shs1981 欄目:單片機(jī) |
主程序部分分配數(shù)組如下: void main(void) { int i,j; unsigned CHAR m[4000],n[4000],q[4000]; 。。。。。。 } 將m,n,q用串口打印出來(lái)的值是(十進(jìn)制):54783,59783,62783,第三個(gè)數(shù)組的地址62783+4000已經(jīng)大于FFFF了,為什么呢?編譯器分配地址似乎有問(wèn)題啊。 編譯器采用ICC AVR,已經(jīng)設(shè)置編譯器可以使用外置存儲(chǔ)ram空間。 附:關(guān)于配置位: void init_devices(void) { CLI(); CLKPR=0B10000000; CLKPR=0B00000000; port_init(); timer0_init(); uart0_init(); uart1_init(); MCUCR= 0xC0; //00 EMCUCR = 0x4E;//00 GICR=0x00; TIMSK= 0x02; //timer interrupt sources ETIMSK=0x00; GICR= 0x00; PCMSK0=0xFF; PCMSK1=0xFF; SEI(); } |
2樓: | >>參與討論 |
作者: zsmbj 于 2005/4/7 8:01:00 發(fā)布:
是不是其他地方還使用了大量的內(nèi)存。容量已經(jīng)不夠了。 |
3樓: | >>參與討論 |
作者: shs1981 于 2005/4/7 10:48:00 發(fā)布:
大家?guī)蛶兔Π?br>沒(méi)有啊,我就只寫(xiě)了一個(gè)測(cè)試程序而已。主程序里就分配了3個(gè)數(shù)組,然后就是串口打印輸出。別的什么都沒(méi)寫(xiě)啊。 |
4樓: | >>參與討論 |
作者: shs1981 于 2005/4/7 11:03:00 發(fā)布:
高手們出來(lái)幫幫忙! 郁悶死了,這兩天就卡在這里了。 |
5樓: | >>參與討論 |
作者: shs1981 于 2005/4/7 13:47:00 發(fā)布:
對(duì)了。我的SRAM是CY62256-70的 是不是太慢了,我把等待時(shí)間設(shè)置為最大了。上面所說(shuō)的部分讀寫(xiě)正常, 應(yīng)該不是這個(gè)原因吧? |
6樓: | >>參與討論 |
作者: shs1981 于 2005/4/7 20:41:00 發(fā)布:
真的沒(méi)人知道嗎? 大俠們都哪里去了? |
7樓: | >>參與討論 |
作者: shs1981 于 2005/4/8 10:57:00 發(fā)布:
真的沒(méi)人知道嗎? 救急! |
8樓: | >>參與討論 |
作者: Asnake 于 2005/4/8 12:08:00 發(fā)布:
是否把內(nèi)部的RAM也算進(jìn)去了? |
9樓: | >>參與討論 |
作者: shs1981 于 2005/4/8 17:56:00 發(fā)布:
即使算進(jìn)去也不對(duì)啊 內(nèi)置只有1k的SRAM啊。我外擴(kuò)的是32k的SRAM |
10樓: | >>參與討論 |
作者: john wu 于 2005/4/8 22:12:00 發(fā)布:
快換編譯器 朋友,今天你codevision了嗎?趕快用codevision吧,icc是一個(gè)垃圾編譯器。codevision從用戶界面到內(nèi)聯(lián)匯編在到位操作都遠(yuǎn)遠(yuǎn)好于icc. |
11樓: | >>參與討論 |
作者: shs1981 于 2005/4/11 19:40:00 發(fā)布:
還是不解決問(wèn)題啊 數(shù)組分配地址仍舊有問(wèn)題。郁悶 |
12樓: | >>參與討論 |
作者: zhifeng 于 2005/4/12 9:06:00 發(fā)布:
將數(shù)組定義為全局變量試試 |
13樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2005/4/12 9:35:00 發(fā)布:
串口打印程序錯(cuò)誤 |
14樓: | >>參與討論 |
作者: zsmbj 于 2005/4/12 9:38:00 發(fā)布:
對(duì)呀,是不是你的串口輸出程序的問(wèn)題。 分配的三個(gè)數(shù)組在實(shí)際使用中有問(wèn)題嗎? |
15樓: | >>參與討論 |
作者: shs1981 于 2005/4/12 11:20:00 發(fā)布:
串口沒(méi)問(wèn)題啊 讀寫(xiě)都正常的。 |
16樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2005/4/12 11:27:00 發(fā)布:
讀寫(xiě)正常不代表你打印指針正常 |
17樓: | >>參與討論 |
作者: shs1981 于 2005/4/12 11:32:00 發(fā)布:
這個(gè)是全部程序,歡迎指教! 這就是現(xiàn)在在調(diào)試的程序了,ICCAVR的,地址分配還是在最后的空間。 /ICC-AVR application builder : 2005-3-19 17:42:25 // Target : M162 // CRYSTAL: 8.0000Mhz #include <iom162v.h> #include <macros.h> unsigned CHAR flag=0; void port_init(void) { PORTA = 0xFF; DDRA = 0xFF; PORTB = 0xFF; DDRB = 0x00; PORTC = 0xFF; DDRC = 0x00; PORTD = 0xFF; DDRD = 0x00; PORTE = 0x07; DDRE = 0x00; } //TIMER0 initialisation - prescale:64 // WGM: Normal // desired VALUE: 1KHz // actual VALUE: 1.000KHz (0.0%) void timer0_init(void) { TCCR0= 0x00; //stop TCNT0= 0x83; //set count OCR0= 0x7D; //set compare VALUE TCCR0= 0x03; //start timer } #pragma interrupt_handler timer0_ovf_isr:18 void timer0_ovf_isr(void) { TCNT0= 0x83; //reload counter VALUE PORTA=~PINA; } //UART0 initialisation // desired baud rate: 9600 // actual: baud rate:9615 (0.2%) // CHAR size: 8 bit // parity: Disabled void uart0_init(void) { UCSR0B = 0x00; //disable while setting baud rate UCSR0A = 0x00; //disable while setting baud rate UBRR0L =51; //set baud rate 8MHZ/51; 11.059MHz/71 /*//******************************************************** OSC 8MHZ 11.059 4800 103 143 9600 51 71 19.2k 25 35 28.8k 16 23 38.4k 12 17 57.6k 8 11 115.2k 3 5 //********************************************************* */ UBRR0H = 0x00; UCSR0C = 0x86; UCSR0A = 0x00; //enable UCSR0B = 0xD8; //enable } #pragma interrupt_handler uart0_rx_isr:20 void uart0_rx_isr(void) { flag=1; //uart has received a CHARacter in UDR } #pragma interrupt_handler uart0_tx_isr:24 void uart0_tx_isr(void) { //CHARacter has been transmitted } //UART1 initialisation // desired baud rate:9600 // actual baud rate:9615 (0.2%) // CHAR size: 8 bit // parity: Disabled void uart1_init(void) { UCSR1B = 0x00; //disable while setting baud rate UCSR1A = 0x00; //disable while setting baud rate UBRR1L =51; //set baud rate =9600/51,19200/25 UBRR1H = 0x00; UCSR1C = 0x86; //UCSR1C = 0x06;?? UCSR1A = 0x00; //enable UCSR1B = 0xD8; //enable UCSR1B = 0xD8;? } #pragma interrupt_handler uart1_rx_isr:21 void uart1_rx_isr(void) { //uart has received a CHARacter in UDR } #pragma interrupt_handler uart1_tx_isr:25 void uart1_tx_isr(void) { //CHARacter has been transmitted } //call this routine to initialise all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts CLKPR=0B10000000; CLKPR=0B00000000; port_init(); timer0_init(); uart0_init(); uart1_init(); MCUCR= 0xC0; //00 EMCUCR = 0x4E;//00 // GIMSK= 0x00; GICR=0x00; TIMSK= 0x02; //timer interrupt sources ETIMSK=0x00; GICR= 0x00; PCMSK0=0xFF; PCMSK1=0xFF; SEI(); //re-enable interrupts //all peripherals are now initialised } void delay_1ms(void)//1ms延時(shí)函數(shù) { unsigned int i; for (i=0;i<500;i++) { } } void delay_nms(unsigned int n)//延時(shí)n毫秒 { unsigned int i; for (i=0;i<n;i++)//執(zhí)行n次1毫秒延時(shí) delay_1ms(); } // void main(void) { int i,j; unsigned CHAR m[4000],n[4000],q[4000]; CHAR k; //unsigned int m[1000]; init_devices(); DDRD=0B00111000; //定義D口的PD3、PD4,PD5為輸出口 //UDR0=0X11; for(i=0;i<4000;i++)m[i]=0x55; while(0) { delay_nms(1000); PORTD^=0B00111000; //翻轉(zhuǎn)PB0和PB1口 } while(1) { // UDR0=0X72; // delay_nms(400); for(i=0;i<1;i++){ UDR0=(int)m>>8; delay_nms(1000); UDR0=(int)m&255; delay_nms(3000); UDR0=(int)n>>8; delay_nms(1000); UDR0=(int)n&255; delay_nms(3000); UDR0=(int)q>>8; delay_nms(1000); UDR0=(int)q&255; delay_nms(3000); //return; } for(i=3250;i<4000;i++){ //if(m[i]==i) { UDR0=m[i]; //PORTD^=0B00111000; //翻轉(zhuǎn)PB0和PB1口 delay_nms(100); } } //while(!(UCSR0A&0b10000000)); //UDR0=0x55; // UDR1=m[300]; //while(!(UCSR0A&0b00100000)); } //insert your functional code here... } |
18樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2005/4/12 12:02:00 發(fā)布:
不能在main中定義這么大的數(shù)組 unsigned CHAR m[4000],n[4000],q[4000];放在main前做全局變量。 因?yàn)榉峙渚植孔兞渴褂脙?nèi)部CPU的RAM,全局才使用整個(gè)RAM。 |
19樓: | >>參與討論 |
作者: shs1981 于 2005/4/12 13:31:00 發(fā)布:
嗯,我在用CVAVR的時(shí)候發(fā)現(xiàn)這個(gè)問(wèn)題了 不過(guò),即使這樣ICCAVR分配的地址也在外部ram區(qū)了啊。 另外,在CVAVR中又出現(xiàn)了新的問(wèn)題。外部ram讀寫(xiě)時(shí)很多區(qū)域不成功。 我的另一篇帖子有詳細(xì)說(shuō)明。請(qǐng)指教! |
20樓: | >>參與討論 |
作者: shs1981 于 2005/4/12 13:34:00 發(fā)布:
就是這個(gè): 現(xiàn)在改用CVAVR,自動(dòng)生成程序框架,數(shù)組分配正常了,內(nèi)置ram讀寫(xiě)沒(méi)問(wèn)題的,但外擴(kuò)ram讀寫(xiě)有問(wèn)題,只有部分空間讀寫(xiě)正常,有些空間始終寫(xiě)不進(jìn)去。 以下是全部程序: /***************************************************** This program was produced by the CodeWizardAVR V1.24.4a STANDARD Automatic Program Generator ?COPYRIGHT 1998-2004 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com e-mail:office@hpinfotech.com Chip type : ATmega162L Program type : Application Clock frequency : 8.000000 MHz MEMORY MODEL : Small External SRAM size : 32768 Ext. SRAM wait state: 0 Data Stack size : 256 *****************************************************/ #include <mega162.h> #include <Delay.h> #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC) // USART0 RECEIVER buffer #define RX_BUFFER_SIZE0 8 CHAR rx_buffer0[RX_BUFFER_SIZE0]; #if RX_BUFFER_SIZE0<256 unsigned CHAR rx_wr_index0,rx_rd_index0,rx_counter0; #else unsigned int rx_wr_index0,rx_rd_index0,rx_counter0; #endif // This flag is set on USART0 RECEIVER buffer overflow bit rx_buffer_overflow0; // USART0 RECEIVER interrupt service routine interrupt [USART0_RXC] void usart0_rx_isr(void) { CHAR status,data; status=UCSR0A; data=UDR0; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer0[rx_wr_index0]=data; if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0; if (++rx_counter0 == RX_BUFFER_SIZE0) { rx_counter0=0; rx_buffer_overflow0=1; }; }; } #ifndef _DEBUG_TERMINAL_IO_ // Get a CHARacter from the USART0 RECEIVER buffer #define _ALTERNATE_GETCHAR_ #pragma used+ CHAR getCHAR(void) { CHAR data; while (rx_counter0==0); data=rx_buffer0[rx_rd_index0]; if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0; #asm("cli") --rx_counter0; #asm("sei") return data; } #pragma used- #endif // USART1 RECEIVER buffer #define RX_BUFFER_SIZE1 8 CHAR rx_buffer1[RX_BUFFER_SIZE1]; #if RX_BUFFER_SIZE1<256 unsigned CHAR rx_wr_index1,rx_rd_index1,rx_counter1; #else unsigned int rx_wr_index1,rx_rd_index1,rx_counter1; #endif // This flag is set on USART1 RECEIVER buffer overflow bit rx_buffer_overflow1; // USART1 RECEIVER interrupt service routine interrupt [USART1_RXC] void usart1_rx_isr(void) { CHAR status,data; status=UCSR1A; data=UDR1; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer1[rx_wr_index1]=data; if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0; if (++rx_counter1 == RX_BUFFER_SIZE1) { rx_counter1=0; rx_buffer_overflow1=1; }; }; } // Get a CHARacter from the USART1 RECEIVER buffer #pragma used+ CHAR getCHAR1(void) { CHAR data; while (rx_counter1==0); data=rx_buffer1[rx_rd_index1]; if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0; #asm("cli") --rx_counter1; #asm("sei") return data; } #pragma used- // Write a CHARacter to the USART1 Transmitter #pragma used+ void putCHAR1(CHAR c) { while ((UCSR1A & DATA_REGISTER_EMPTY)==0); UDR1=c; } #pragma used- // STANDARD Input/Output functions #include <stdio.h> // Declare your GLOBAL variables here unsigned CHAR m[4000],n[4000],q[4000]; unsigned CHAR *p; void main(void) { // Declare your local variables here unsigned int i,k; // CRYSTAL Oscillator division factor: 1 CLKPR=0x80; CLKPR=0x00; // Input/Output PORTs initialization // PORT A initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTA=0x00; DDRA=0x00; // PORT B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // PORT C initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // PORT D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTD=0x00; DDRD=0x00; // PORT E initialization // Func2=In Func1=In Func0=In // State2=T State1=T State0=T PORTE=0x00; DDRE=0x00; // Timer/Counter 0 initialization // Clock source: SYSTEM Clock // Clock VALUE: Timer 0 Stopped // Mode: Normal top=FFh // OC0 OUTPUT: Disconnected TCCR0=0x00; TCNT0=0x00; OCR0=0x00; // Timer/Counter 1 initialization // Clock source: SYSTEM Clock // Clock VALUE: Timer 1 Stopped // Mode: Normal top=FFFFh // OC1A OUTPUT: Discon. // OC1B OUTPUT: Discon. // Noise Canceler: Off // Input Capture on Falling Edge TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: SYSTEM Clock // Clock VALUE: Timer 2 Stopped // Mode: Normal top=FFh // OC2 OUTPUT: Disconnected ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; // Timer/Counter 3 initialization // Clock VALUE: Timer 3 Stopped // Mode: Normal top=FFFFh // Noise Canceler: Off // Input Capture on Falling Edge // OC3A OUTPUT: Discon. // OC3B OUTPUT: Discon. TCCR3A=0x00; TCCR3B=0x00; TCNT3H=0x00; TCNT3L=0x00; ICR3H=0x00; ICR3L=0x00; OCR3AH=0x00; OCR3AL=0x00; OCR3BH=0x00; OCR3BL=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // INT2: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-15: Off // External SRAM page configuration: // - / 0000h - 7FFFh // Lower page wait state(s): None // Upper page wait state(s): 2r/w+1addr MCUCR=0xC0; EMCUCR=0x4e; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; ETIMSK=0x00; // USART0 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART0 RECEIVER: On // USART0 Transmitter: On // USART0 Mode: Asynchronous // USART0 Baud rate: 9600 UCSR0A=0x00; UCSR0B=0x98; UCSR0C=0x86; UBRR0H=0x00; UBRR0L=0x33; // USART1 initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART1 RECEIVER: On // |
21樓: | >>參與討論 |
作者: 農(nóng)民講習(xí)所 于 2005/4/12 13:54:00 發(fā)布:
不要使用串口打印了,直接使用AVRSTUDIO仿真。 |
22樓: | >>參與討論 |
作者: zsmbj 于 2005/4/12 14:14:00 發(fā)布:
感覺(jué)程序很亂! 從分配的空間看:05 F8 15 98 25 38 是沒(méi)有問(wèn)題的。間隔剛好是4000 你的硬件上的RAM的CS是如何接的? 另外你的程序把初始化的m都屏蔽了,后來(lái)如何檢測(cè)if(m[i]!=0x55)? |
23樓: | >>參與討論 |
作者: shs1981 于 2005/4/12 14:52:00 發(fā)布:
硬件沒(méi)問(wèn)題的 使用ICCAVR得到的是正確的結(jié)果。 |
24樓: | >>參與討論 |
作者: shs1981 于 2005/4/12 14:55:00 發(fā)布:
re:感覺(jué)程序很亂! 哦,我把那部分都屏蔽了啊,原來(lái)是用數(shù)組的。后來(lái)是使用指針的。 用putchar(*p)打印的;旧暇褪窍葘(xiě)然后馬上就讀,結(jié)果還是錯(cuò)的一塌糊涂。 |
|
|
免費(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) |