ESP8266 Timer1与Neopixels WS2812库冲突

时间:2018-03-10 11:29:34

标签: arduino esp8266 isr

我想添加一个Timer1 ISR,每隔0.25秒进行一次点火,并使用WS2812 240条带进行轻微运动。

事情在Arduino Nano上运作良好,因为它有一个

  cli(); 
  TCCR1A = 0;   // pas de PWM ou OCR
  TCCR1B = (0<<WGM13) | (1<<WGM12) | 4; // Clear Timer on Compare match (CTC) mode, OCR1A= PRD
                                                                                // CS12 CS11 CS10 = 0b100 = 4 =>256 prescaler
  OCR1A = 15625; // 62.5 ns * 15625 * 256 prescaler = 0.250 s
  // pas de compteur logiciel
  TIMSK1 = 1<<OCIE1A; // ISR on Output Compare1 (TCNT1==OCR1)
    TIFR1 = 0;  // clear T1 IF
  TCNT1 = 0; // RAZ T1
  sei(); 

现在我搬到了ESP8266,在我的项目中也使用Wifi,没有OCR,所以我尝试使用Timer1 ISR(Timer0用于Wifi)。

单独行动:

//setup
timer1_attachInterrupt(myTimer1_ISR);
timer1_enable(TIM_DIV16, TIM_EDGE, TIM_SINGLE);
timer1_write(300000); //120000 us/2
...

void ICACHE_RAM_ATTR myTimer1_ISR()
{ 
//.....
timer1_write(300000);//12us/2
}

但是对于NeoPixels库,它给了我冲突:

  

错误:void myTimer1_ISR()导致与静态的段类型冲突   volatile void NeoEsp8266DmaMethodBase :: i2s_slc_isr()[with   T_SPEED = NeoEsp8266DmaSpeed400Kbps]

     

void ICACHE_RAM_ATTR myTimer1_ISR(){

     

包含来自的文件   ...的Arduino \库\ NeoPixelBus_by_Makuna \ SRC / NeoPixelBus.h:67:0,

我相信,NeoPixel代码也使用Timer1? 我该如何管理? 感谢

1 个答案:

答案 0 :(得分:1)

ESP8266有一个Ticker课程,可以满足你的目的。

如果你试图在回调中运行太长时间,我有一个怪癖,在这种情况下,建议使用它的方法是设置一个标志,然后检查你的循环中的标志,做你的东西并重置国旗。如果你有一些简短的东西,你可以直接在回调中进行。

这是一个例子。

#include <Ticker.h>

bool doEveryOneMsStuffNow = false; // start with flag false
Ticker everyOneMs;

void setup() {
  // ... 
 everyOneMs.attach(0.001, []() { doEveryOneMsStuffNow = true; });  // lambda call back - this one just sets the flag to true
  // ...
}

void loop() {
  // ...
  if (doEveryOneMsStuffNow) {
    doEveryOneMsStuffNow = false;  // reset the flag
    // do what needs to be done every 1 ms
  }
  // ...
}