Serial.print () массив, заполненный в ISR Timer1 Arduino - PullRequest
0 голосов
/ 21 февраля 2019

Я узнал, как использовать прерывание Timer1 с Arduino Uno.Я написал этот код, который делает именно то, что я хочу, печатая числа от 0 до 49 на Serial Monitor каждые пять секунд:

#include <TimerOne.h>

#define TIMER_US 100000

const int payload_length = 50;
volatile int payload_buffer[payload_length] = {0};
volatile int payload_capacity = -1;


void setup() {

  Timer1.initialize(TIMER_US);                  // Initialise timer 1
  Timer1.attachInterrupt( timerIsr );           // attach the ISR routine here
  Serial.begin(115200);
  Serial.println(0);
}

void loop() {

  if(payload_capacity+1 == payload_length)
  {

    int output_buffer[payload_length] = {0};
    int *src = payload_buffer;
    int *dst = output_buffer;
    noInterrupts();
    memcpy(dst, src, sizeof(payload_buffer));
    payload_capacity = -1;
    interrupts();
    for(int i=0; i<payload_length; i++)
    {
      int audio_signal = output_buffer[i];

      Serial.print(audio_signal);
      Serial.print(" ");
      //radio.write( &audio_signal, sizeof(int) ));

    }
    Serial.println(" ");
  }
}

void timerIsr()
{
  if(payload_capacity+1 < payload_length )
  {
    payload_capacity++;
    payload_buffer[payload_capacity] = payload_capacity;
  }
}

Однако, когда я изменяю payload_length на значение 512,Последовательный монитор печатает число 0 каждые пятьдесят секунд или около того.Вместо этого я ожидал, что Serial Monitor напечатает числа от 0 до 511. Почему этого не произошло?

Я попытался уменьшить TIMER_US до 100 микросекунд, и все же Serial Monitor не имеет проблем с печатью от 0 до49, когда payload_length равно 50, но печатается только 0, когда payload_length равно 512.

Неужели я неправильно понял, как прерывания работают с другими переменными или с командой последовательной печати?

ПРИМЕЧАНИЕ. Этоявляется частью подхода, в котором я надеюсь использовать ISR для выборки аналоговых значений из analogRead(A0) и сохранения значений в массиве.Когда массив заполнится, я планирую использовать nrf24l01 для передачи на другое устройство.

...