比如我做了一个十字路口红绿灯的控制程序:
1. 东西的道路为主干道,一般保持绿灯畅通,而南北向为人流很小的人行道,一般保持红灯禁行。当一行人想要通行南北向时,他可以通过按按钮使南北向转为绿灯而东西向则变为红灯,从而得以通过人行路口。
2.注意,按过按钮后南北向人行道绿灯通行时间为15秒,之后南北向恢复红灯而东西向主干道再次绿灯畅通,即回归初始状态。另外,恢复初始状态后的10秒内,一直保持东西绿南北红的状态,按钮不会起作用。
3.我的想法是,在P2.7口的输入中断子程序中,通过延时15秒使南北变绿东西变红15秒,先“关闭P2.7的中断使能”,以实现上面的:“恢复初始状态后的10秒内,一直保持东西绿南北红的状态,按钮不会起作用”。其中,“P2.7不起作用”的10秒时间由后面的“启动定时器”函数计时。
4.计满10秒后,在定时器中断子程序中再重新“打开P2.7中断使能”,同时“关闭定时器”。
5.c语言程序如下
问题是:为什么io中断无法关闭,定时器中断进不去?
现在我身边没有板子也没法验证,电路用延时验证过没问题,就是程序问题,请感兴趣的朋友帮忙看看可能是什么问题,谢谢大家
题外话:其实题主的问题更适合在一些电子论坛提,CSDN单片机和嵌入式是小众,不过我进驻CSDN主要是因为这里有很多的优质博文和资源,就是
比较遗憾熟悉嵌入式领域的太少了。看到楼主的问题甚是欣慰,这还是有人的嘛!恩哼,所以还是决定回答一下。
430这种古董级别的东西,没用过,16bit,除了低功耗以为貌似没什么特别的,stm32倒是用过。所以程序语法之类的没法给你解释,你要首先保证
你的寄存器地址之类没有写错,这是第一点,也是最基础的。
提一下楼主犯得的几个错误
1.delay_ms(15000)这种长时间的延时是绝对不能使用的,这估计是被什么某教程毒害的,什么让LED闪烁,delay一下,delay个头啊,使用delay的
情况只在一些短延时的情况下使用。什么?你问我什么是短延时,1s长不长?其实1s对于单片机来说很长了,一句指令的执行都是us级别,15s?
你还让不让CPU活了?忘提了,delay定时是不准的。
2.记住中断里不能干很长时间的事情,长时间动作只在主函数里面。那中断里放什么呢?标志位,定时器寄存器肯定有某个位是用来使能定时器的吧
我看了一下题主写的定时器函数,为什么要用TA0要写两个函数?一个关定时器,一个开定时器。这样作是没有必要的。直接写TA0的CTL寄存器就
可以了吧,同理中断函数也完全没有必要写俩个。
3.灯的控制不要放在中断函数的初始化里面,请放到主函数,这是习惯问题,倒是没什么对错,只是建议最好用函数包装一下,说句题外话,MSP430有库函数?不是很清楚,有的话最好使用库函数。寄存器对读代码的人来说是很难看懂的。
上述几点并不是说题主的语法错了,而是代码结构的问题。题主的程序思路很清晰,但编程手法还是比较稚嫩。
下面按照题主的思路:
io中断无法关闭的现象应该是在灯变回初始状态的10s内按键依旧有效,那么跟定时器终端有什么关系?如果无法进入
定时器中断,应该是按键一直无效才对(你在定时器中断里开了P2.7中断)
所以问题可能是在Init__IO2(),但一般不大可能。也有可能是delay的问题,在中断函数里进行长时间的延时会出现不可预料的错误。另外你可以在定时器中断里加LED作为指示灯进行调试,看看是不是定时器中断的问题。
除此以外,单从逻辑上判断你的思路是正确的。
我建议还是先改一下你的程序结构,这比想io中断为什么无法关闭更有意义
_
单独开下定时器看看,是不是跟delay有冲突了,这么来回切感觉不大好,定义个标志为来控制不好么?中断一直使能,中断处理里面判断标志位来决定要不要做处理,也不会牺牲多少
IO 中断来判断按键的话,首先你的考虑按键抖动这个问题。。
本人做 MSP430 的按键都是使用定时器来做的,保证按键去抖动。。
开启两个定时器,一个定时器做按键判断,一个定时器做延时使用。。