搜索
bottom↓
回复: 11

avr stdio 调试出现的问题

[复制链接]

出0入0汤圆

发表于 2008-7-14 12:57:15 | 显示全部楼层 |阅读模式
我用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

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-7-14 13:04:28 | 显示全部楼层
把jmp和Call改称rjmp和rcall试试

出0入0汤圆

 楼主| 发表于 2008-7-14 13:26:45 | 显示全部楼层
可是我的程序是用C语言写的,没有用到jmp跟call的命令呀

出0入0汤圆

发表于 2008-7-14 13:50:38 | 显示全部楼层
栈溢出了吧!用什么编译器?

出0入0汤圆

 楼主| 发表于 2008-7-14 14:21:18 | 显示全部楼层
我的程序是在ICC AVR环境下编写的,调试是在AVR stdio 的环境下调试的,除了芯片我没有设置其他的东西。

出0入0汤圆

发表于 2008-7-14 15:39:03 | 显示全部楼层
把代码帖来看看?包括头文件

出0入0汤圆

 楼主| 发表于 2008-7-14 16:10:04 | 显示全部楼层
#include"iom48v.h"
  #include"math.h"
代码如下:
  #include"stdio.h"
  #include"macros.h"
  #define uchar unsigned char
  #define uint  unsigned int
  #pragma interrupt_handler usart_rade:19
  
  uchar s_data[7]={0xeb,0x90,0xfe,0x73,01,01,0x75}; //主机发送地址最高位为0,
                                                  //从机发送地址最高位为1
  uchar r_data[7];
  uchar dis[10]={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[num]= UDR0;
   num++;
   if(r_data[0]==0xeb)
   {
             if(num>1)
          {
           if(r_data[1]==0x90)
           {
            if(num>2)
                {
                 if(r_data[2]==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[3]&0x80)   //判断是否为从机发送的数据
         {
                  for(i=3;i<6;i++)   //计算校验和
             {
                       sum+=r_data;
                   }
                if(sum==r_data[6])  //判断校验和
                    {
                    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[0];break;
        case 1: da=dis[1];break;
        case 2: da=dis[2];break;
        case 3: da=dis[3];break;
        case 4: da=dis[4];break;
        case 5: da=dis[5];break;
        case 6: da=dis[6];break;
        case 7: da=dis[7];break;
        case 8: da=dis[8];break;
        case 9: da=dis[9];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);,调用完这个函数后,不是返回执行下边的程序而是返回到程序的最开始,不知道是真没问题。

出0入0汤圆

发表于 2008-7-14 16:14:28 | 显示全部楼层
没用过icc,不发言

出0入0汤圆

发表于 2008-7-14 20:38:53 | 显示全部楼层
我编译过了,没有问题.我用的ICCAVR;
看看 void delay(uchar m) 编译结果先  .

出0入0汤圆

发表于 2008-7-14 22:03:42 | 显示全部楼层
在ICC的Project -> Compiler Option中看Device Configuration选择是M48吗?

出0入0汤圆

 楼主| 发表于 2008-7-15 14:55:00 | 显示全部楼层
是呀,在ICC中编译是通过的,但是在AVR stdio中调试的时候就出现上述问题了。

出0入0汤圆

发表于 2013-1-8 14:32:49 | 显示全部楼层
好像是两个软件设置得不一样造成的。你可以试着检查一下avr stdio4里面的“Debug”---“AVR Simulator Options” 项,在弹出的对话窗中检查一下 Device 项是否选为 ATmega48 ,Frequency 是否正确选择了时钟频率。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 06:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表