zhcj66 发表于 2014-10-9 09:31:32

AVR单片机死掉,连看门狗都死了,都有什么原因造成的?

本帖最后由 zhcj66 于 2014-10-9 15:38 编辑

用AVR ATmega128做了一个加热的东西,总是会随机的死掉,就连单片机自带的看门狗都不起作用了。
出现这种情况,都有什么可能造成的?用这个芯片都快4年了 第一次出这种情况(只开了ISP么接仿真接口)

用到的硬件资源2个定时器和一个串口;其他的就是常规操作IO口了。

晶振外壳接地,不起作用,晶振在设备里的工作温度不会超过40度

void LED3_2Init(void)
{
        //stop errant interrupts until set up
        CLI(); //disable all interrupts
        XDIV= 0x00; //xtal divider
        XMCRA = 0x00; //external memory
       
        WDR(); //this prevents a timout on enabling
        WDTCR = 0x1F;
        WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
       
        LED3_2Init_GPIO();
        LED3_2InitHC164();
        ButtonInit();
//        PowerDetectInit();
        Init_Temperature();
        IIC_Init();
        Init_UART1();
        Init_TIMx();
        LED3_2Init_SysValue();

       
        MCUCR = 0x00;
        EICRA = 0x00; //extended ext ints
        EICRB = 0x00; //extended ext ints
        EIMSK = 0x00;
        TIMSK = BIT0; //TIM0开启中断
        ETIMSK = BIT2; //TIM3开启中断
//        BUZZ_ON;
//        delay_nms(150);
        SEI(); //re-enable interrupts
//        //all peripherals are now initialized
//        BUZZ_OF;
}

static void LED3_2Init_GPIO(void)
{
        PORTA = 0x00;
        DDRA= 0x00;
        PORTB = 0x00;
        DDRB= 0x00;
        PORTC = 0x00;
        DDRC= 0x00;
        PORTD = 0x00;
        DDRD= 0x00;
        PORTE = 0x00;
        DDRE= 0x00;
        PORTF = 0x00;
        DDRF= 0x00;
        PORTG = 0x00;
        DDRG= 0x00;
       
        //key1 2
//        PORTG |= BIT0 | BIT1;
//        DDRG&= ~(BIT0 | BIT1);
       
        //TOUT3 2 1
        PORTA &= ~(BIT3 | BIT5 | BIT6);
        DDRA|= BIT3 | BIT5 | BIT6;
       
        //SYS_K
        PORTA &= ~BIT7;
        DDRA|= BIT7;
       
        PORTA |= BIT7;
       
        //OUT1-4
        PORTC &= ~(BIT0 | BIT1 | BIT2 | BIT3);
        DDRC|= BIT0 | BIT1 | BIT2 | BIT3;
               
        //BUZZ
        PORTC &= ~BIT(4);
        DDRC|= BIT(4);
       
        //key5 4 3 2 1
        PORTD |= BIT0 | BIT1 | BIT4 | BIT5 | BIT7;
        DDRD&= ~(BIT0 | BIT1 | BIT4 | BIT5 | BIT7);
       
}


void Init_TIMx(void)
{
        //TIM0       
        //TIMER0 initialize - prescale:1024
        // WGM: Normal
        // desired value: 100Hz
        // actual value: 100.933Hz (0.9%)
        TCCR0 = 0x00; //stop
        ASSR= 0x00; //set async mode
        TCNT0 = 0x95; //set count
        OCR0= 0x6B;
        TCCR0 = 0x07; //start timer
       

//TIMER3 initialize - prescale:1024
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 2Hz
// actual value:2.000Hz (0.0%)
        TCCR3B = 0x00; //stop
        TCNT3H = 0xEA; //setup
        TCNT3L = 0xE9;
        OCR3AH = 0x15;
        OCR3AL = 0x17;
        OCR3BH = 0x15;
        OCR3BL = 0x17;
        OCR3CH = 0x15;
        OCR3CL = 0x17;
        ICR3H= 0x15;
        ICR3L= 0x17;
        TCCR3A = 0x00;
        TCCR3B = 0x05; //start Timer
}


#pragma interrupt_handler timer0_ovf_isr:17
void timer0_ovf_isr(void)//100Hz
{
        TCNT0 = 0x95;

        if (TM1)
        {
                TN1++;
        }
        if(TM2)
        {
                TN2++;
        }

        PwmHot();
}

#pragma interrupt_handler timer3_ovf_isr:30
void timer3_ovf_isr(void)
{

        TCNT3H = 0xEA; //reload counter high value
        TCNT3L = 0xE9; //reload counter low value
       
}

//UART1 initialize
// desired baud rate:115200
// actual baud rate:115198 (0.0%)
// char size: 8 bit
// parity: Disabled
void Init_UART1(void)
{
        UCSR1B = 0x00; //disable while setting baud rate
        UCSR1A = 0x00;
        UCSR1C = 0x06;
        UBRR1L = 0x05; //set baud rate lo
        UBRR1H = 0x00; //set baud rate hi
        UCSR1B = 0x98;
}

#pragma interrupt_handler USART1_rx_isr:31
void USART1_rx_isr()
//ISR(USART1_RX_vect)
{
//static uchar Temp;
        while ( !(UCSR1A & (1<<RXC1)) );
    //Temp = UDR1;       
        //USART1_Putc(Temp);
        SysUSART1.USARTReadData = UDR1;
        USART1_Putc(SysUSART1.USARTReadData);
        if(SysUSART1.USARTReadData == 0x0d)
        {
                SysUSART1.USARTReadData = 0;
                USART1ReadProcess();
                SysUSART1.USARTReadNum = 0;
        }
        else
        {
                SysUSART1.USARTReadNum++;
        }       
}

zhcj66 发表于 2014-10-9 10:05:43

sitra 发表于 2014-10-9 09:42
2楼说的在理。楼主可以加一个电源监控芯片试试看,比如MAX6809这种货。
另外,测一下晶振波形,如果干扰 ...

3楼说的让我想起了 有个电压的高频电感和晶振靠的非常的近。发现了这个很不合理的地方。哎 设计的时候没注意,低级错误

waterghost 发表于 2014-10-9 09:36:29

一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。

ada1983 发表于 2014-10-9 09:40:42

电压,晶振查查看呢......

sitra 发表于 2014-10-9 09:42:56

waterghost 发表于 2014-10-9 09:36
一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。 ...

2楼说的在理。楼主可以加一个电源监控芯片试试看,比如MAX6809这种货。
另外,测一下晶振波形,如果干扰导致晶振挂掉也会出现这种情况。

zhcj66 发表于 2014-10-9 09:58:31

waterghost 发表于 2014-10-9 09:36
一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。 ...

去掉加热 现在没有出现,加热电压36v 加热电阻大约是1欧姆 大概能测到的电流20A多些因为是晶闸管控制的。
开始加热0.6s的持续加热其他时间加热是瞬间的。

zhcj66 发表于 2014-10-9 09:59:31

waterghost 发表于 2014-10-9 09:36
一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。 ...

“用的是低端8位”是什么意思 没有明白

hbtss 发表于 2014-10-9 10:06:04

先查查硬件

zhcj66 发表于 2014-10-9 10:07:22

hbtss 发表于 2014-10-9 10:06
先查查硬件

大家都一致认为硬件出现问题比较大吗?

sitra 发表于 2014-10-9 10:23:21

zhcj66 发表于 2014-10-9 10:05
3楼说的让我想起了 有个电压的高频电感和晶振靠的非常的近。发现了这个很不合理的地方。哎 设计的时候没 ...

为了排查晶振的影响,你可以这样尝试。
1、将晶振的外壳接一下地试试。
2、将电感换成屏蔽电感试试。
3、实测一下你加热到最高温度的时候,测一下晶振的壳温。看是否超了。

zhcj66 发表于 2014-10-9 11:06:48

sitra 发表于 2014-10-9 10:23
为了排查晶振的影响,你可以这样尝试。
1、将晶振的外壳接一下地试试。
2、将电感换成屏蔽电感试试。


拉低复位管脚 强制复位可以重新启动

xiatao1800 发表于 2014-10-9 11:14:58

晶振周围要环绕地线,外壳也要接地
MCU电源加106的瓷片电容

sdkw 发表于 2014-10-9 11:18:23

与地线的布局关系较大

Xujuango 发表于 2014-10-9 11:20:07

测量加热瞬间 ,MCU电源的波形

hover_007 发表于 2014-10-9 11:21:40

{:biggrin:}{:biggrin:}{:biggrin:}{:biggrin:}

hetao7241 发表于 2014-10-9 11:30:32

排除布线,然后考虑电源,比如采用隔离电源,加磁环,然后再考虑电磁辐射

jyrpxj 发表于 2014-10-9 11:35:12

上电路图吧……

tarzar 发表于 2014-10-9 12:00:57

硬件可能性最大,从电源入手

AHTY 发表于 2014-10-9 12:27:39

看门狗不是独立rc时钟吗

zhcj66 发表于 2014-10-9 13:43:08

sitra 发表于 2014-10-9 10:23
为了排查晶振的影响,你可以这样尝试。
1、将晶振的外壳接一下地试试。
2、将电感换成屏蔽电感试试。


我为了排除是外界干扰到晶振,采用了内部RC还是会出现mcu和看门狗死掉问题

zhcj66 发表于 2014-10-9 13:44:35

AHTY 发表于 2014-10-9 12:27
看门狗不是独立rc时钟吗

如果看门狗没有死掉的话 ,看门狗应该复位MCU啊,可是没有复位,只能判断看门狗也死掉了

AHTY 发表于 2014-10-9 17:48:17

本帖最后由 AHTY 于 2014-10-9 18:30 编辑

zhcj66 发表于 2014-10-9 13:44
如果看门狗没有死掉的话 ,看门狗应该复位MCU啊,可是没有复位,只能判断看门狗也死掉了 ...

你那2675的5脚是怎么回事》?
是对的,和2576不一样,我看错了。
页: [1]
查看完整版本: AVR单片机死掉,连看门狗都死了,都有什么原因造成的?