打印
[STC单片机]

关于STC8H1K28 外部中断误触发问题

[复制链接]
3560|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
logan0279|  楼主 | 2021-10-17 11:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近陆续接到客户反馈,说是我们的产品计数功能出故障了,有时候会一直不停的计数。经过排查,故障可以复现,部分还在产线上的产品也有同样的问题。这款最开始使用是MCU是STC8H1K24,没有这个问题。后来24缺货,不得已买了28来用。
STC8H1K28系列共有五个外部中断,其中INT0用作计数检测,开启外部中断功能,INT2和INT3用作一般输入检测,没有开启外部中断功能。
经过实测,在INT2或INT3的外部电平发生变化时,INT0也会被触发,并且这时候去检测INT0的电平也是低电平。
于是开启INT2、INT3的外部中断功能,并添加定时器定时,发现在INT2或INT3触发外部中断功能后的10us内,INT0也将被触发。
因为INT2和INT3的检测功能是检测外部交流信号的,会有周期性的变化,从而导致INT0也会周期性的被触发。
重新设计电路,将需要作输入检测的电路更换到其他IO,原来INT2和INT3相关IO由输入检测改为输出控制,再进行测试,测试通过,INT0没有再被误触发。
不知道各位有没有遇到类似的问题,道理来讲,这完全不应该呀。

使用特权

评论回复

相关帖子

沙发
lyjian| | 2021-10-17 12:01 | 只看该作者
本帖最后由 lyjian 于 2021-10-17 17:56 编辑

一般不会有这么低级的错误,建议先找软件bug

使用特权

评论回复
板凳
coody| | 2021-10-17 21:48 | 只看该作者
如果MCU有这么低级的错误,不会被量产出来的。
测试方法:INT0悬空(避免外部电路有干扰),设置为准双向口输出高,然后你操作INT2 INT3(输入或输出均可),看你INT0还能中断吗?
STC15或STC8系列的有5个外中断,我常用,没出过问题。一般认为会干扰的,都是外部电路提供的信号有毛刺,STC8系列的外部中断是硬件检测的,每个时钟检测一次,发现有边沿,则触发中断标志,所以其响应的脉冲宽度是很小的,百来个纳秒就可以响应。

使用特权

评论回复
地板
logan0279|  楼主 | 2021-10-18 08:50 | 只看该作者
lyjian 发表于 2021-10-17 12:01
一般不会有这么低级的错误,建议先找软件bug

软件BUG可以排除,毕竟是很简单的一个应用。
设置一个变量,在INT0触发中断的时候对该变量进行累加计数。其他应用读取这个变量值并输出到显示屏显示。

使用特权

评论回复
5
logan0279|  楼主 | 2021-10-18 09:14 | 只看该作者
coody 发表于 2021-10-17 21:48
如果MCU有这么低级的错误,不会被量产出来的。
测试方法:INT0悬空(避免外部电路有干扰),设置为准双向口 ...

这么低级的错误的确不应该出现。
这个问题我是经过反复测试的,只有在INT2、INT3作为准双向口输入检测,外部电平变化时,才会触发INT0的电平变化,触发INT0的外部中断。新打样的产品,将INT2、INT3由准双向口改为推挽输出,
MCU5个INT,只有INT0作为输入检测并开启外部中断功能,INT1、INT2、INT3都作为推挽输出、INT4烧程序接口,不烧程序时悬空。这种情况下,测试没有再出现误计数的问题。

在电路更改之前,INT0作为准双向输入检测开启外部中断功能,并在触发外部中断时进行累加计数。INT2、INT3设置为准双向作输入检测,INT4是悬空。
INT2、INT3的外围电路是检测市电信号的,采用PC817光耦隔离。
PCB布局上,INT0的线路与INT2、INT3相关线路隔的很远,只在靠近MCU的地方比较近,但也是INT0在顶层,INT2、INT3在底层,相距也有1.6mm了。而且INT2和INT3都是IO接光耦后到地,没有接上下拉电阻,光耦的交流端电流0.5ma不到,不至于产生太大的干扰信号的。
在INT0中加定时器对这个干扰信号进行计时,得到的数据是在INT2、INT3触发外部中断的最多10us内,INT0的外部中断也会触发,并且INT0的外部中断被触发后,其低电平可以维持300us以上的时间。

使用特权

评论回复
6
m564522634| | 2021-10-18 09:19 | 只看该作者
去找他们的FAE 问下了,芯片是不是新的批次, 在确认下外部中断配置有没有问题,如果是已经生产过的单片机我相信是不会出现这种问题的, 这个最好直接找他们FAE确认了

使用特权

评论回复
7
logan0279|  楼主 | 2021-10-18 09:48 | 只看该作者
本帖最后由 logan0279 于 2021-10-18 09:55 编辑
logan0279 发表于 2021-10-18 09:14
这么低级的错误的确不应该出现。
这个问题我是经过反复测试的,只有在INT2、INT3作为准双向口输入检测, ...

这个项目之前使用的是STC8H1K24,今年因为缺货才更换为STC8H1K28,硬件没有任何变更直接替换使用的。
类似现象之前在STC8H1K24上也出现过,但没有这么严重。之前是在INT2、INT3外部电路通断的时候,偶而出现一次误计数。更换为STC8H1K28以后,出现连续误计数的情况。

使用特权

评论回复
8
logan0279|  楼主 | 2021-10-18 09:57 | 只看该作者
m564522634 发表于 2021-10-18 09:19
去找他们的FAE 问下了,芯片是不是新的批次, 在确认下外部中断配置有没有问题,如果是已经生产过的单片机 ...

嗯。
我联系他们试下,然后再做其他测试排查一下。

使用特权

评论回复
9
coody| | 2021-10-18 10:14 | 只看该作者
logan0279 发表于 2021-10-18 09:48
这个项目之前使用的是STC8H1K24,今年因为缺货才更换为STC8H1K28,硬件没有任何变更直接替换使用的。
类似 ...

这个现象不应该出现,STC8H1K28与STC8H1K24都是同一个芯片分出来的,硬件一模一样的,晶圆阶段都是一个芯片。如果STC8H1K28有问题,则STC8H1K24一样有的。

使用特权

评论回复
10
coody| | 2021-10-18 10:37 | 只看该作者
logan0279 发表于 2021-10-18 09:14
这么低级的错误的确不应该出现。
这个问题我是经过反复测试的,只有在INT2、INT3作为准双向口输入检测, ...

特意再次按你的条件测试了,没有问题。
用的是STC技术支持提供的5个外中断同时应用的程序,INT0~INT4的中断对应分别取反P1.0~P1.4输出,INT0~INT4均设为准双向口输入,然后从INT2或/和INT3输入信号1KHz~100KHz,INT2、INT3中断正常,但INT0均无中断产生。进一步,将信号单个或同时加到INT1~INT4,则INT1~INT4中断正常,但INT0不会出现中断。

你可以向SYC技术支持索要这个测试程序例子,例子中有源码和编译好的HEX文件,直接下载测试,源码我贴在下面:
#include        "..\..\STC8Hxxx.h"


/*************        功能说明        **************

请先别修改程序, 直接下载"ex-interrupt.hex"测试.

测试5个外中断INT0~INT4同时使用.

INT0(P3.2)配置为上升/下降沿触发, 从INT0(P3.2)输入脉冲, INT0中断取反P1.0输出相同频率的脉冲. (也可配置为下降沿触发, P1.0输出一半频率的脉冲.)
INT1(P3.3)配置为上升/下降沿触发, 从INT1(P3.3)输入脉冲, INT1中断取反P1.1输出相同频率的脉冲. (也可配置为下降沿触发, P1.1输出一半频率的脉冲.)
INT2(P3.6)固定为下降沿触发, 从INT2(P3.6)输入脉冲, INT2中断取反P1.2输出一半频率的脉冲.
INT3(P3.7)固定为下降沿触发, 从INT3(P3.7)输入脉冲, INT3中断取反P1.3输出一半频率的脉冲.
INT4(P3.0)固定为下降沿触发, 从INT4(P3.0)输入脉冲, INT4中断取反P1.4输出一半频率的脉冲.


******************************************/


/**********************************************/
void main(void)
{
        P1M1 = 0;
        P1M0 = 0;
        P3M1 = 0;
        P3M0 = 0;

        AUXINTIF &= ~INT4IF;        /* 清除外中断4标志位 */
        AUXINTIF &= ~INT3IF;        /* 清除外中断3标志位 */
        AUXINTIF &= ~INT2IF;        /* 清除外中断2标志位 */
        IE1 = 0;                                /* 清除外中断1标志位 */
        IE0 = 0;                                /* 清除外中断0标志位 */

        EX0 = 1;        //允许INT0中断
//        PX0 = 1;        //高优先级中断
        IT0 = 0;        //上升,下降沿中断
//        IT0 = 1;        //下降沿中断

        EX1 = 1;        //允许INT1中断
//        PX1 = 1;        //高优先级中断
        IT1 = 0;        //默认 上升,下降沿中断
//        IT1 = 1;        //下降沿中断

        INT_CLKO |=  (1 << 4);        //允许INT2中断, 固定为下降沿低优先级中断
        INT_CLKO |=  (1 << 5);        //允许INT3中断, 固定为下降沿低优先级中断
        INT_CLKO |=  (1 << 6);        //允许INT4中断, 固定为下降沿低优先级中断

        EA = 1;

        while (1)
        {

        }

}

/********************* INT0中断函数 *************************/
void Ext_INT0 (void) interrupt 0
{
        P10 = ~P10;
}


/********************* INT1中断函数 *************************/
void Ext_INT1 (void) interrupt 2
{
        P11 = ~P11;
}

/********************* INT2中断函数 *************************/
void Ext_INT2 (void) interrupt 10
{
        P12 = ~P12;
}


/********************* INT3中断函数 *************************/
void Ext_INT3 (void) interrupt 11
{
        P13 = ~P13;
}


/********************* INT4中断函数 *************************/
void Ext_INT4 (void) interrupt 16
{
        P14 = ~P14;
}

使用特权

评论回复
11
lyjian| | 2021-10-18 12:48 | 只看该作者
logan0279 发表于 2021-10-18 08:50
软件BUG可以排除,毕竟是很简单的一个应用。
设置一个变量,在INT0触发中断的时候对该变量进行累加计数。 ...

Bug和应用简不简单没关系。

使用特权

评论回复
12
lyjian| | 2021-10-18 12:50 | 只看该作者
logan0279 发表于 2021-10-18 09:48
这个项目之前使用的是STC8H1K24,今年因为缺货才更换为STC8H1K28,硬件没有任何变更直接替换使用的。
类似 ...

这就说i明和芯片没关系。
有出现说明原来就有问题。
应用离散大了问题出现概率变大而已。

使用特权

评论回复
13
lyjian| | 2021-10-18 12:55 | 只看该作者
logan0279 发表于 2021-10-18 09:14
这么低级的错误的确不应该出现。
这个问题我是经过反复测试的,只有在INT2、INT3作为准双向口输入检测, ...

估计软件有地方去操作了INT0的IO

使用特权

评论回复
14
ningling_21| | 2021-10-18 14:46 | 只看该作者
或许是个BUG,如果能够反复验证存在的话

使用特权

评论回复
15
logan0279|  楼主 | 2021-10-19 14:19 | 只看该作者
coody 发表于 2021-10-18 10:37
特意再次按你的条件测试了,没有问题。
用的是STC技术支持提供的5个外中断同时应用的程序,INT0~INT4的中 ...

谢谢。
这两天反复测试,找到问题了。确实不是INT0和INT2、INT3的互相干扰问题。
是原来的计数检测电路有问题,灵敏度过高。
INT0的外围计数检测功能要利用到INT2和INT3的外部电路,所以在INT2、INT3的外部电路在某些条件下产生变化时,INT0也会被触发。
按最初的理论设计,只有在INT2、INT3的外部电路剧烈变化时,INT0才会被触发进行计数,现在是INT2、INT3的外部电路产生很微弱的变化时,INT0也会被触发。按楼上说的将INT0的IO悬空后,没有出现INT2、INT3电平变化时INT0误计数现象。

使用特权

评论回复
16
logan0279|  楼主 | 2021-10-19 14:21 | 只看该作者
ningling_21 发表于 2021-10-18 14:46
或许是个BUG,如果能够反复验证存在的话

找到问题了,确实不是MCU的BUG,是INT0的外部硬件部分电路有问题。

使用特权

评论回复
17
logan0279|  楼主 | 2021-10-19 14:23 | 只看该作者
lyjian 发表于 2021-10-18 12:55
估计软件有地方去操作了INT0的IO

谢谢。
软件其他部分没有去操作INT0的IO的部分。
反复排查以后,现在可以确认问题应该是INT0的外部硬件电路有问题。

使用特权

评论回复
18
logan0279|  楼主 | 2021-10-19 14:35 | 只看该作者
谢谢各位的热心评论。
这几天反复对这个问题进行测试,可以确认不是MCU的BUG,是INT0计数功能的外部硬件电路有问题。一般做测试的时候,都是各个功能在一个测试台全测的,计数功能电路没有断开。排查的时候把INT0计数功能的硬件部分断开以后,再去控制INT2、INT3相关电平变化,INT0没有再出现误计数现象。
这个问题原来偶而会出现,跟硬件工程师反馈过,但一直没有改,因为只是偶而出现一次误计数,客户可能也没在意。直到最近连续出现只例INT0连续误计数的情况。

使用特权

评论回复
评论
ningling_21 2021-10-19 17:01 回复TA
解决就好 
19
gx_huang| | 2021-10-19 21:52 | 只看该作者
其实,这个问题解决和测试,需要硬件参与,或者懂硬件的软件工程师去调试,更容易发现问题。

使用特权

评论回复
20
coody| | 2021-10-20 17:59 | 只看该作者
logan0279 发表于 2021-10-19 14:19
谢谢。
这两天反复测试,找到问题了。确实不是INT0和INT2、INT3的互相干扰问题。
是原来的计数检测电路有 ...

这种简单问题用示波器很容易看出来的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

41

帖子

0

粉丝