打印
[AVR单片机]

求助,Mega16的低功耗,开中断后为什么功耗变大?

[复制链接]
693|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
六棱螺丝刀|  楼主 | 2015-1-27 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在用mega16做一个电子门锁,电池供电需要低功耗,以前没有接触过这方面的,现在耗电方面做的非常不好,希望各位网友能点拨下。

    我想法是先屏蔽了所有功能,只有上电后睡眠,使用的是Mega16的SLEEP_MODE_PWR_DOWN模式。
    在睡眠前IO口初始化为:DDRA &= 0X00; PORTA &= 0X00; DDRB &= 0X00; PORTB &= 0X00; DDRC &= 0X00; PORTC &= 0X00; DDRD &= 0X00; PORTD &= 0X00;  外围电路上的东西都焊掉了,所有引脚相当于悬空了。这个配置是我尝试了几次后得的,这样配置在我的电路板上电流才最小。
    然后我就进入mian中的while(1)...主函数如下:
    int main(void)
    {
        IO_Init();//能正常使用外设的IO配置
        sei();
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);

        while(1) {
            IO_Sleep();//就是上面提到的输入低电平的配置

            sleep_enable();
            sei();
            sleep_cpu();
            sleep_disable();

            IO_Init();    //唤醒后再配置IO
            ErrSound();//控制蜂鸣器发声
        }

        return(1);
    }
     用上面的代码测了下,电流在1.7uA左右。可是这毕竟是测试下,功能还是要加上去了,所以第一步我就想开外部中断,因为门锁的刷卡和按键那部分电路是接在INT0 和 INT1外部中断上的,通信的方式是加了唤醒信号的韦根码。于是我就想先在SLEEP前把INT0和INT1配置为外部低电平中断(手册上写着的唤醒方式),然后再唤醒后再配置为边沿中断用于接收韦根码。
   可是就在第一步就有问题,我在IO_Sleep后加了如下代码:
    DDRD |= 0x0c;
    PORTD |= 0x0c;
    MCUCR &= ~((1 << ISC01) | (1 << ISC00) | (1 << ISC11) | (1 << ISC10));
    GICR |= (1 << INT0) | (1 << INT1);
    好了,问题来了。电流立马串到了6mA。而且就算我不加改变外部中断的IO,也就是没有DDRD |= 0x0c; PORTD |= 0x0c;这两句电流也有4mA,这就搞不懂了,只是改变个内部的中断寄存器,为什么电流就变大了呢?????
    后来我在while(1)里又加了句ErrSound()一个控制蜂鸣器发声的函数证明芯片也没有被唤醒。
    再后面就不知道该怎么继续下去了,不知道哪位弄过的指点下,谢谢了

相关帖子

沙发
ZALIN| | 2015-1-27 16:17 | 只看该作者
DDRD |= 0x0c;
这样不是设置为输出了嘛

低功耗应用把IO设置为悬空也不好啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

20

帖子

0

粉丝