[AVR单片机] 【求助】在main函数中调用子函数就会出错。

[复制链接]
2308|3
 楼主| handy_bupt 发表于 2008-12-9 16:19 | 显示全部楼层 |阅读模式
    我用的是AVR Studio 4.14,编译器用的WinAVR20070525,之前没用过AVR单片机,现在做一个点灯的小程序做测试。却发现,所有的语句都写在main函数中就没有问题,只要是写成单独的子函数,在main函数中调用,就不会出现结果,灯也不会闪,请达人指教!谢谢!
    运行正确的程序如下:
------------------------------------------------------------------
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
    unsigned char i=0;
    unsigned char led = 0xfe;
    DDRA = 0x07;
    while(1)
    { 
        PORTA = led;
        for(i=0;i<10;i=i+1)
        {
            _delay_loop_2(50000);
        }

        led <<= 1;
        led |= 0xf1;
        if(led == 0xf7)
        {
            led = 0xfe;
        }
    }
    return 0;
}
------------------------------------------------------------------
写成单独的函数,在main中调用,就出不来结果了
------------------------------------------------------------------
#include <avr/io.h>
#include <util/delay.h>

void my_fun(void);

int main(void)
{
//    unsigned char i=0;
    unsigned char led = 0xfe;
    DDRA = 0x07;
    while(1)
    { 
        PORTA = led;
//      for(i=0;i<10;i=i+1)
//      {
//         _delay_loop_2(50000);
//      }
        my_fun();
        led <<= 1;
        led |= 0xf1;
        if(led == 0xf7)
        {
            led = 0xfe;
        }
    }
    return 0;
}

void my_fun(void)
{
    unsigned char i=0;
    for(i=0;i<10;i=i+1)
    {
        _delay_loop_2(50000);
    }
}
------------------------------------------------------------------
我在网上查了一下,也有一些人出现这种情况,大多是说是优化级、熔丝位设置的问题,但是我将M103C的熔丝位也设置成1,优化级设置成00级,也还是这种情况。不知道怎么回事,为此郁闷了好几天了《《
 楼主| handy_bupt 发表于 2008-12-9 16:27 | 显示全部楼层

在main函数中调用子函数就会出错

PORTA的低3位分别接了一个发光二极管,程序是让这三个发光二极管循环闪烁。
tiankai001 发表于 2008-12-13 08:41 | 显示全部楼层

在main函数中调用子函数就会出错

问题解决了吗,表面看应该没问题
编译的时候提示错误或者警告了吗
laidaihua 发表于 2008-12-14 21:36 | 显示全部楼层

我觉得应该是堆栈设置问题。。

有可能是将编译器的默认堆栈空间设置到了其它地方所致。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部