关于延时的问题
马老师,您上边贴的教材第六章第15页的那个delay()是怎么来的,怎么比较精确的用for或者while循环延时,在#include <delay.h>的延时函数_delay_ms()是基于多大晶阵的,不同晶振下怎么使用,谢谢马老师 1.delay()函数是CVAVR扩展的函数。2.不提倡使用软件延时。第6章由于还没介绍中断与T/C,所以先使用了软件延时。
3.用高级语言设计精确的软件延时比较困难,要通过反汇编查看,或通过模拟仿真凑一下。使用汇编会好一点,因为可以通过计算指令周期来得到。但不管如何,软件延时都不能讲非常精确,你再算的精确,但你无法考虑被中断打断将怎样。所以比较精确的长时延时采用T/C为好。软件延时主要使用在需要延时几个或十几个指令周期的地方,如使用NOP语句等。
4.以下是CVAVR中对delay()函数使用的说明;
These functions are intended for generating delays in C programs.
The prototypes for these functions are placed in the file delay.h, located in the ..\INC subdirectory. This file must be #include -ed before using the functions.
Before calling the functions the interrupts must be disabled, otherwise the delays will be much longer then expected.
Also it is very important to specify the correct AVR chip clock frequency in the Project|Configure|C Compiler|Code Generation menu.
The functions are:
void delay_us(unsigned int n)
generates a delay of n mseconds. n must be a constant expression.
void delay_ms(unsigned int n)
generates a delay of n milliseconds.
This function automatically resets the watchdog timer every 1ms by generating the wdr instruction.
Example:
void main(void) {
/* disable interrupts */
#asm("cli")
/* 100ms delay */
delay_us(100);
/* ............. */
/* 10ms delay */
delay_ms(10);
/* enable interrupts */
#asm("sei")
/* ............. */
}
注意这句:Also it is very important to specify the correct AVR chip clock frequency in the Project|Configure|C Compiler|Code Generation menu.
你只要按说明在编译环境中正确的指定系统时钟的频率,即与你实际硬件环境使用的一样,采用该函数就能得到正确的延时,如果不被中断打断的话,其精度可以满足一般的使用了。 非常感谢马老师能抽出时间给我讲这么多,还有个问题,GCC中延时函数_delay_ms()怎么用,比如_delay_ms(40)就是延时40ms吗(1MHz晶振),还是要40/4=10ms 我没用过GCC。这些函数都是扩展的函数,在该软件平台的HELP中应该对其有使用的说明。
delay的使用应该同CVAVR类似的。
页:
[1]