如何将 ISR 设置为每秒运行 - C Atmega328p

Posted

技术标签:

【中文标题】如何将 ISR 设置为每秒运行 - C Atmega328p【英文标题】:How to set ISR to run every second - C Atmega328p 【发布时间】:2015-12-10 20:06:05 【问题描述】:

我正在编写一个需要每 0.5 秒检查一次传感器输入的代码。我想使用 ISR,因为我希望我的代码在传感器的输入发生变化之前一直执行。

如何将此 ISR 设置为每 0.5 秒执行一次?

谢谢:)

【问题讨论】:

atmel.com/images/… 这是数据表 ^^^ 请参阅数据表和/或用户手册。要通知您的“代码”,请设置一些您必须轮询的标志,或者,如果您有操作系统,请发出信号量。 【参考方案1】:

我建议使用定时器中断。举个例子去这里。 http://www.avrfreaks.net/forum/tut-c-newbies-guide-avr-timers?page=all

我自己没有测试过,但这里有一段代码。

#include 
#include 

int main (void)

   DDRB |= (1 << 0); // Set LED as output

   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode

   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt

   sei(); //  Enable global interrupts

   OCR1A   = 15624; // Set CTC compare value to 1Hz at 1MHz AVR clock, with a prescaler of 64

   TCCR1B |= ((1 << CS10) | (1 << CS11)); // Start timer at Fcpu/64

   for (;;)
   

   


ISR(TIMER1_COMPA_vect)

   PORTB ^= (1 << 0); // Toggle the LED

【讨论】:

我必须定义 TIMER1_COMPA_vect 吗? 老实说,我没有阅读这篇文章,但我认为 TIMER1_COMPA_vect 要么设置在其他文件中,要么已在该文件中定义为 TIMSK 上 CTC 中断的中断。通常,这些程序的工作方式需要以某种方式通知系统在触发中断(ISR)时要调用什么函数。在某些情况下,第二个文件保存整个中断表。在其他情况下,需要进行某种设置中断函数调用。我建议阅读详细文章以获取更多信息。 想通了。非常感谢!抱歉,这是新手! 不用担心中断是一个令人困惑的话题,但它们可能是最值得理解的概念之一。如果您知道 PWM 是什么,那么您现在有望了解它们是如何建立在定时器中断上的。无论如何,如果有什么你觉得我没有在这里和在 cmets 中提到以获得答案,请将它们列在下面,以便其他人可以找到答案。 啊,数据手册明确指出:“OCR1A 定义了计数器的最高值。”计数器从 0 开始,而不是 1,因此必须从所需频率中减去 1。我喜欢在代码中将这些细节记录为 cmets,因为它们是晦涩的事实,很难在数据表中找到。很遗憾,大多数教程都没有这样做。

以上是关于如何将 ISR 设置为每秒运行 - C Atmega328p的主要内容,如果未能解决你的问题,请参考以下文章

在执行更晚的代码之前执行内存写入

RTOS如何从中断进行任务切换

Arduino Uno 上的两个 ISR

c ++应用程序中的C ISR处理程序

如何设置首次设置通知后每秒触发的本地通知?

找不到.cpp文件中的ISR