shangzhenwei 发表于 2009-10-28 19:47:09

傻孩子,我觉得《深入浅出AVR单片机》第105页中的程序这样写更好些,不知道可不可以

第105页,上方那个中断服务函数中,那3句,我觉得放在第106页
asm("SLEEP");
之后比较好,这样可以避免在执行
PCICR |= (1 << PCIE1);
SMCR = 0x50;
这两句期间,按下按键而进入中断服务程序,这样,单片机休眠之后,就又醒不过来了。不知道我想的对不对。


我越来越觉得这本书好了,能做得实验尽量都做,从书中学到的东西的确很多。谢谢!

Gorgon_Meducer 发表于 2009-10-28 23:33:05

完蛋了……手上一本书都没有了……555555555555555555
关于sleep的时序,强烈建议参考winavr头文件sleep.h里面的叙述。

楼上说的内容,我会在确认后加入第二次印刷的勘误表中。
目前为止,第二次印刷只报告发现一处错误。

Gorgon_Meducer 发表于 2009-10-30 19:41:11

正确的写法应该是

CLI();
PCMSK1 |= ....
PCICR |= (1<<PCIE1);
SMCR = 0x05;
SEI();
asm("sleep");
同时,就想你说的,将中断处理程序里面的那三句代码移动到sleep语句后面。这样就万无一失了。

shangzhenwei 发表于 2009-10-30 21:09:30

我觉得,必须将中断处理程序里面的那三句代码移动到sleep语句后面。否则在
PCICR |= (1<<PCIE1);
SMCR = 0x05;
SEI();
期间产生的中断标志,肯定会在
SEI();
之后使程序进入中断,然后出来后cpu休眠之后,还是苏醒不过来。

这种情况在16L中出现的更多,因为在16L中,没有类似PCMSK1的寄存器。当然也可以在SEI();之前加一句清除中断标志的语句。

不知道本书的勘误表出来没有,汇总的。至今还没找到。。。

Gorgon_Meducer 发表于 2009-10-31 00:14:25

恩,所有的都在论坛的勘误帖子里面了。你这部分内容,应该加入到第二次印刷的勘误表里面。

wc8841484 发表于 2009-10-31 08:20:00

路过!!!!!!!!!!

NE5532 发表于 2009-11-12 22:15:08

呵呵,确实是失误了,楼主逻辑不错!在下虚心接受!
不过再次友情提醒其他朋友,书中代码用于工程时应谨慎!
页: [1]
查看完整版本: 傻孩子,我觉得《深入浅出AVR单片机》第105页中的程序这样写更好些,不知道可不可以