单片机/MCU论坛
直播中

LY

7年用户 77经验值
私信 关注
[问答]

小白求助,中断程序跳不出来,不能往下执行,大神帮忙看看

小白求助,中断程序跳不出来,不能往下执行,大神帮忙看看怎么改
#include       
#define uint unsigned int
#define uchar unsigned char

***it IN1=P3^1;//接IN1 控制正转
***it IN2=P3^2;//接IN2 控制反转
***it IN3=P3^3;
***it IN4=P3^4;

***it ENA=P3^5;          //使能
***it ENB=P3^6;

uchar time;
void delay(uint);
void head();
void stop();
void configpwm();

void main()
{
        configpwm();    /*执行完这两个语句以后,
        head();             就不往下执行stop这条语句了,是哪个地方不对,大神帮忙看看怎么改*/
        delay(300);
        stop();
}
void configpwm()
{
       TMOD=0x01;//定时器0工作方式1
       TH0=0xff;//(65536-200)/256;//赋初值定时
       TL0=0xf7;//(65536-200)%256;//0.2ms
       EA=1;//开总中断
       ET0=1;//开定时器0中断
       TR0=1;//启动定时器0
       
}

void timer0() interrupt 1
{
       TR0=0;//赋初值时,关闭定时器
       TH0=0xff;//(65536-200)/256;//赋初值定时         +
       TL0=0xf7;//(65536-200)%256;//0.2ms
       TR0=1;//打开定时器
           time++;
       if(time>=100) time=0;//50hz
       if(time<=80)
           {
            ENA=0; //占空比20%
                ENB=0;
           }
       else
           {
                ENA=1;
                ENB=1;
           }
}
void head(uint i)
{
                 IN1=1;          //正转   前
                IN2=0;
                IN3=0;          
                IN4=1;
}
void stop()
{
        IN1=0;
        IN2=0;
        IN3=0;
        IN4=0;
}
void delay(uint z)
{
        uint x,y;
        for(x=1000;x>0;x--)
        {
                for(y=z;y>0;y--);
        }
}

回帖(14)

人中狼

2018-1-25 12:41:45
程序里没看出来有什么死循环之类的导致跳不出中断,你应该描述一下异常现象,以及你所想达到的目的是什么。
就程序来看,不考虑定时器的话,程序里的delay(300);应该也不会延时很长时间,所以执行完head(); 之后可能很快就会执行stop();。
对电机类的控制程序调试,需要给电机等有足够的时间执行相应的动作,不然会产生错误的判断。
1 举报

LY

2018-1-25 12:46:59
你是说delay时间太短了?
我的问题现象就是,我加上中断以后,可以执行head语句(这时候电机是正转),但是下一步的语句是延时一段时间以后电机停止,结果这个程序就一直是按照中断里面的速度在执行电机正转,没有往下执行(我觉得是没有跳出中断程序)。我现在就是想要这个程序能够执行完中断以后还能按照指令语句继续往下执行。大神帮我看看那写的不对,要怎么改、
1 举报

LY

2018-1-25 12:47:17
引用: 人中狼 发表于 2018-1-25 12:41
程序里没看出来有什么死循环之类的导致跳不出中断,你应该描述一下异常现象,以及你所想达到的目的是什么。
就程序来看,不考虑定时器的话,程序里的delay(300);应该也不会延时很长时间,所以执行完head(); 之后可能很快就会执行stop();。
对电机类的控制程序调试,需要给电机等有足够的时间执行相应的动作,不然会产生错误 ...


你是说delay时间太短了?
我的问题现象就是,我加上中断以后,可以执行head语句(这时候电机是正转),但是下一步的语句是延时一段时间以后电机停止,结果这个程序就一直是按照中断里面的速度在执行电机正转,没有往下执行(我觉得是没有跳出中断程序)。我现在就是想要这个程序能够执行完中断以后还能按照指令语句继续往下执行。大神帮我看看那写的不对,要怎么改
1 举报

人中狼

2018-1-25 13:01:05
把定时器中断里的两个对TR0的赋值去除,不需要在定时器中断里关闭定时器。
另外测试一下关闭定时器后程序是否能达到预定的效果,也可以测定一下delay的时间,可以在加入定时器中断后做对比。
1 举报

LY

2018-1-25 13:19:03
引用: 人中狼 发表于 2018-1-25 13:01
把定时器中断里的两个对TR0的赋值去除,不需要在定时器中断里关闭定时器。
另外测试一下关闭定时器后程序是否能达到预定的效果,也可以测定一下delay的时间,可以在加入定时器中断后做对比。

去除了,还是不行。跳不出来。
没有中断时,程序执行正常,加上中断以后就不往下执行了。
delay的时间是3s
1 举报

人中狼

2018-1-25 13:30:30
函数的说明和函数体不一样,不知道是不是错误,先改一下吧。
void delay(uint);
void head();

void delay(uint z)
{
void head(uint i)
{

不一定是没跳出定时器中断,也可能是电机没停,在stop里加一个关闭定时器
1 举报

LY

2018-1-25 13:38:18
引用: 人中狼 发表于 2018-1-25 13:30
函数的说明和函数体不一样,不知道是不是错误,先改一下吧。
void delay(uint);
void head();

改了,声明改了,然后在stop里加了EA=0;试了一下还是不行,不往下执行。这个是不是跟我那个延时的长短有关啊?或者是哪个函数的顺序?
1 举报

lee_st

2018-1-25 13:42:02
本帖最后由 lee_st 于 2018-1-25 13:43 编辑

每个中断函数里面都会有个清除中断标志的代码,你的中断里面我没有发现,
1 举报

LY

2018-1-25 13:50:17
引用: lee_st 发表于 2018-1-25 13:42
每个中断函数里面都会有个清除中断标志的代码,你的中断里面我没有发现,

     time++;
       if(time>=100) time=0;      //50hz
这里,这个是清除中断标志,当time=100时清零
1 举报

人中狼

2018-1-25 14:42:56
用KEIL仿真了一下你的程序,似乎定时器中断影响了delay,时间延长了很多,可能延长了10倍左右,程序可以运行下去
1 举报

lee_st

2018-1-26 00:12:53
引用: 泥月月 发表于 2018-1-25 13:50
time++;
       if(time>=100) time=0;      //50hz
这里,这个是清除中断标志,当time=100时清零

清除中断标志是指清某个寄存器的值,不是计数值哦,你再看看
1 举报

勇哥-lzu

2018-1-26 08:48:22
在stop后面加个while(1);
单片机的程序执行main函数,如果执行到main函数底部退出,会重启再次从main函数开始执行
1 举报

houjue

2018-1-27 22:23:24
13楼说的对,请你在【 stop 】后面加个【while(1);】改天我再来仔细看你的程序,总觉得哪里怪怪的。
1 举报

alonggege

2019-7-12 16:59:49
不错,感谢分享经验,学习下
1 举报

更多回帖

发帖
×
20
完善资料,
赚取积分