|
本帖最后由 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, 杜汶泽)
|