csw20066 发表于 2008-7-14 12:57:15

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

turkboy 发表于 2008-7-14 13:04:28

把jmp和Call改称rjmp和rcall试试

csw20066 发表于 2008-7-14 13:26:45

可是我的程序是用C语言写的,没有用到jmp跟call的命令呀

archeng504 发表于 2008-7-14 13:50:38

栈溢出了吧!用什么编译器?

csw20066 发表于 2008-7-14 14:21:18

我的程序是在ICC AVR环境下编写的,调试是在AVR stdio 的环境下调试的,除了芯片我没有设置其他的东西。

waltonzxh 发表于 2008-7-14 15:39:03

把代码帖来看看?包括头文件

csw20066 发表于 2008-7-14 16:10:04

#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);,调用完这个函数后,不是返回执行下边的程序而是返回到程序的最开始,不知道是真没问题。

greenspace 发表于 2008-7-14 16:14:28

没用过icc,不发言

waltonzxh 发表于 2008-7-14 20:38:53

我编译过了,没有问题.我用的ICCAVR;
看看 void delay(uchar m) 编译结果先.

machao 发表于 2008-7-14 22:03:42

在ICC的Project -> Compiler Option中看Device Configuration选择是M48吗?

csw20066 发表于 2008-7-15 14:55:00

是呀,在ICC中编译是通过的,但是在AVR stdio中调试的时候就出现上述问题了。

lishenglin24 发表于 2013-1-8 14:32:49

好像是两个软件设置得不一样造成的。你可以试着检查一下avr stdio4里面的“Debug”---“AVR Simulator Options” 项,在弹出的对话窗中检查一下 Device 项是否选为 ATmega48 ,Frequency 是否正确选择了时钟频率。
页: [1]
查看完整版本: avr stdio 调试出现的问题