shuaichanggong 发表于 2009-11-6 15:46:53

【求助】【马老师帮个忙】关于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")            //喂狗
      };
}

shuaichanggong 发表于 2009-11-6 15:51:07

ATtiny13 管脚少,怎么用软件仿真啊?好像AVR Studio 4里Debug Platform中没有适合ATtiny13的啊,软仿是选 AVR Simulator的吧,里面没有ATtiny13啊。

shuaichanggong 发表于 2009-11-6 15:55:13

因为定时器资源少,我用软件延时测试,通过测量管脚电平确定是否看门狗工作
程序如下:
#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);
}   
}

shuaichanggong 发表于 2009-11-6 15:58:58

但是被测试程序里用到的中断是否和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; };却怎么感觉这段延时不起作用。

shuaichanggong 发表于 2009-11-6 16:01:43

刚刚实习,碰到的问题,同事们都埋头工作,我只好先求救马老师了。avr我刚学。。。正在努力!

shuaichanggong 发表于 2009-11-6 16:09:23

这个中断是定时器工作的吧,而delay_ms(2000); 是mcu软件延时。应该不冲突的吧

shuaichanggong 发表于 2009-11-9 10:07:06

我在百度知道的提问:http://zhidao.baidu.com/question/124780641.html
页: [1]
查看完整版本: 【求助】【马老师帮个忙】关于CVAVR编的ATtiny13的看门狗问题,怎么检查它工作了呢?