Я узнал, как использовать прерывание 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 для передачи на другое устройство.