daanfb 2017-01-20 04:18 采纳率: 0%
浏览 1545
已结题

msp430F5438程序,为什么不能在中断中关本中断

比如我做了一个十字路口红绿灯的控制程序:
1. 东西的道路为主干道,一般保持绿灯畅通,而南北向为人流很小的人行道,一般保持红灯禁行。当一行人想要通行南北向时,他可以通过按按钮使南北向转为绿灯而东西向则变为红灯,从而得以通过人行路口。

2.注意,按过按钮后南北向人行道绿灯通行时间为15秒,之后南北向恢复红灯而东西向主干道再次绿灯畅通,即回归初始状态。另外,恢复初始状态后的10秒内,一直保持东西绿南北红的状态,按钮不会起作用。

3.我的想法是,在P2.7口的输入中断子程序中,通过延时15秒使南北变绿东西变红15秒,先“关闭P2.7的中断使能”,以实现上面的:“恢复初始状态后的10秒内,一直保持东西绿南北红的状态,按钮不会起作用”。其中,“P2.7不起作用”的10秒时间由后面的“启动定时器”函数计时。

4.计满10秒后,在定时器中断子程序中再重新“打开P2.7中断使能”,同时“关闭定时器”。

5.c语言程序如下
图片说明

问题是:为什么io中断无法关闭,定时器中断进不去?

现在我身边没有板子也没法验证,电路用延时验证过没问题,就是程序问题,请感兴趣的朋友帮忙看看可能是什么问题,谢谢大家

  • 写回答

4条回答 默认 最新

  • Kilento 2017-01-20 06:20
    关注

    题外话:其实题主的问题更适合在一些电子论坛提,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中断为什么无法关闭更有意义

    _

    评论

报告相同问题?

悬赏问题

  • ¥15 flink cdc无法实时同步mysql数据
  • ¥100 有人会搭建GPT-J-6B框架吗?有偿
  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决