搜索
bottom↓
回复: 5

ATMEGA48掉电休眠模式为何无法用外部中断唤醒?

[复制链接]

出0入0汤圆

发表于 2017-1-7 05:09:46 | 显示全部楼层 |阅读模式
本帖最后由 记忆·淡忘 于 2017-1-7 06:10 编辑

开发平台 WINAVR,器件ATMEGA48. 我想让单片机在定时若干秒后进入掉电模式,然后通过外部中断的低电平中断唤醒(产生低电平的是红外对管模块,能输出高或低电平),但从未成功唤醒,在取消休眠模式时,这个外部中断是可以正常进入的。部分程序如下
时钟源为内部1M振荡器

#include<avr/sleep.h>
void int_init(void)//外部中断初始化
{
        EICRA = 0X00;//低电平中断
        EIMSK = (1<<INT0);
        PCICR = 0X00;
}

ISR(INT0_vect)//外部中断服务函数
{
        SMCR &=~ (1<<SE);//清除休眠使能
        PORTD^=(1<<PD0);//进入此中断的指示
}

void timer1_init(void)
{
        TCCR1A = 0X00;
        TCCR1B = 0B00000000;
        TCCR1C = 0X00;
        TCNT1 = 0XECED;//定时5秒溢出中断
        TIMSK1 = 0X01;
        TCCR1B = 0B00000101;
}

ISR(TIMER1_OVF_vect)定时中断服务函数
{
        TCNT1 = 0XECED;
        SMCR = 0X05;//休眠使能,掉电模式
        sleep_mode();//进入休眠掉电模式
}

定时中断是可以进入的,掉电休眠模式貌似也能进入,但外部低电平中断在休眠模式一直无法进入。按照数据手册,这个外部低电平中断是可以唤醒MCU的啊,在进入休眠模式前,我也测过INT0对应管脚一直是高电平的,只有触发与此连接的红外对管,管脚才是低电平。

出0入0汤圆

 楼主| 发表于 2017-1-7 06:09:51 | 显示全部楼层
貌似在定时溢出中断中进入休眠模式的话,会有问题

出0入0汤圆

发表于 2017-1-7 08:47:33 | 显示全部楼层
记忆·淡忘 发表于 2017-1-7 06:09
貌似在定时溢出中断中进入休眠模式的话,会有问题

>>INT0对应管脚一直是高电平的,只有触发与此连接的红外对管,管脚才是低电平。

CKSEL定义中的复位时间是多小?
INT0低电平的时间是否能满足 "掉电唤醒条件到真正唤醒MCU 有一个延迟时间,此时间用于时钟重新启动并稳定下来。唤醒时间与熔丝位CKSEL定义的复位时间是一样的"?

出0入0汤圆

 楼主| 发表于 2017-1-7 17:55:35 | 显示全部楼层
本帖最后由 记忆·淡忘 于 2017-1-7 18:14 编辑
alias 发表于 2017-1-7 08:47
>>INT0对应管脚一直是高电平的,只有触发与此连接的红外对管,管脚才是低电平。

CKSEL定义中的复位时间 ...


你好,请教你一个问题,关于在定时起溢出中断中,对变量赋值后用if语句检测:

uint temp;
ISR(TIMER1_OVF_vect)//1秒的溢出中断
{
        TCNT1 = 0XFC2F;
        temp++;//每秒递加1
}

void main(void)
{
        初始化程序省略。。。
        while(1)
        {
                if(temp>=5)//希望产生5秒定时
                {
                        temp=0;//清零,再定时
                }
               
        }
}

程序就这样很简单,但在主函数里一直不能进入if,但如果我把这个if放进溢出中断函数里,则是可以进入的。
我把temp定义为volatile变量,则又可以在主函数进入了。

出0入0汤圆

发表于 2017-1-7 21:57:44 | 显示全部楼层
记忆·淡忘 发表于 2017-1-7 17:55
你好,请教你一个问题,关于在定时起溢出中断中,对变量赋值后用if语句检测:

uint temp;

在中断处理程序中会被改变的变量,用家必须使用volatile为变量定义,否则任何中断处理内变量值的改变,在中断处理程序结束后返回主程式後,变量的值又自动变回中断出现前的值,因为你中断处理内改变的变量值,只是变量的Copy,而非变量本身。

出0入0汤圆

 楼主| 发表于 2017-1-8 06:36:54 | 显示全部楼层
alias 发表于 2017-1-7 21:57
在中断处理程序中会被改变的变量,用家必须使用volatile为变量定义,否则任何中断处理内变量值的改变,在 ...

确实是这样,我还得多多积累啊,谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 02:03

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

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