是否必须先写TCCR2A再写OCR2A?-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2180|回复: 0

[未解决] 是否必须先写TCCR2A再写OCR2A?

[复制链接]
发表于 2021-6-28 12:50 | 显示全部楼层 |阅读模式
本帖最后由 帕菲菲 于 2021-6-28 12:54 编辑
  1. void setup()
  2. {
  3.   pinMode(7, OUTPUT);
  4.   TCCR2A = 2;
  5.   OCR2A = 252;
  6.   TCCR2B = 7;
  7.   TCNT2 = 0;
  8.   TIMSK2 = 2;
  9. }
  10. void loop()
  11. {
  12. }
  13. volatile uint16_t SR = 31;
  14. ISR(TIMER2_COMPA_vect)
  15. {
  16.   if (!--SR)
  17.   {
  18.     volatile uint8_t *const PinPort = portOutputRegister(digitalPinToPort(7));
  19.     const uint8_t BitMask = digitalPinToBitMask(7);
  20.     *PinPort ^= BitMask;
  21.     SR = 31;
  22.   }
  23. }
复制代码

上述代码可以符合预期地工作,使得连接在7号口的LED以大约1s为周期进行闪烁。但如果简单地交换两行代码的位置:
  1. void setup()
  2. {
  3.   pinMode(7, OUTPUT);
  4.   OCR2A = 252; //交换
  5.   TCCR2A = 2; //交换
  6.   TCCR2B = 7;
  7.   TCNT2 = 0;
  8.   TIMSK2 = 2;
  9. }
  10. void loop()
  11. {
  12. }
  13. volatile uint16_t SR = 31;
  14. ISR(TIMER2_COMPA_vect)
  15. {
  16.   if (!--SR)
  17.   {
  18.     volatile uint8_t *const PinPort = portOutputRegister(digitalPinToPort(7));
  19.     const uint8_t BitMask = digitalPinToBitMask(7);
  20.     *PinPort ^= BitMask;
  21.     SR = 31;
  22.   }
  23. }
复制代码

唯一的改动是,先写入OCR2A,再写入TCCR2A,反转了写入两个寄存器的时间顺序。结果发现LED灯常亮(这里存疑,肉眼观察到的现象是常亮,但是亮度似乎偏暗,有可能是PWM闪烁?),定时功能失效了?
硬件是Arduino Mega 2560。这两个寄存器难道不是互相独立的吗?为什么写入顺序会有影响?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-29 04:33 , Processed in 0.068765 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表