登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

M162外扩32k sram存储器出现的奇怪问题

作者:shs1981 栏目:单片机
M162外扩32k SRAM存储器出现的奇怪问题
主程序部分分配数组如下:
void main(void)
{
int i,j;
unsigned CHAR m[4000],n[4000],q[4000];
。。。。。。
}

将m,n,q用串口打印出来的值是(十进制):54783,59783,62783,第三个数组的地址627834000已经大于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
是不是其他地方还使用了大量的内存。容量已经不够了。
 
3楼: >>参与讨论
shs1981
大家帮帮忙啊
没有啊,我就只写了一个测试程序而已。主程序里就分配了3个数组,然后就是串口打印输出。别的什么都没写啊。

4楼: >>参与讨论
shs1981
高手们出来帮帮忙啊!
郁闷死了,这两天就卡在这里了。

5楼: >>参与讨论
shs1981
对了。我的SRAMCY62256-70
是不是太慢了,我把等待时间设置为最大了。上面所说的部分读写正常,
应该不是这个原因吧?

6楼: >>参与讨论
shs1981
真的没人知道吗?
大侠们都哪里去了?

7楼: >>参与讨论
shs1981
真的没人知道吗?
救急啊!

8楼: >>参与讨论
Asnake
是否把内部的RAM也算进去了?
 
9楼: >>参与讨论
shs1981
即使算进去也不对啊
内置只有1k的SRAM啊。我外扩的是32k的SRAM

10楼: >>参与讨论
john wu
快换编译器
朋友,今天你codevision了吗?赶快用codevision吧,icc是一个垃圾编译器。codevision从用户界面到内联汇编在到位操作都远远好于icc.

11楼: >>参与讨论
shs1981
还是不解决问题啊
数组分配地址仍旧有问题。郁闷

12楼: >>参与讨论
zhifeng
将数组定义为全局变量试试
 
13楼: >>参与讨论
农民讲习所
串口打印程序错误
 
14楼: >>参与讨论
zsmbj
对呀,是不是你的串口输出程序的问题。
分配的三个数组在实际使用中有问题吗?

15楼: >>参与讨论
shs1981
串口没问题啊
读写都正常的。

16楼: >>参与讨论
农民讲习所
读写正常不代表你打印指针正常
 
17楼: >>参与讨论
shs1981
这个是全部程序,欢迎指教!
这就是现在在调试的程序了,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楼: >>参与讨论
农民讲习所
不能在main中定义这么大的数组
unsigned CHAR m[4000],n[4000],q[4000];放在main前做全局变量。
因为分配局部变量使用内部CPU的RAM,全局才使用整个RAM。

19楼: >>参与讨论
shs1981
嗯,我在用CVAVR的时候发现这个问题了
不过,即使这样ICCAVR分配的地址也在外部ram区了啊。

另外,在CVAVR中又出现了新的问题。外部ram读写时很多区域不成功。
我的另一篇帖子有详细说明。请指教!


20楼: >>参与讨论
shs1981
就是这个:
现在改用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楼: >>参与讨论
农民讲习所
不要使用串口打印了,直接使用AVRSTUDIO仿真。
 
22楼: >>参与讨论
zsmbj
感觉程序很乱!
从分配的空间看:05 F8 15 98 25 38 是没有问题的。间隔刚好是4000

你的硬件上的RAM的CS是如何接的?

另外你的程序把初始化的m都屏蔽了,后来如何检测if(m[i]!=0x55)?




23楼: >>参与讨论
shs1981
硬件没问题的
使用ICCAVR得到的是正确的结果。

24楼: >>参与讨论
shs1981
re:感觉程序很乱!
哦,我把那部分都屏蔽了啊,原来是用数组的。后来是使用指针的。
用putchar(*p)打印的。基本上就是先写然后马上就读,结果还是错的一塌糊涂。

参与讨论
昵称:
讨论内容:
 
 
相关帖子
小弟初学ucos有甚不解,请各位大侠指点一二,谢谢!!!!
哪个大侠知道关于GB5007C-24的功能啊,谢谢
请教mega128的USART通讯问题
AVR如何与DS18B20相配
/RD /WR信号用那条指令才能产生?
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号