gpt4 book ai didi

使用 arduino IDE 自定义延迟功能

转载 作者:太空宇宙 更新时间:2023-11-04 06:18:27 25 4
gpt4 key购买 nike

我在上微处理器课,我们正在编写自己的延迟函数,这些函数实际上是准确的。我假设我们的教授给了我们一个 4 毫秒的延迟函数。我真的不明白如何将其转换为 0.25 秒或 1 秒的延迟,这两者都是我的作业所需要的。

给定函数如下(假设_BV()定义为_BV(x) 1<<(x)):

DDRB |= _BV(1);
TCCR1A |= _BV(COM1A0);
TCNT1 = 0;
OCR1A = 100;
TIFR1 = _BV(OCF1A);
TCCR1B |= _BV(CS10);
while((TIFR1 & _BV(OCF1A)) == 0);

TIFR1 = _BV(OCF1A);
OCR1A = 100 + 64000;
while((TIFR1 & _BV(OCF1A)) == 0);
TCCR1B = 0;
TCCR1A = 0;

我已经编写了完成作业所需的代码,除了两个延迟函数。

这是我目前所拥有的:

#include <avr/io.h>

uint8_t numIN;

void setup() {
Serial.begin(9600);

DDRB |= _BV(5);
}

void loop() {
int i;

numIN = 10;

Serial.println("Enter a number between 0 and 9.");

do {
while (Serial.available() > 0)
{
numIN = Serial.read() - '0';
if (numIN < 0 || numIN > 9)
{
Serial.println("Input Error!");
}
}
} while (numIN < 0 || numIN > 9);

Serial.print("You entered ");
Serial.println(numIN);

if (isEven(numIN))
{
for (i = 0; i < 5; i++)
{
PORTB |= _BV(5);
delay(1000); //temporary
//delay_Sec();
PORTB &= ~_BV(5);
delay(1000); //temporary
//delay_Sec();
}
}

else
{
for (i = 0; i < 5; i++)
{
PORTB |= _BV(5);
delay(250); //temporary
//delay_quarterSec();
PORTB &= ~_BV(5);
delay(250); //temporary
//delay_quarterSec();
}
}
}

void delay_quarterSec(void)
{
//need to finish
}

void delay_Sec(void)
{
//need to finish
}

boolean isEven(int num)
{
if (num & _BV(0))
return false;

else
return true;
}

我很困惑如何将我教授的代码转移到我需要做的事情上。非常感谢任何帮助!

最佳答案

我可以让您快速了解所提供的代码的作用。

(这是我的内存,所以不要相信我的话。而且你没有提到你的 Controller 类型。你将不得不详细查找寄存器。)

DDRB |= _BV(1);         // set the compare match output pin to output
TCCR1A |= _BV(COM1A0); // enable output compare PIN toggle
TCNT1 = 0; // set counter start value to 0
OCR1A = 100; // set compare match value to 100 (the actual delay)
TIFR1 = _BV(OCF1A); // clear the output compare flag
TCCR1B |= _BV(CS10); // enable the timer by setting the pre-scaler
while((TIFR1 & _BV(OCF1A)) == 0); // wait until the timer counted to 100 (compare flag is set again)

所以实际延迟取决于:

  • 预分频器的设置
  • Controller 的时钟速度
  • OCR1A的值

例子:
如果预分频器设置为 1 并且您以 10MHz 运行,您将得到
t = (1/(10000000/s)) * 100 = 10us

这应该可以帮助您入门。

关于使用 arduino IDE 自定义延迟功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40499594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com