找回密码
 立即注册
查看: 1544|回复: 4

请问晶振受到干扰会不会改变RAM中数据STC8

[复制链接]

该用户从未签到

1

主题

1

回帖

13

积分

新手上路

积分
13
发表于 2023-4-6 11:31:03 | 显示全部楼层 |阅读模式
       问题是这样的,几年前用的STC8F2K32S2的单片机,发现晶振受到外在干扰会死机(或者假死),有时即便开了看门狗也没用,只能断电后重启才能再次正常跑。用的是外部4M无源晶振,电容是22P。

然后小批量的做了些,发现偶尔有客户反应,运行模式会不受控制自动改变,查看现场发现有大功率电机干扰。我的理解是一般会干扰外部电路或者电源部分,而我的产品是220输入到隔离变压器整流滤波后进入单片机,对外输出部分也仅仅一个继电器触点的输出,电源上的干扰基本排除了,百思不得其解!
       然后回来测试,发现人体或金属接触晶振输入脚,就有一定的概率会自动切换模式或者程序跑飞,再也跑不回来。我的理解是当接触到晶振,要么停止(程序也停止在原地),要么毛刺频率高(MCU会把晶振毛刺当成时钟而不受控制的执行指令),但是事实上不是这样,而是会出现不可预料的数据而导致程序跑飞。网上查了很多跑飞程序的原因,什么堆栈溢出,意外中断没清标志等等,但是都排除了!
       为了测试把项目中其他任务统统取消了,主循环就一个显示代码,正常显示8个0,也没有任何中断,测试干扰晶振输入脚,依然有几率会出现黑屏不再亮屏或者出现8个其他数据,这问题一直困扰几年了,请版主们解释一下跑飞的原因!不要告诉我避免这个干扰的方法。

STC让我认识了单片机,也让我学到了不少知识,但是别家的一样的产品,连外围电路都一样,我也测试过,干扰结束后每次都能正常执行,不会出现显示数据不对或者跑飞。

下面这个是测试代码,正常显示00000000
干扰后有时会不显示,或者显示其他数据


unsigned char code seg[] =
{
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,      //0-7
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E,      //8-F
    0xBF, 0xFF, 0x8C, 0x88, 0xC1, 0xA7, 0xA3, 0xC7, 0x91 //-
};

unsigned char code segdot[] =
{
    0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78,
    0x00, 0x10, 0x08, 0x03, 0x46, 0x21, 0x06, 0x0E,
    0xBF, 0xFF
};

unsigned char pdata ledbuff[] =
{
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};

unsigned char pdata show[8];           //0-左上  7-右下

unsigned long count3num;         


void Display(void)                              
{
    static unsigned char i = 0;                  

    SegDuan = 0xFF;                    //消隐         
    SegWei = 0x00;                              
       
    SegWei = 0x01 << i;                //驱动一位共阳
    SegDuan = ledbuff[i];
    i++;
    if (i > 7)
        i = 0;
}


void main(void)
{
    unsigned char i;
       
    P_SW2 |= 0x80;
    XOSCCR = 0xC0;               //外部晶振4M
    while (!(XOSCCR & 0x01));   
    CLKDIV = 0x01;               
    CLKSEL = 0x01;               //选择外部晶振
    //CLKSEL = 0x11;             //选择外部晶振输出到P5.4口
    P_SW2 = 0x00;               

    P0M0 = 0x00;                 
    P0M1 = 0x00;
    P1M0 |= 0x07;               
    P1M1 |= 0x00;
    P2M0 |= 0xFF;               
    P2M1 |= 0x00;
    P3M0 |= 0x20;               
    P3M1 |= 0x00;
    P3M0 |= 0x00;               
    P3M1 |= 0x84;
    P4M0 = 0x00;
    P4M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
       
    P4 = 0xFF;                   //无用引脚拉高
    P13 = 1;
    P36 = 1;
    P54 = 1;                     
    P55 = 1;       
               
    EA = 1;
    count3num = 0;
    LedGreen = 0;
    LedRed = 0;
    OUT = 1;                    //继电器输出
    //WDT_CONTR = 0x24;        
   
    while (1)
    {
        OUT = 0;
        LedRed = 1;
        show[0] = count3num / 10000000 % 10;
        show[1] = count3num / 1000000 % 10;
        show[2] = count3num / 100000 % 10;
        show[3] = count3num / 10000 % 10;
        show[4] = count3num / 1000 % 10;
        show[5] = count3num / 100 % 10;
        show[6] = count3num / 10 % 10;
        show[7] = count3num % 10;                       
        for(i=0;i<8;i++)
             ledbuff[i] = seg[show[7-i]];
        Display();
        //WDT_CONTR |= 0x34;
    }
}

回复 送花

使用道具 举报

该用户从未签到

551

主题

9453

回帖

1万

积分

管理员

积分
14007
发表于 2023-4-6 11:44:52 | 显示全部楼层
可否理解成你外部时钟比较易受干扰,产生高频毛刺,如偶合上去,产生 50MHz/200MHz之类的瞬间毛刺
===瞬间主频高了,取Flash中的程序,就读错了,Flash 也反应不过来啊,其实是大部分逻辑电路都反应不过来,乱了

这个STC8F2K 已被 STC8C2K取代2年以上了,建议:
1,后续直接用 STC8C2K取代
2,现在立即改为烧录时选择内部时钟4MHz, 实际是 内部24MHz/6  = 4MHz, 6分频下来的

因为我们都没有 STC8F2K了,没法帮你测,所以,建议您立即切换到 STC8C2K
1.png

2.png

3.png


回复 支持 反对 送花

使用道具 举报

该用户从未签到

1

主题

1

回帖

13

积分

新手上路

积分
13
 楼主| 发表于 2023-4-6 12:12:10 | 显示全部楼层
还有遗留下来的100多片,先做了,下次要用就改为8C的,用内部时钟不会出现这个问题,主要是有个定时功能,所以选择了外部晶振,可以帮我测试下其他的STC8吗?用我上面的测试代码或者用你们自己的测试代码,和我上面一样干扰晶振测试一下,试试会不会数据跑飞?
回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9453

回帖

1万

积分

管理员

积分
14007
发表于 2023-4-6 12:17:18 | 显示全部楼层
你担心外部时钟的问题,可以改用,STC8H系列的有外部晶振/时钟抗干扰电路的芯片:
1.png

2.png


你电我 13922805190下
回复 支持 反对 送花

使用道具 举报

该用户从未签到

551

主题

9453

回帖

1万

积分

管理员

积分
14007
发表于 2023-4-6 12:18:50 | 显示全部楼层
100片,总共200元的事,或者用内部时钟,或者改成上面的STC8H
回复 支持 反对 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-16 17:13 , Processed in 0.066821 second(s), 47 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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