|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
M162外扩32k sram存储器出现的奇怪问题 |
作者:shs1981 栏目:单片机 |
主程序部分分配数组如下: void main(void) { int i,j; unsigned CHAR m[4000],n[4000],q[4000]; 。。。。。。 } 将m,n,q用串口打印出来的值是(十进制):54783,59783,62783,第三个数组的地址62783+4000已经大于FFFF了,为什么呢?编译器分配地址似乎有问题啊。 编译器采用ICC AVR,已经设置编译器可以使用外置存储ram空间。 附:关于配置位: 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 发布:
是不是其他地方还使用了大量的内存。容量已经不够了。 |
3楼: | >>参与讨论 |
作者: shs1981 于 2005/4/7 10:48:00 发布:
大家帮帮忙啊 没有啊,我就只写了一个测试程序而已。主程序里就分配了3个数组,然后就是串口打印输出。别的什么都没写啊。 |
4楼: | >>参与讨论 |
作者: shs1981 于 2005/4/7 11:03:00 发布:
高手们出来帮帮忙啊! 郁闷死了,这两天就卡在这里了。 |
5楼: | >>参与讨论 |
作者: shs1981 于 2005/4/7 13:47:00 发布:
对了。我的SRAM是CY62256-70的 是不是太慢了,我把等待时间设置为最大了。上面所说的部分读写正常, 应该不是这个原因吧? |
6楼: | >>参与讨论 |
作者: shs1981 于 2005/4/7 20:41:00 发布:
真的没人知道吗? 大侠们都哪里去了? |
7楼: | >>参与讨论 |
作者: shs1981 于 2005/4/8 10:57:00 发布:
真的没人知道吗? 救急啊! |
8楼: | >>参与讨论 |
作者: Asnake 于 2005/4/8 12:08:00 发布:
是否把内部的RAM也算进去了? |
9楼: | >>参与讨论 |
作者: shs1981 于 2005/4/8 17:56:00 发布:
即使算进去也不对啊 内置只有1k的SRAM啊。我外扩的是32k的SRAM |
10楼: | >>参与讨论 |
作者: john wu 于 2005/4/8 22:12:00 发布:
快换编译器 朋友,今天你codevision了吗?赶快用codevision吧,icc是一个垃圾编译器。codevision从用户界面到内联汇编在到位操作都远远好于icc. |
11楼: | >>参与讨论 |
作者: shs1981 于 2005/4/11 19:40:00 发布:
还是不解决问题啊 数组分配地址仍旧有问题。郁闷 |
12楼: | >>参与讨论 |
作者: zhifeng 于 2005/4/12 9:06:00 发布:
将数组定义为全局变量试试 |
13楼: | >>参与讨论 |
作者: 农民讲习所 于 2005/4/12 9:35:00 发布:
串口打印程序错误 |
14楼: | >>参与讨论 |
作者: zsmbj 于 2005/4/12 9:38:00 发布:
对呀,是不是你的串口输出程序的问题。 分配的三个数组在实际使用中有问题吗? |
15楼: | >>参与讨论 |
作者: shs1981 于 2005/4/12 11:20:00 发布:
串口没问题啊 读写都正常的。 |
16楼: | >>参与讨论 |
作者: 农民讲习所 于 2005/4/12 11:27:00 发布:
读写正常不代表你打印指针正常 |
17楼: | >>参与讨论 |
作者: shs1981 于 2005/4/12 11:32:00 发布:
这个是全部程序,欢迎指教! 这就是现在在调试的程序了,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延时函数 { unsigned int i; for (i=0;i<500;i++) { } } void delay_nms(unsigned int n)//延时n毫秒 { unsigned int i; for (i=0;i<n;i++)//执行n次1毫秒延时 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; //翻转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; //翻转PB0和PB1口 delay_nms(100); } } //while(!(UCSR0A&0b10000000)); //UDR0=0x55; // UDR1=m[300]; //while(!(UCSR0A&0b00100000)); } //insert your functional code here... } |
18楼: | >>参与讨论 |
作者: 农民讲习所 于 2005/4/12 12:02:00 发布:
不能在main中定义这么大的数组 unsigned CHAR m[4000],n[4000],q[4000];放在main前做全局变量。 因为分配局部变量使用内部CPU的RAM,全局才使用整个RAM。 |
19楼: | >>参与讨论 |
作者: shs1981 于 2005/4/12 13:31:00 发布:
嗯,我在用CVAVR的时候发现这个问题了 不过,即使这样ICCAVR分配的地址也在外部ram区了啊。 另外,在CVAVR中又出现了新的问题。外部ram读写时很多区域不成功。 我的另一篇帖子有详细说明。请指教! |
20楼: | >>参与讨论 |
作者: shs1981 于 2005/4/12 13:34:00 发布:
就是这个: 现在改用CVAVR,自动生成程序框架,数组分配正常了,内置ram读写没问题的,但外扩ram读写有问题,只有部分空间读写正常,有些空间始终写不进去。 以下是全部程序: /***************************************************** 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楼: | >>参与讨论 |
作者: 农民讲习所 于 2005/4/12 13:54:00 发布:
不要使用串口打印了,直接使用AVRSTUDIO仿真。 |
22楼: | >>参与讨论 |
作者: zsmbj 于 2005/4/12 14:14:00 发布:
感觉程序很乱! 从分配的空间看:05 F8 15 98 25 38 是没有问题的。间隔刚好是4000 你的硬件上的RAM的CS是如何接的? 另外你的程序把初始化的m都屏蔽了,后来如何检测if(m[i]!=0x55)? |
23楼: | >>参与讨论 |
作者: shs1981 于 2005/4/12 14:52:00 发布:
硬件没问题的 使用ICCAVR得到的是正确的结果。 |
24楼: | >>参与讨论 |
作者: shs1981 于 2005/4/12 14:55:00 发布:
re:感觉程序很乱! 哦,我把那部分都屏蔽了啊,原来是用数组的。后来是使用指针的。 用putchar(*p)打印的。基本上就是先写然后马上就读,结果还是错的一塌糊涂。 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |