CVAVR启动delay库,调用delay_ms函数,自动带了喂狗程序因CH438用查询指令有while(!)等待语句,条件不变化时一直停此处所以虽然调用延时也会看门狗复位而其他中断接收、无等待不复位

402 篇文章 177 订阅

受到阿莫电子论坛答复的影响发现:请问有人用CodevisionAVR?里面看门狗的用法? 

cvavr编译时会在延时程序中自动加入喂狗指令,每一个毫秒一次,所以只要保证在看门狗动作的时间内有 delay_ms(1); 或更长的延时语句就会自动喂狗。 

请问有人用CodevisionAVR?里面看门狗的用法? (amobbs.com 阿莫电子论坛)

后来找到了原文出处也是在阿莫论坛

CVAVR 软件中启动delay.h库,调用delay_ms()函数,自动带了喂狗程序

近期在学习中发现个问题,CVAVR 中启动delay.h库,调用delay_ms()函数延时,系统怎么都不复位重启,即使打开看门狗熔丝位,看门狗也不会重启,找了很久原因,发现是调用调用系统自身带的delay_ms()函数引起的,换成自己的简单延时函数,问题就解决,看门狗可以正常工作,后面附带我自己写的简单延时函数。
后来查找问题,发现系统中的delay_ms()函数自带了喂狗程序,所以不会自动的重启,请大家放心使用,用延时函数看门狗不溢出是正常的。后面附带软件编辑后生产的汇编程序,一看就知道确实带了喂狗。
今天写出来供大家注意,不要犯我同样的问题。
/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.9 Standard
Chip type           : ATmega8L
Program type        : Application
Clock frequency     : 1.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega8.h>
#include <delay.h>   
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In  Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T  State0=T
PORTB=0x00;
DDRB=0x00;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In  Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T  State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
    //#asm("cli")  //关中断
    //#asm("WDR")  //看门狗计数器清零==喂狗
    WDTCR=0x1F;  //启动看门狗第一步
    WDTCR=0x0F;  //启动看门狗第二步
//#asm("sei")  //打开中断
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif

PORTB.1=0;
DDRB.1=1;

while (1)
      {               
      delay_ms(3000);  //延时3秒,理论应该是会反复的重启,但是却没有重启。
//Delay1000ms();  //换用自己的简单延时函数,看门狗问题解决
//Delay1000ms();
//Delay1000ms();
      PORTB.1=1 ;
      #asm("WDR")  //看门狗计数器清零==喂狗  在2.1秒溢出前必须清零
      };
}

//之上是测试程序,下面是我写的一个简单的大约延时1秒函数,时间不精确,大家只可以借鉴一下。
//大约延时1秒函数  
void Delay1000ms()                //@1MHz大约1秒的延时程序

{
        unsigned char i, j, k;
        i = 4;
        j = 166;
        k = 210;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

//下面是我打开汇编码,看到的结果
;         31 while (1)
_0x7:
;         32       {
;         33
;         34       delay_ms(3000);  //延时3秒,理论应该是会反复的重启,但是却没有重启。
        LDI  R30,LOW(3000)
        LDI  R31,HIGH(3000)
        ST   -Y,R31
        ST   -Y,R30
        RCALL _delay_ms
;程序运行到这里执行了下面的_delay_ms程序,请继续往下看
;         35       PORTB.1=1 ;
        SBI  0x18,1
;         36         #asm("WDR")  //看门狗计数器清零==喂狗  在2.1秒溢出前必须清零,这条是36行,执行的喂狗程序,下面的WDR就是喂狗
        WDR
;         37       };
        RJMP _0x7
;         38 }
_0xC:
        RJMP _0xC


_delay_ms:
        ld   r30,y+
        ld   r31,y+
        adiw r30,0
        breq __delay_ms1
__delay_ms0:
        __DELAY_USW 0xFA
        Wdr
;这里看到了没有,上面自动带了喂狗程序。。。。还是比较先进的啊!!
        sbiw r30,1
        brne __delay_ms0
__delay_ms1:
        ret

;END OF CODE MARKER
__END_OF_CODE:

CVAVR 软件中启动delay库,调用delay_ms()函数,自动带了喂狗... (amobbs.com 阿莫电子论坛)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CVAVR是一款用于Atmega16单片机的集成开发环境,我们可以利用它来实现自动浇花系统。 首先,我们需要连接Atmega16单片机与传感器、水泵、喷头等设备,确保它们之间的电气连接正常。 接下来,我们可以编写代码,实现自动浇花的功能。首先,我们需要添加必要的文件,以便使用Atmega16的相关功能和引脚控制。 然后,我们可以利用传感器来监测植物的湿度。如果湿度低于一定的阈值,说明植物需要浇水,我们可以通过控制水泵来为植物浇水。可以设定定浇水,比如每天早晨或晚上浇水一次。 同,我们可以利用喷头来喷水雾,以增加植物的湿度和保持适宜的环境湿度。 最后,我们可以添加LCD显示屏来显示植物的湿度以及自动浇水系统的运行状态等信息,方便监控和调试。 当系统运行,Atmega16周期性地读取传感器的数值,并根据预设的阈值判断是否需要浇水。如果需要浇水,Atmega16打开水泵并控制喷头,实现自动浇水的功能。 需要注意的是,除了浇水功能之外,我们还可以根据需要添加其他功能,比如温度监测、阳光照射控制等,以提供更好的养护环境。 综上所述,利用CVAVR和Atmega16单片机,我们可以设计并实现一套自动浇花系统,通过对植物湿度的监测与控制,实现自动浇水的功能,提高植物的生长质量和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值