一定时间后在Arduino上执行事情

时间:2018-08-09 07:54:23

标签: c embedded atmega

我有一个带ATmega328P的Arduino Nano。我正在使用Atmel Studio对其进行C编程,我需要以下程序:

我有5个输入(PC3-PC7),每个输入应具有各自的计时器,每个驱动器具有2个(一个红色,一个绿色)LED。

  • 输入引脚(PC3-PC7)上的每个高电平都会触发一个单独的计时器,该计时器应该长10分钟。
  • 输入引脚上的高电平应持续这10分钟的时间。如果在运行时变为低电平,则可能发生某些情况(LED闪烁,蜂鸣器点亮)。
  • 如果计时器已达到10分钟标记,则会发生某些情况(红色LED熄灭,绿色LED亮,蜂鸣器点亮)。

我认为需要time.h库,但是我不知道如何编程。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

可能没有为此的预制库。

您需要的是在硬件外设计时器之上编程某种形式的硬件抽象层(HAL)。一个硬件计时器/ RTC应该足够了。每隔x个时间单位触发一次中断,具体取决于可用的预分频器时钟。

从此计时器中断中,计数各个正在进行的任务,看看是否该执行它们了。在伪代码中,它可能看起来像这样:

void timer_ISR (void)  // triggers once every x time units
{
  // clear interrupt source etc here
  // set up timer again, if needed, here

  counter++; // some internal counter

 // possibly, enable maskable interrupts here. If I remember AVR, this is asm SEI.

  for(size_t i=0; i<timers; i++)
  {
    if(counter == timer[i].counter)
    {
      timer[i].execute();
      timer[i].enable = false;
    }
  }
}

其中execute是指向回调函数的函数指针。

答案 1 :(得分:-1)

您应该做的第一件事是设置计时器中断。你可以阅读  timer interrupt

设置计时器后,您应该使用1或2个变量来达到10分钟。

就像:定时器int每次进入ISR(中断功能)时都应增加Varb1。每次Varb1溢出时,Varb2应该增加,而当Varb2溢出时,Varb3应该增加...等等。

之所以要使用它,是因为计时器仅保留非常小的时间(以毫秒或微秒为单位)。