This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430F5438A死机,I/O管脚全部高电平,请求分析原因及解决方法

Other Parts Discussed in Thread: MSP430F5438A

本人用MSP430F5438A单片机核心板,转接到PCB板上,用于检测32个数字量输入点,单片机内部逻辑运算后驱动74HC573(两块),再通过74HC573驱动光耦(16个)。光耦驱动继电器。其中单片机供电采用交流转5V的电源输入核心板,核心板将其转化成3.3V电压。

目前问题是有两种情况,一种是小概率的偶发性死机,所有I/O输出管脚为ON,导致所有继电器吸合。第二种情况是只要有接触器控制侧线圈与单片机供电电源在同一条220V的供电母线上,接触器控制侧线圈得电,接触器吸合,单片机运行正常,但是接触器线圈释放时,会造成单片机死机,所有I/O输出管脚为ON,导致所有继电器吸合。按复位按钮也没用,故障复现率几乎100%,请教下原因及解决方法,麻烦各位了,谢谢。

附件中是核心板的电路图。TR-4M3B_Ver_1_3.pdf

  • '接触器线圈释放时,会造成单片机死机,所有I/O输出管脚为ON,导致所有继电器吸合'

    有可能是程序代码上的问题。能否请您给出相关代码?
  • 这种情况很可能是被干扰造成的。建议上传完整的电路图

  • 核心板就是完整电路图,I/O输入和输出管脚全部由光耦隔离,怀疑是不是干扰大搜单片机电源了?
  • I/O管脚置位判断和执行程序如下:
    OA_1=OMA_1^L_1^L_2; //输出继电器逻辑运算
    OA_2=OMA_2^L_3^L_4;
    OA_3=OMA_3^L_5;
    OA_4=OMA_4^L_6;
    OA_5=OMA_5^L_7;
    OA_6=OMA_6^L_8;
    OA_7=OMA_7^L_9;
    OA_8=OMA_8;

    OB_1=OMB_1^R_1;
    OB_2=OMB_2^R_2;
    OB_3=OMB_3^R_3;
    OB_4=OMB_4^R_4;
    OB_5=OMB_5^R_5;
    OB_6=OMB_6^R_6;
    OB_7=OMB_7;
    OB_8=OMB_8;


    if(OA_1==0x01)
    {
    P10OUT |=BIT0;
    }
    else
    {
    P10OUT &=~BIT0;
    }

    if(OA_2==0x01)
    {
    P10OUT |=BIT1;
    }
    else
    {
    P10OUT &=~BIT1;
    }

    if(OA_3==0x01)
    {
    P10OUT |=BIT2;
    }
    else
    {
    P10OUT &=~BIT2;
    }

    if(OA_4==0x01)
    {
    P10OUT |=BIT3;
    }
    else
    {
    P10OUT &=~BIT3;
    }

    if(OA_5==0x01)
    {
    P10OUT |=BIT4;
    }
    else
    {

    P10OUT &=~BIT4;
    }
    if(OA_6==0x01)
    {
    P10OUT |=BIT5;
    }
    else
    {
    P10OUT &=~BIT5;
    }

    if(OA_7==0x01)
    {
    P10OUT |=BIT6;
    }
    else
    {
    P10OUT &=~BIT6;
    }

    if(OA_8==0x01)
    {
    P10OUT |=BIT7;
    }
    else
    {
    P10OUT &=~BIT7;
    }



    if(OB_1==0x01)
    {
    P2OUT |=BIT0;
    }
    else
    {
    P2OUT &=~BIT0;
    }

    if(OB_2==0x01)
    {
    P2OUT |=BIT1;
    }
    else
    {
    P2OUT &=~BIT1;
    }

    if(OB_3==0x01)
    {
    P2OUT |=BIT2;
    }
    else
    {
    P2OUT &=~BIT2;
    }

    if(OB_4==0x01)
    {
    P2OUT |=BIT3;
    }
    else
    {
    P2OUT &=~BIT3;
    }

    if(OB_5==0x01)
    {
    P2OUT |=BIT4;
    }
    else
    {
    P2OUT &=~BIT4;
    }

    if(OB_6==0x01)
    {
    P2OUT |=BIT5;
    }
    else
    {
    P2OUT &=~BIT5;
    }

    if(OB_7==0x01)
    {
    P2OUT |=BIT6;
    }
    else
    {
    P2OUT &=~BIT6;
    }

    if(OB_8==0x01)
    {
    P2OUT |=BIT7;
    }
    else
    {
    P2OUT &=~BIT7;
    }