powerman 发表于 2008-10-2 15:40:44

请教 mega48利用引脚电平变化中断唤醒的困惑【恢复】

   请问傻孩子的《深入浅出AVR-从ATMega48/88/168开始》一书中的第4章的实例7,第109页,“在唤醒中断服务函数中将此句 PCMSK1 &= (~((1<<PCINT11)|(1<<PCINT10)|(1<<PCINT9)))去除,就只能唤醒一次。”我对这句不理解,请问你一下,其原因何在?谢谢!

NE5532 发表于 2008-10-3 10:33:37

是酱紫滴:比如我们去掉这句话,那么中断服务程序做了什么?应该是“PCICR&=(~(1<<PCIE1));”关闭了PC端电平变化中断。好的,再来看,我们按键过程本来也是会造成端口变化中断被触发,中断标志PCIFx是怎么清除的?【A】执行了中断服务程序以后被硬件清除【B】手动清除,那么中断一唤醒,中断服务程序就把PC端电平变化中断给关了,那这个标志就没人来清咯,那他就在只好等在那里。



在休眠前“PCICR|=(1<<PCIE1);”使能了中断,这个等待着的中断被立即执行,一执行就热闹了,刚刚才使能了的中断又被关闭了。



中断被关闭,单片机又被休眠,自然不再能唤醒了。



你或许会说,中断服务程序里什么都不要,让程序虚晃一枪不是就解决了么?这样,就没有地方关闭PC端口变化中断了,在按键的时候,中断服务程序还是在不断被调用,并且没有做什么有意义的事情。这样就不符合程序简洁至上的要求了。



留这个问题主要是提示读者:中断在没有被响应的时候,是可以“等”的,但是你应该估计到他等待的后果。



欢迎各位大虾继续讨论。



江海波

http://ne5532.21ic.org

E-mail:soundman@sohu.com

MSN:jhbcd@hotmail.com

本贴被 NE5532 编辑过,最后修改时间:2008-10-03,10:35:45.

msjoke 发表于 2008-10-19 10:06:31

边沿中断不需要中断标志吗?若不需要就可行,否则应该一样。

rainyss 发表于 2008-10-3 12:23:47

改用边沿中断就好了.

xinjie1023 发表于 2010-7-30 15:38:21

好文章。mega48比较特别
页: [1]
查看完整版本: 请教 mega48利用引脚电平变化中断唤醒的困惑【恢复】