❶ 单片机中中断服务子程序没执行完能强行跳回主程序吗,若不能为什么若能,相应的中断标志位会被清零吗
当然可以强行跳回主程序,不影响中断标志位的清零,只要进入中断,该硬件清零的就自动清零,但强行跳回主程序,单片机会认为一直在执行中断程序,因此以后有中断发生时也不会再进入中断程序。所以不能这样做,用RETI就会跳回主程序。
❷ 定时器中断程序执行时间很长,超过定时时间,我该怎么办。求指教
具体看什么要求,一般一个中断执行时间计时毫秒,
估计是你写程序写的太多,造成PLC扫描中断周期过长,
1建议你把中断程序优化下,写到其他位置,和中断分离,这样扫描的周期
会短点
2另外,你可以考虑用定时中断啊,这样避免了中断程序没扫描完,中断就被复位。
3程序一般控制毫秒控制肯定能达到工业使用要求的,你也可以把定时时间加长点。
❸ plc s7-200 中断程序的问题,谢谢大神指导。
中断INT0的功能就是:每执行一次就翻转Q0.0的状态。
M0.0的功能是当T32定时时间到后复位T32定时器,重新开始计时。
中断EVNT=21表示定时器T32到定时时间执行中断。
这样,就可以分析出,开始运行程序后,T32开始计时,当T32计时到2秒后,执行中断程序,Q0.0状态改变。然后返回主程序,M0.0置位。下一个周期因为M0.0=1,T32复位,重新计时,到2秒后再中断,Q0.0状态再改变。
我不太清楚的是这个中断指令需不需要ENI允许中断。
❹ plc中调用子程序,子程序执行完后,子程序里面的东西会不会复位,复位到调用前
子程序 调用之后 如果接通模块触点 然后不在调用了 这个触点不会随着调用改变状态 之后清零才可以
就是说你调用子程序,子程序 莫一段程序执行了 ,随后你的子程序又不调用了 ,那个一段程状态不会改变。
❺ 西门子S7-200系列PLC计数器的启动和复位分别由什么控制
西门子计数器指令包括:增计数器、增减计数器、减计数器和高速计数器。
增计数器
增计数指令(CTU)从当前计数值开始,在每一个(CU)输入状态从低到高时递增计数。当CXX的当前值大于等于预置值PV时,计数器位CXX置位。当复位端(R)接通或者执行复位指令后,计数器被复位。当它达到最大值(32,767)后,计数器停止计数。
增/减计数器
增/减计数指令(CTUD),在每一个增计数输入(CU)的低到高时增计数,在每一个减计数输入(CD)的低到高时减计数。计数器的当前值CXX保存当前计数值。在每一次计数器执行时,预置值PV与当前值作比较。当达到最大值(32767)时,在增计数输入处的下一个上升沿导致当前计数值变为最小值(--32768)。当达到最小值(--32768)时,在减计数输入端的下一个上升沿导致当前计数值变为最大值(32767)。当CXX的当前值大于等于预置值PV时,计数器位CXX置位。否则,计数器位关断。当复位端(R)接通或者执行复位指令后,计数器被复位。当达到预置值PV时,CTUD计数器停止计数。
PS:CXX代表的是计数器的名称,是常数范围时从C0到C25,由于每一个计数器只有一个当前值,所以不要多次定义同一个计数器。(具有相同标号的增计数器、增/减计数器、减计数器访问相同的当前值。)当使用复位指令复位计数器时,计数器位复位并且计数器当前值被清零。计数器标号既可以用来表示当前值,又可以用来表示计数器位。
实例应用2
在首次扫描时,调用SBR0,在首次扫描,配置HSC1:SMB48=16#F8意思就是使能计数器、写初始值、写预置值、设初始方向为增计数、选择启动和复位输入高电平有效、选择4倍速模式、配置HSC1为带启动和复位输入的正交模式、SMD48=0表示清除HSC1的初始值。置HSC1的预置值为50。当HSC1的当前值=预置值时,执行INT_0。全局中断允许。执行HSC1,执行HSC1,清除HSC1的初始值、选择写入新的初始值和HSC1使能。
❻ plc子程序不调用时如何复位
plc子程序不调用时,在调用子程序处的主程序后面来进行复位。
❼ 单片机中断程序
结构很规矩,这个程序。
首先单片机上电复位,运行死循环前面的程序(,你这里就是init_timer(); // 应该叫初始化定时器,才合适,让定时器按照你需要的定时长度工作,或叫产生中断 )
接下来单片机主程序就是一直在死循环了。我们的主要任务一般在这里处理。
中断,就是在处理一些特殊任务,比如按键,或定时处理的程序,或外部一个不知道什么时间发生的任务,或通信任务等等。你在主循环的时候,无论在什么时候,中断请求来了(可以理解为需要处理比较紧急任务,优先处理的任务),就会暂停主循环,进入对应中断服务程序。运行完,在回主循环的暂停地方,继续执行死循环的任务。
定时器中断,就是每过一定时间,运行一下中断服务程序。常用来计时和产生脉冲信号。
初始化定时器,就是给定时器的寄存器,设置工作模式,时钟源,溢出的计数值。设置好了,定时器就能根据每个时钟源的频率,进行计数,直至溢出,然后产生一个中断请求。如果不饿能自动加载计数初值的定时器,在中断处理函数(服务函数)必须手动加载初值。
❽ 如何使用单片机C语言实现复位
可以使用下面的程序跳到0000H实现软复位,下面的程序实际上是一个函数指针,指针指向了0000H地址。
((void
(code
*)
(void))
0x0000)
();
下面的例子将实现软件自复位void
reset
(void)
{
((void
(code
*)
(void))
0x0000)
();
}
void
main
(void)
{
reset
();
}
你可能注意到以上的软复位程序并不能清除8051的中断系统和某些8051的外围设备,当您在中断程序中调用上面的软件复位程序后,中断将再不能触发。因此,以上的软复位程序不能在中断子程序中调用。
下面的小段汇编函数可以在中断程序或主程序中调用,该函数将0x0000压栈,然后通过“RETI”出栈,这将清除中断环境并让程序从0000H重新开始运行。
?PR?RESET
SEGMENT
CODE
RSEG
?PR?RESET
;
C
prototype:
void
reset
(void);
PUBLIC
reset
reset:
POP
ACC
;
pop
return
address
POP
ACC
CLR
A
;
push
0
as
new
PUSH
ACC
;
return
address
to
stack
PUSH
ACC
RETI
;
execute
return
of
interrupt
END
以上程序在选择bank
0寄存器组时工作良好,假如选择的不是bank0寄存器组,那么可能无法获得预料的结果。你应该在以上的程序或启动代码中加上“MOV
PSW,
#0”来选择bank
0寄存器组。
以上文章由龙啸九天翻译自KEIL
FAQ,可能有疏漏,欢迎提出。