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++;
}
} sitra 发表于 2014-10-9 09:42
2楼说的在理。楼主可以加一个电源监控芯片试试看,比如MAX6809这种货。
另外,测一下晶振波形,如果干扰 ...
3楼说的让我想起了 有个电压的高频电感和晶振靠的非常的近。发现了这个很不合理的地方。哎 设计的时候没注意,低级错误
一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。 电压,晶振查查看呢...... waterghost 发表于 2014-10-9 09:36
一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。 ...
2楼说的在理。楼主可以加一个电源监控芯片试试看,比如MAX6809这种货。
另外,测一下晶振波形,如果干扰导致晶振挂掉也会出现这种情况。 waterghost 发表于 2014-10-9 09:36
一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。 ...
去掉加热 现在没有出现,加热电压36v 加热电阻大约是1欧姆 大概能测到的电流20A多些因为是晶闸管控制的。
开始加热0.6s的持续加热其他时间加热是瞬间的。 waterghost 发表于 2014-10-9 09:36
一般电源这方面问题。用的是低端8位,
经常性的LDO在电源有突片的时候不会恢复。卡在某个低电压。 ...
“用的是低端8位”是什么意思 没有明白 先查查硬件 hbtss 发表于 2014-10-9 10:06
先查查硬件
大家都一致认为硬件出现问题比较大吗? zhcj66 发表于 2014-10-9 10:05
3楼说的让我想起了 有个电压的高频电感和晶振靠的非常的近。发现了这个很不合理的地方。哎 设计的时候没 ...
为了排查晶振的影响,你可以这样尝试。
1、将晶振的外壳接一下地试试。
2、将电感换成屏蔽电感试试。
3、实测一下你加热到最高温度的时候,测一下晶振的壳温。看是否超了。 sitra 发表于 2014-10-9 10:23
为了排查晶振的影响,你可以这样尝试。
1、将晶振的外壳接一下地试试。
2、将电感换成屏蔽电感试试。
拉低复位管脚 强制复位可以重新启动 晶振周围要环绕地线,外壳也要接地
MCU电源加106的瓷片电容 与地线的布局关系较大 测量加热瞬间 ,MCU电源的波形 {:biggrin:}{:biggrin:}{:biggrin:}{:biggrin:} 排除布线,然后考虑电源,比如采用隔离电源,加磁环,然后再考虑电磁辐射 上电路图吧…… 硬件可能性最大,从电源入手 看门狗不是独立rc时钟吗 sitra 发表于 2014-10-9 10:23
为了排查晶振的影响,你可以这样尝试。
1、将晶振的外壳接一下地试试。
2、将电感换成屏蔽电感试试。
我为了排除是外界干扰到晶振,采用了内部RC还是会出现mcu和看门狗死掉问题 AHTY 发表于 2014-10-9 12:27
看门狗不是独立rc时钟吗
如果看门狗没有死掉的话 ,看门狗应该复位MCU啊,可是没有复位,只能判断看门狗也死掉了 本帖最后由 AHTY 于 2014-10-9 18:30 编辑
zhcj66 发表于 2014-10-9 13:44
如果看门狗没有死掉的话 ,看门狗应该复位MCU啊,可是没有复位,只能判断看门狗也死掉了 ...
你那2675的5脚是怎么回事》?
是对的,和2576不一样,我看错了。
页:
[1]