【求助】【马老师帮个忙】关于CVAVR编的ATtiny13的看门狗问题,怎么检查它工作了呢?
/*****************************************************This program was produced by the
CodeWizardAVR V1.24.7d Professional
Automatic Program Generator
?Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com
Project : 红外解码
Version :
Date : 2007-9-4
Author: xxx
Company : xxx
Comments: 输出用PB0,1,2,3脚,增加译码只需要把相应的Codex修改掉就可以了
Chip type : ATtiny13
Clock frequency : 9.600000 MHz
Memory model : Tiny
External SRAM size: 0
Data Stack size : 16
*****************************************************/
#define Code1 0x0CA0
#define Code2 0x0C90
#define Code3 0x0d20
#define Code4 0x0d10
#define Code5 0x0d08
#define Code6 0x0d04
#define Code7 0x0d02
#define Code8 0xfffa
#define Code9 0xfff9
#define Code10 0xfff8
#define Code11 0xfff7
#define Code12 0xfff6
#define Code13 0xfff5
#define Code14 0xfff4
#define Code15 0xfff3
#include <tiny13.h>
unsigned char HighPoint,LowPoint; //高电压,低电压
long int ReceiveData;
int ReceiveData1,ReceiveData2,TimeCount; //这两个变量用来做效验,看2次收到的是否一样,对保持时间的计数
bit CodeOutFlag; //这个标志为用来表示是否在做译码输出
// Timer 0 output compare A interrupt service routine
interrupt void timer0_compa_isr(void) //定时器保证每个时间间隔a采样10个点,42us的定时
{
if (PINB.4==0)
{
HighPoint++;
}
else
{if (HighPoint!=0)
{
LowPoint++;
}
}
if (CodeOutFlag==1)
{TimeCount++;
if (TimeCount==3809)
{TimeCount=0;
CodeOutFlag=0;
}
}
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
PORTB=0x10;
DDRB=0x0f;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 1200.000 kHz
// Mode: CTC top=OCR0A
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x02;
TCCR0B=0x02;
TCNT0=0x00;
OCR0A=0x38;
OCR0B=0x00;
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=0x00;
MCUCR=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
ACSR=0x80;
ADCSRB=0x00;
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/512k
// Watchdog Timer interrupt: Off
WDTCR=0x38; //看门狗约为4s
WDTCR=0x28;
// Global enable interrupts
#asm("sei")
while (1)
{if (LowPoint==3) //采到3个低电平认为该位编码结束
{if ((HighPoint>5)&(HighPoint<15)) //认为收到0
{
ReceiveData=(ReceiveData<<1);
}
else if ((HighPoint>24)&(HighPoint<36)) //认为收到1
{
ReceiveData=(ReceiveData<<1)+1;
}
//如果不在范围内,不进行操作,相当于舍弃了该位
LowPoint=0;
HighPoint=0;
}
//下面为编码输出部分
ReceiveData1=(int)(ReceiveData&0x00000fff);
ReceiveData2=(int)((ReceiveData>>12)&0x00000fff);
if ((ReceiveData1==ReceiveData2)&(ReceiveData1!=0))
{
CodeOutFlag=1;
TimeCount=0;
switch(ReceiveData1)
{case Code1:PORTB=0x01;ReceiveData=0;break;
case Code2:PORTB=0x02;ReceiveData=0;break;
case Code3:PORTB=0x03;ReceiveData=0;break;
case Code4:PORTB=0x04;ReceiveData=0;break;
case Code5:PORTB=0x05;ReceiveData=0;break;
case Code6:PORTB=0x06;ReceiveData=0;break;
case Code7:PORTB=0x07;ReceiveData=0;break;
default:break;
}
}
if (CodeOutFlag==0) //时间到将编码输出置为全0;
{PORTB&=0xf0; //把PB0,1,2,3脚输出置0
}
#asm("WDR") //喂狗
};
} ATtiny13 管脚少,怎么用软件仿真啊?好像AVR Studio 4里Debug Platform中没有适合ATtiny13的啊,软仿是选 AVR Simulator的吧,里面没有ATtiny13啊。 因为定时器资源少,我用软件延时测试,通过测量管脚电平确定是否看门狗工作
程序如下:
#include <tiny13.h>
#include <delay.h>
void main(void)
{
PORTB=0x10;
DDRB=0x0f;
PORTB.1=0;
delay_ms(2000);
#asm("cli")
#asm("WDR")
WDTCR=0x18; //看门狗约为4s
WDTCR=0x28;
#asm("sei")
while (1)
{
PORTB.1=1;
#asm("WDR")
delay_ms(2000);
PORTB.1=0;
#asm("WDR")
delay_ms(2000);
}
} 但是被测试程序里用到的中断是否和delay_ms(2000); 冲突呢?
我改用中断里计数,interrupt void timer0_compa_isr(void)
{
Count++; ...}
main函数里:
while (1)
{
while(Count<42553);
Count=0;
PORTB.1=1;
while(Count<42553);
Count=0;
PORTB.1=0; };却怎么感觉这段延时不起作用。 刚刚实习,碰到的问题,同事们都埋头工作,我只好先求救马老师了。avr我刚学。。。正在努力! 这个中断是定时器工作的吧,而delay_ms(2000); 是mcu软件延时。应该不冲突的吧 我在百度知道的提问:http://zhidao.baidu.com/question/124780641.html
页:
[1]