搜索
bottom↓
回复: 6

【求助】【马老师帮个忙】关于CVAVR编的ATtiny13的看门狗问题,怎么检查它工作了呢?

[复制链接]

出0入0汤圆

发表于 2009-11-6 15:46:53 | 显示全部楼层 |阅读模式
/*****************************************************
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 [TIM0_COMPA] 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")            //喂狗
      };
}

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

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

出0入0汤圆

 楼主| 发表于 2009-11-6 15:51:07 | 显示全部楼层
ATtiny13 管脚少,怎么用软件仿真啊?好像AVR Studio 4里Debug Platform中没有适合ATtiny13的啊,软仿是选 AVR Simulator的吧,里面没有ATtiny13啊。

出0入0汤圆

 楼主| 发表于 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);
}     
}

出0入0汤圆

 楼主| 发表于 2009-11-6 15:58:58 | 显示全部楼层
但是被测试程序里用到的中断是否和delay_ms(2000); 冲突呢?
我改用中断里计数,interrupt [TIM0_COMPA] 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; };却怎么感觉这段延时不起作用。

出0入0汤圆

 楼主| 发表于 2009-11-6 16:01:43 | 显示全部楼层
刚刚实习,碰到的问题,同事们都埋头工作,我只好先求救马老师了。avr我刚学。。。正在努力!

出0入0汤圆

 楼主| 发表于 2009-11-6 16:09:23 | 显示全部楼层
这个中断是定时器工作的吧,而delay_ms(2000); 是mcu软件延时。应该不冲突的吧

出0入0汤圆

 楼主| 发表于 2009-11-9 10:07:06 | 显示全部楼层
我在百度知道的提问:http://zhidao.baidu.com/question/124780641.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-23 04:16

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

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