Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Timer Arduino纳米计时器_Timer_Arduino_Avr_Atmel_Atmega - Fatal编程技术网

Timer Arduino纳米计时器

Timer Arduino纳米计时器,timer,arduino,avr,atmel,atmega,Timer,Arduino,Avr,Atmel,Atmega,我想更多地了解计时器 有什么计时器 它们会产生干扰吗 什么代码会将中断处理程序附加到它们 如何实现delay()和delayMicroseconds()呢。。。 他们使用定时器中断吗?(如果是,在此期间如何执行其他代码?) 或者他们重复轮询直到计时器达到某个值 或者它们是否会增加值X的次数 还是他们用另一种方式 思考Arduino纳米计时器的最佳方式是思考底层芯片中的计时器:处理器。它有三个计时器: 定时器0:8位,芯片引脚11和12上的PWM 定时器1:16位,芯片上的PWM引脚15和1

我想更多地了解计时器

  • 有什么计时器
  • 它们会产生干扰吗
  • 什么代码会将中断处理程序附加到它们
  • 如何实现
    delay()
    delayMicroseconds()
    呢。。。
    • 他们使用定时器中断吗?(如果是,在此期间如何执行其他代码?)
    • 或者他们重复轮询直到计时器达到某个值
    • 或者它们是否会增加值X的次数
    • 还是他们用另一种方式

  • 思考Arduino纳米计时器的最佳方式是思考底层芯片中的计时器:处理器。它有三个计时器:

    • 定时器0:8位,芯片引脚11和12上的PWM
    • 定时器1:16位,芯片上的PWM引脚15和16
    • 定时器2:8位,芯片上PWM引脚17和5
    所有这些定时器都可以产生两种中断:

    • “值匹配”中断发生在计时器值达到计时器寄存器中的比较值时,该值被添加到计时器的每个刻度上
    • 当定时器值达到其最大值时,定时器溢出中断发生
    不幸的是,没有Arduino函数将中断附加到计时器。要使用定时器中断,您需要编写更多的低级代码。基本上,您需要声明如下内容:

    ISR(TIMER1_OVF_vect) {
       ...
    }
    
    TIMSK1 |= (1<<TOIE1);
    
    这将声明一个函数来服务计时器1溢出中断。然后需要使用
    TIMSK1
    寄存器启用定时器溢出中断。在上述示例中,这可能如下所示:

    ISR(TIMER1_OVF_vect) {
       ...
    }
    
    TIMSK1 |= (1<<TOIE1);
    
    这将在TIMSK1寄存器中设置
    TOIE1
    (请生成定时器1溢出中断)标志。假设您的中断已启用,则每当TIMER1溢出时,
    ISR(TIMER1\u OVF\u vect)
    都将被调用


    Arduino
    delay()
    函数在源代码(
    wiring.c
    )中如下所示:

    因此,它在内部使用
    micros()
    函数,该函数实际上依赖于计时器0计数。Arduino框架使用timer0计算毫秒数,实际上,timer0 count是
    millis()
    函数获取其值的地方

    另一方面,
    delayMicroseconds()
    函数使用某些定时的微处理器操作来创建延迟;使用哪种功能取决于处理器和时钟速度;最常见的是
    nop()
    (无操作),它只需要一个时钟周期。Arduino Nano使用16MHz时钟,下面是它的源代码:

    // For a one-microsecond delay, simply return. The overhead
    // of the function call yields a delay of approximately 1 1/8 µs.
    if (--us == 0)
        return;
    
    // The following loop takes a quarter of a microsecond (4 cycles)
    // per iteration, so execute it four times for each microsecond of
    // delay requested.
    us <<= 2;
    
    // Account for the time taken in the proceeding commands.
    us -= 2;
    
    //对于一微秒的延迟,只需返回即可。头顶
    //函数调用的延迟约为1 1/8µs。
    如果(--us==0)
    返回;
    //以下循环需要四分之一微秒(4个循环)
    //每一次迭代,每一微秒执行四次
    //请求延期。
    
    谢谢!很高兴你发现它很有用。