0

我正在编写一个 Atmega324a 微控制器,我正在尝试实现一个计时器(在本例中为 Timer1),它应该使连接到我的电路板的第二个 LED 闪烁。我还需要知道如何识别 LED 连接到的引脚 我找到了数据表: http ://ww1.microchip.com/downloads/en/DeviceDoc/ATmega164A_PA-324A_PA-644A_PA-1284_P_Data-Sheet-40002070A .pdf 但细节对我来说太技术性了,我不知道从哪里开始寻找,最重要的是,得到结果,这就是代码本身。

另外,ISR 功能有什么作用?

下面是定时器 0 的当前 Init_timer 函数。我可以同时启用两个定时器吗?

static void init_timer(void)
{
    // Configure Timer0 for CTC mode, 64x prescaler for 1 ms interval
    TCCR0A = _BV(WGM01);
    TCCR0B = _BV(CS01) | _BV(CS00);
    OCR0A = 124;
    TIMSK0 = _BV(OCIE0A);
}

int main(void){
    MCUSR = 0;
    wdt_disable();

    init_pins();        // Reset all pins to default state
    init_timer();       // Initialize 1 msec timer interrupt

    configure_as_output(LOAD_ON);
    configure_as_output(LED1);
    configure_as_output(LED2);

    sei();
        .
        .
        .
}

ISR(TIMER0_COMPA_vect)
{
    static uint16_t ms_count = 0;

    ms_count++;             // milliseconds counter

    if (ms_count == TMP107_POLL_PERIOD)
    {
        tmp107_command();   // send command to temperature sensor
        toggle(LED1);       // blink status led

        ms_count = 0;
    }
}
4

1 回答 1

1

首先:StackOverflow 是一个围绕源代码提问的网站,它不是一个提供服务的解决方案。请参加游览,它将帮助您获得满意的答案。

但没关系,因为你是新人:

例如,您可以通过以下步骤为脉冲宽度发生器实现定时器:

  1. 学习阅读数据表。没有人能减轻你的负担。
  2. 了解如何使用输出引脚。
  3. 编写一些测试以确保您了解输出引脚。
  4. 选择一个计时器来测量时钟周期。显然你已经这样做了。
  5. 学习使用这个计时器。一些定时器可以在硬件中生成 PWM(脉冲宽度调制)信号。但是,输出引脚可能位于固定位置,可能的周期范围可能无法满足您的要求。
  6. 编写一些测试以确保您了解计时器和中断。
  7. 例如,如果定时器所需的脉冲周期太长,您可以添加一个额外的变量来按比例缩小。
  8. 实施其余部分。

另外,ISR 功能有什么作用?

当满足中断条件时,硬件会“神奇地”调用此函数。在所示的情况下,tmp107_command()并且toggle(LED1)仅每次调用TMP107_POLL_PERIOD

我可以同时启用两个计时器吗?

当然。

于 2019-07-24T06:32:28.503 回答