avr stdio 调试出现的问题
我用avr stdio4.0版本调试mega48的C程序,但是,调试结果出现如下问题,请问是怎么回事?谢谢了。Loaded objectfile: F:\wuxiantongxun\AVR3.cof
AVR Simulator: Unsupported instruction 'jmp' at address 0x000000
AVR Simulator: Unsupported instruction 'call' at address 0x00009b
AVR Simulator: Uninitialized stack pointer used at 0x009b
AVR Simulator: Stack Overflow at 0x0119
AVR Simulator: Invalid opcode 0xffff at address 0x006060
AVR Simulator: Invalid opcode 0xffff at address 0x000061
AVR Simulator: Invalid opcode 0x90eb at address 0x000072
AVR Simulator: Invalid opcode 0xff6f at address 0x00007a
AVR Simulator: Unsupported instruction 'call' at address 0x00009b
AVR Simulator: Stack Overflow at 0x009b 把jmp和Call改称rjmp和rcall试试 可是我的程序是用C语言写的,没有用到jmp跟call的命令呀 栈溢出了吧!用什么编译器? 我的程序是在ICC AVR环境下编写的,调试是在AVR stdio 的环境下调试的,除了芯片我没有设置其他的东西。 把代码帖来看看?包括头文件 #include"iom48v.h"
#include"math.h"
代码如下:
#include"stdio.h"
#include"macros.h"
#define uchar unsigned char
#define uintunsigned int
#pragma interrupt_handler usart_rade:19
uchar s_data={0xeb,0x90,0xfe,0x73,01,01,0x75}; //主机发送地址最高位为0,
//从机发送地址最高位为1
uchar r_data;
uchar dis={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7D,0x07,0x7F,0x6F};//0~9
uchar num; //8 times
uchar reok;
void delay(uchar m);
void display(uchar da);
void usart_rade()//中断接收数据
{
while(!(UCSR0A&(1<<RXC0)));
r_data= UDR0;
num++;
if(r_data==0xeb)
{
if(num>1)
{
if(r_data==0x90)
{
if(num>2)
{
if(r_data==0xfe);
else num=0;
}
}
else num=0;
}
}
else num=0;
if(num==8)
{reok=1;}
}
void usart_send(uchar da[])//发送数据
{
uchar i=0;
for(i=0;i<7;i++)
{
while(!(UCSR0A&(1<<UDRE0)));
UDR0=da;
}
}
void main()
{
uchar i,m,sum,r_time;
UCSR0B=0x98; //
UBRR0=191; //设置波特率2400
sum=0;
i=0;
m=0;
num=0;
r_time=0;
DDRC=(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
PORTC=0xff;
i=PINC;
DDRB=0x27;
PORTB=0xff;
check: if(!(PINB&1<<PB4)) //检测有无发送按键按下,有,责发送数据
{
// DDRB=!(1<<DDB5);
//PORTB=0xff;
PINB=PINB&~BIT(PB5);
PINB=PINB|BIT(PB5);
delay(125);
//DDRC=(1<<DDC3);
PINC=PINC&~BIT(PC3);
display(2);
////////////////////////////////////
while(!(PINB&1<<PB4));// 去抖动
SREG=0x80; //开中断
m++; //发送次数加一
for(i=0;i<5;i++) //连续发送5次数据
{
usart_send(s_data);
delay(125); //delay a moment
}
PINC=PINC&~BIT(PC3); //显示成功发送次数
display(m/10);
PINC=PINC&~BIT(PC2)|BIT(PC3);
display(m%10);
}
delay(10);
if(reok==1)
{
// SREG=0x00; //close interrupt
num=0;
if(r_data&0x80) //判断是否为从机发送的数据
{
for(i=3;i<6;i++) //计算校验和
{
sum+=r_data;
}
if(sum==r_data)//判断校验和
{
r_time++; //成功计数加一
PINB=PINB&~BIT(PB5);
delay(10);
PINB=PINB|BIT(PB5);
PINC=PINC&~BIT(PC1)|BIT(PC2)|BIT(PC3); //显示成功接收次数
display(r_time/10);
PINC=PINC&~BIT(PC0)|BIT(PC1)|BIT(PC2)|BIT(PC3);
display(r_time%10);
DDRC=(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0);
}
goto check;
}
else
{
goto check;
}
}
}
void delay(uchar m)
{
uchar i,n;
n=m;
while(n--)
for(i=0;i<100;i++)
{}
}
void display(uchar da)
{
uchar i;
switch(da)
{
case 0: da=dis;break;
case 1: da=dis;break;
case 2: da=dis;break;
case 3: da=dis;break;
case 4: da=dis;break;
case 5: da=dis;break;
case 6: da=dis;break;
case 7: da=dis;break;
case 8: da=dis;break;
case 9: da=dis;break;
}
//PINB&=~BIT(PB2);
for(i=0;i<8;i++)
{
if(da&0x01==1)
PINB=PINB|BIT(PB1);
else
PINB&=~BIT(PB1);
//DDRB=0x27;
PINB&=~BIT(PB2)|(1<<PB0);
PINB&=~BIT(PB0);
da=da>>1;
}
// PINB=PINB|BIT(PB2);
}
还有程序在调试的时候,在执行到display(2);,调用完这个函数后,不是返回执行下边的程序而是返回到程序的最开始,不知道是真没问题。 没用过icc,不发言 我编译过了,没有问题.我用的ICCAVR;
看看 void delay(uchar m) 编译结果先. 在ICC的Project -> Compiler Option中看Device Configuration选择是M48吗? 是呀,在ICC中编译是通过的,但是在AVR stdio中调试的时候就出现上述问题了。 好像是两个软件设置得不一样造成的。你可以试着检查一下avr stdio4里面的“Debug”---“AVR Simulator Options” 项,在弹出的对话窗中检查一下 Device 项是否选为 ATmega48 ,Frequency 是否正确选择了时钟频率。
页:
[1]