At first I thought that this issue might be due to the rapid (every 5 ms) printing to the Serial. So, I upped the baud to 115200 and decreased the printing rate to once every 5 seconds. The code below is very similar to that in Post #19:
A T3.2 supplies interrupt pulses at ~20 Hz:
Code:
void setup() {
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, HIGH);
delayMicroseconds(50);
digitalWrite(13, LOW);
delay(50);
}
The pulses trigger interrupts on a second T3.2:
Code:
#include "Arduino.h"
volatile uint32_t frameNum;
const uint32_t broadcastPeriod = 5000000; // us
const uint32_t resetTime = 2000; // ms
const uint8_t interruptPin = 16;
elapsedMicros t;
volatile uint32_t tLastNewFrameMillis;
uint32_t eventCount = 0;
void newFrame() {
frameNum++;
tLastNewFrameMillis = millis();
}
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("Starting");
pinMode(interruptPin, INPUT);
frameNum = 0;
attachInterrupt(digitalPinToInterrupt(interruptPin), newFrame, RISING);
t = 0;
}
void loop() {
uint32_t localFrameNum, localFameMillis;
noInterrupts();
localFrameNum = frameNum;
localFameMillis = tLastNewFrameMillis;
interrupts();
if (t > broadcastPeriod) {
Serial.print("Frame Number: ");
Serial.print(localFrameNum);
Serial.print(", Event Count: ");
Serial.println(eventCount);
t = 0;
}
uint32_t currentTime = millis();
if (currentTime - localFameMillis > resetTime) {
Serial.print("Event Detected, Frame Number: ");
Serial.print(localFrameNum);
Serial.print(", tLastNewFrameMillis: ");
Serial.print(localFameMillis);
Serial.print(", currentTime: ");
Serial.println(currentTime);
frameNum = 0;
eventCount++;
}
}
I ran this setup for more than 14 hours with no anomalous events detected. Here's the tail of the Serial log:
Code:
Frame Number: 1069156, Event Count: 0
Frame Number: 1069656, Event Count: 0
Frame Number: 1069756, Event Count: 0
Frame Number: 1069856, Event Count: 0
Frame Number: 1069956, Event Count: 0
Frame Number: 1070055, Event Count: 0
Frame Number: 1070155, Event Count: 0
Frame Number: 1070255, Event Count: 0
Frame Number: 1070355, Event Count: 0
Frame Number: 1070455, Event Count: 0
Frame Number: 1070555, Event Count: 0
Frame Number: 1070655, Event Count: 0
Frame Number: 1070755, Event Count: 0
Frame Number: 1070855, Event Count: 0
Frame Number: 1070954, Event Count: 0
Frame Number: 1071054, Event Count: 0
Frame Number: 1071154, Event Count: 0
Frame Number: 1071254, Event Count: 0
Frame Number: 1071354, Event Count: 0
Frame Number: 1071454, Event Count: 0
So, I figured I was on to something. I dropped the baud back down to 9600 and upped the printing rate back to once every 5 ms:
Code:
#include "Arduino.h"
volatile uint32_t frameNum;
const uint32_t broadcastPeriod = 5000; // us
const uint32_t resetTime = 2000; // ms
const uint8_t interruptPin = 16;
elapsedMicros t;
volatile uint32_t tLastNewFrameMillis;
uint32_t eventCount = 0;
void newFrame() {
frameNum++;
tLastNewFrameMillis = millis();
}
void setup() {
//Serial.begin(115200);
Serial.begin(9600);
delay(1000);
Serial.println("Starting");
pinMode(interruptPin, INPUT);
frameNum = 0;
attachInterrupt(digitalPinToInterrupt(interruptPin), newFrame, RISING);
t = 0;
}
void loop() {
uint32_t localFrameNum, localFameMillis;
noInterrupts()
;
localFrameNum = frameNum;
localFameMillis = tLastNewFrameMillis;
interrupts()
;
if (t > broadcastPeriod) {
Serial.print("Frame Number: ");
Serial.print(localFrameNum);
Serial.print(", Event Count: ");
Serial.println(eventCount);
t = 0;
}
uint32_t currentTime = millis();
if (currentTime - localFameMillis > resetTime) {
Serial.print("Event Detected, Frame Number: ");
Serial.print(localFrameNum);
Serial.print(", tLastNewFrameMillis: ");
Serial.print(localFameMillis);
Serial.print(", currentTime: ");
Serial.println(currentTime);
frameNum = 0;
eventCount++;
}
}
Ran this configuration for more than 45 minutes without issue:
Code:
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57701, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57702, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57703, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57704, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57705, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
Frame Number: 57706, Event Count: 0
I don't know if the critical section for accessing the volatile variables is necessary. But, as far as I can tell, there is no evidence of this alleged mysterious interaction:

Originally Posted by
cermak
From this, I'm concluding that any calculation of the sort (millis() - tVar) where tVar can be assigned millis() in an interrupt is susceptible to be interrupted between evaluation of millis() and subtraction, and therefore may reasonably return -1