矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: 创业爱好者

请问普中HC6800EM3-V3.0光盘外部中断一文是否有误

[复制链接]
     
发表于 2022-10-7 22:59:58 | 显示全部楼层
创业爱好者 发表于 2022-10-7 20:23
他这个程序没写好,这样写容易让初学者把普通I/O口操作和中断混淆起来~尽管实验确实能通过。

也不会混淆呀!程序中是开了外部中断(EX0=1;EA=1),然后执行状态翻转的是在中断子程序里执行的(void Int0(void) interrupt 0),所以有动作那肯定是中断执行的。即使是开了中断,外部中断的脚也可以当普通IO口用,一样可以读状态以及写状态。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-10-8 00:59:16 | 显示全部楼层
杨白劳 发表于 2022-10-7 21:24
又是楼主您在发帖,04年您就玩中断,十八年过去了还在中断。我觉得楼主天生玩不转这个,还是回答一下最后的 ...

又不是天天玩,那时候学了单片机,想找份这方面的工作,边学边干工作,但没找到这方面工作,也就放在一边了。

另外我就是想使用中断,你好像没看懂我的意思,我的意思是教程中的程序写的不好,虽然实验能成功,却没能突出中断的好处。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-10-8 01:13:15 | 显示全部楼层
我的电脑! 发表于 2022-10-7 22:59
也不会混淆呀!程序中是开了外部中断(EX0=1;EA=1),然后执行状态翻转的是在中断子程序里执行的(void Int ...

他写的这个程序没有突出中断的好处,容易让初学者混淆起来,实际上这个程序就是没有使用中断,仅仅操作I/O口也能成功(把程序中所有中段语句都去掉),既然使用了中断,就不要模棱两可地再在中断函数里使用普通I/O口操作。使用了中断,就是为了让CPU分身出来做别的事,仍然用查询法判断I/O口,这不是太落后了吗?

这也就是现在的我,15-18年间我学过两次C语言,没学会,那时看不出这个视频的错误。
回复 支持 反对

使用道具 举报

     
发表于 2022-10-8 09:48:17 | 显示全部楼层
本帖最后由 我的电脑! 于 2022-10-8 09:49 编辑
创业爱好者 发表于 2022-10-8 01:13
他写的这个程序没有突出中断的好处,容易让初学者混淆起来,实际上这个程序就是没有使用中断,仅仅操作I/ ...


类似这种事例教学程序,主要目的是让你知道中断是怎么使用,而以后能否灵活运用是个人的修为了。若是只需要实现单一目的,的确完全体现不到中断的优势,但如果你的程序要实现的功能多一点,如主程序中不断做时钟的刷新显示,然后还要判断按键什么时候按下,那用中断来实现就有优势了。
另外,在示例中,中断子程序里的IO口相关操作,目的是消抖,是必须的(除非IO口上接按键上有硬件消抖电路)。换个说法,如果这个程序由你来写,必须使用中断的控制方法,你又会如何写呢?
回复 支持 反对

使用道具 举报

     
发表于 2022-10-8 10:00:46 | 显示全部楼层
这个程序就是演示用的。中断要求快进快出,delay太耽误时间,实践中不会有人用。演示完全能达到目的,delay用于按键消抖。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-10-8 13:02:58 | 显示全部楼层
我的电脑! 发表于 2022-10-8 09:48
类似这种事例教学程序,主要目的是让你知道中断是怎么使用,而以后能否灵活运用是个人的修为了。若是只 ...

换成我写,为了给初学者做个示范,延时函数,按键定义都省略,初始化时点亮一个或四个发光二极管,中断函数则反过来,原先亮的发光二极管熄灭,原先熄灭的点亮。
回复 支持 反对

使用道具 举报

     
发表于 2022-10-8 13:15:32 | 显示全部楼层
创业爱好者 发表于 2022-10-8 13:02
换成我写,为了给初学者做个示范,延时函数,按键定义都省略,初始化时点亮一个或四个发光二极管,中断函 ...

那你的外部中断引脚(P3.2)如何接呢?又是如何体现这是一个由外部中断引起的状态变化呢?
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-10-8 13:47:58 | 显示全部楼层
本帖最后由 创业爱好者 于 2022-10-8 14:15 编辑
我的电脑! 发表于 2022-10-8 13:15
那你的外部中断引脚(P3.2)如何接呢?又是如何体现这是一个由外部中断引起的状态变化呢?


按键仍然接在P3.2与地之间,但不在C语言里申明,用发光二极管的亮灭体现这个变化。
回复 支持 反对

使用道具 举报

     
发表于 2022-10-8 13:55:31 来自手机 | 显示全部楼层
本帖最后由 快乐毛毛虫 于 2022-10-8 14:00 编辑

楼主这么多年来没理解外部中断的精髓呀。
开关必须消抖,不信你用外部中断连接个计数器试试看。
因为外部中断处理速度极快,极易造成一次按动开关多次中断的现象。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-10-8 14:14:45 | 显示全部楼层
快乐毛毛虫 发表于 2022-10-8 13:55
楼主这么多年来没理解外部中断的精髓呀。
开关必须消抖,不信你用外部中断连接个计数器试试看。
因为外部 ...

假设初始化LED高四位亮,中断来了,低四位亮,就是响应几万次也还是低四位亮,当年我做实验时,手一松开又转为高四位亮。这只是为了向初学者证明中断有用,而不是说这是最好的程序。
回复 支持 反对

使用道具 举报

     
发表于 2022-10-8 14:25:29 | 显示全部楼层
创业爱好者 发表于 2022-10-8 13:47
按键仍然接在P3.2与地之间,但不在C语言里申明,用发光二极管的亮灭体现这个变化。

用手头上的学习板或干脆搭一个这样子的电路,然后把你的程序写进去看看运行结果。理论上的确是按一下按钮LED灯的状态发生一次翻转,但实际上电后你发现每次按按钮,LED的状态都似乎是随机的,有可能变有可能不变,原因就是没有对按键进行消抖处理,MCU的确对中断进行处理了,但你按一次键MCU实际执行了好几次甚至好几十次中断。
回复 支持 反对

使用道具 举报

     
发表于 2022-10-8 14:35:01 | 显示全部楼层
本帖最后由 我的电脑! 于 2022-10-8 14:42 编辑
创业爱好者 发表于 2022-10-8 14:14
假设初始化LED高四位亮,中断来了,低四位亮,就是响应几万次也还是低四位亮,当年我做实验时,手一松开 ...


但人家的示例要达成的目的,是按一下按钮,LED状态发生一次翻转,而你这个程序的做法,是按着按钮LED一种状态,松开手时LED又是另一个状态,要实现的都不是同一个功能。大伙一直以为你说的是可以不定义IO口,不用消抖,而达到视频中示例的效果,我就非常好奇是怎么做到。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-10-8 19:28:03 来自手机 | 显示全部楼层
我的电脑! 发表于 2022-10-8 14:35
但人家的示例要达成的目的,是按一下按钮,LED状态发生一次翻转,而你这个程序的做法,是按着按钮LED一 ...

视频中LED状态翻转不是目的,而是向初学者通过实验验证中断理论。如果翻转后要稳定下来,不用消抖肯定不行。
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 2022-10-8 19:35:52 | 显示全部楼层
我的电脑! 发表于 2022-10-8 14:25
用手头上的学习板或干脆搭一个这样子的电路,然后把你的程序写进去看看运行结果。理论上的确是按一下按钮 ...

请看这个最简单的程序:
MAIN:MOV P1,#0F0H

EINT0: MOV P1,#0FH

04还是05年我做过这个实验了,按下P3.2上的按钮,高四位发光二极管亮,松开后低四位亮,当然这个过程中中断早已响应几十万次了,显然不是最优秀的程序。这只是验证书本上的中断理论。
回复 支持 反对

使用道具 举报

     
发表于 2022-10-8 19:58:02 | 显示全部楼层
创业爱好者 发表于 2022-10-8 19:28
视频中LED状态翻转不是目的,而是向初学者通过实验验证中断理论。如果翻转后要稳定下来,不用消抖肯定不 ...

但看标题,你提出的是人家的外部中断有误,然后说可以不必定义IO口及消抖程序,再说你自己做的中断实验成功了,按一般理解来说就是你实现了不定义IO口还不使用消抖程序,同样实现了人家的功能,所以认为人家的程序中有误存在多余项。搞到最后原来你说的只是需要中断的使用方法,并不是与原文中得到相同的结果,看看有多少人是被这个结论带偏进来看的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-4-27 23:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表