搜索
bottom↓
回复: 21

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

[复制链接]

出0入53汤圆

发表于 2014-10-9 09:31:32 | 显示全部楼层 |阅读模式
本帖最后由 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[SysUSART1.USARTReadNum] = UDR1;
        USART1_Putc(SysUSART1.USARTReadData[SysUSART1.USARTReadNum]);
        if(SysUSART1.USARTReadData[SysUSART1.USARTReadNum] == 0x0d)
        {
                SysUSART1.USARTReadData[SysUSART1.USARTReadNum] = 0;
                USART1ReadProcess();
                SysUSART1.USARTReadNum = 0;
        }
        else
        {
                SysUSART1.USARTReadNum++;
        }       
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入53汤圆

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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

出0入0汤圆

发表于 2014-10-9 09:40:42 | 显示全部楼层
电压,晶振查查看呢......

出0入0汤圆

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

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

出0入53汤圆

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

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

出0入53汤圆

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

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

出0入0汤圆

发表于 2014-10-9 10:06:04 | 显示全部楼层
先查查硬件

出0入53汤圆

 楼主| 发表于 2014-10-9 10:07:22 | 显示全部楼层

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

出0入0汤圆

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

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

出0入53汤圆

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

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

出0入0汤圆

发表于 2014-10-9 11:14:58 | 显示全部楼层
晶振周围要环绕地线,外壳也要接地
MCU电源加106的瓷片电容

出0入0汤圆

发表于 2014-10-9 11:18:23 | 显示全部楼层
与地线的布局关系较大

出0入4汤圆

发表于 2014-10-9 11:20:07 | 显示全部楼层
测量加热瞬间 ,MCU电源的波形

出0入0汤圆

发表于 2014-10-9 11:21:40 | 显示全部楼层

出0入0汤圆

发表于 2014-10-9 11:30:32 | 显示全部楼层
排除布线,然后考虑电源,比如采用隔离电源,加磁环,然后再考虑电磁辐射

出0入213汤圆

发表于 2014-10-9 11:35:12 | 显示全部楼层
上电路图吧……

出0入4汤圆

发表于 2014-10-9 12:00:57 来自手机 | 显示全部楼层
硬件可能性最大,从电源入手

出0入0汤圆

发表于 2014-10-9 12:27:39 来自手机 | 显示全部楼层
看门狗不是独立rc时钟吗

出0入53汤圆

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

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

出0入53汤圆

 楼主| 发表于 2014-10-9 13:44:35 | 显示全部楼层
AHTY 发表于 2014-10-9 12:27
看门狗不是独立rc时钟吗

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

出0入0汤圆

发表于 2014-10-9 17:48:17 | 显示全部楼层
本帖最后由 AHTY 于 2014-10-9 18:30 编辑
zhcj66 发表于 2014-10-9 13:44
如果看门狗没有死掉的话 ,看门狗应该复位MCU啊,可是没有复位,只能判断看门狗也死掉了 ...


你那2675的5脚是怎么回事》?
是对的,和2576不一样,我看错了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-4 04:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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