I am running a trigger function in a while loop in setup that takes in 3 analog inputs, checks if they are within a certain range, then outputs true if they are, false if none of them are. The code I am running was originally written for an arduino mega 2560.
The code works by continuously analogReading to see if all inputs are out of range in a while loop (preBuffer) and if the preBuffer has been filled at least once, then if so reading continuosly to a storage array (buffer).
I am unsure why it seems that the preBuffer trigger function is being skipped.
//standard resolution is 10 bit 0-1023
//#include "avdweb_AnalogReadFast.h"
const long baudRate = 57600; //testing baud rate, up to at least 115200
const int bufferSize = 1000;
const int preBufferSize = 100;
unsigned int a0Pre[preBufferSize];
unsigned int a1Pre[preBufferSize];
unsigned int a2Pre[preBufferSize];
unsigned int a0Buffer[bufferSize];
unsigned int a1Buffer[bufferSize];
unsigned int a2Buffer[bufferSize];
bool inRange(unsigned int val, unsigned int target) {
const unsigned int trigger = 5;
return ((target - trigger) <= val) && ((target + trigger) >= val);
}
bool triggerFunction(unsigned int a0, unsigned int a1, unsigned int a2) {
return (inRange(a0, 517) || inRange(a1, 509) || inRange(a2, 515));
}
unsigned int read (int pin, int delay) {
delayMicroseconds(delay);
return analogRead(pin);
}
void rotate1 (unsigned int arr[], const int size) {
unsigned int target = 0;
unsigned int prev = arr[size-1];
for (int i = 0; i < preBufferSize; i++) {
target = prev;
prev = arr[i];
arr[i] = target;
}
}
void setup()
{
Serial.begin(baudRate);
while(!Serial);
// Record Data points and avg time between data points.
// Due to sequencing, a1buffer points are 1 meanread time after a0 buffer, and a2buffer points are 2 meanread time after a0 buffer.
analogReadResolution(10);
delay(3000);
Serial.println("Buffer Start");
//PreBuffer, with trigger logic
//dummy read
int j = 0;
bool notfull = true;
const int preReadDelay = 5;
const int readDelay = 5;
unsigned long preTime1 = 0;
unsigned long preTime2 = micros();
while (notfull || (triggerFunction(a0Pre[j-1],a1Pre[j-1],a2Pre[j-1]))) {
a0Pre[j] = read(A0, preReadDelay);
a1Pre[j] = read(A1, preReadDelay);
a2Pre[j] = read(A2, preReadDelay);
if (j == preBufferSize - 1) {
notfull = false;
preTime1 = preTime2;
preTime2 = micros();
}
j = (j + 1) % preBufferSize;
}
//Main buffer read
const unsigned long time1 = micros();
for (int i = 0; i < bufferSize; i++) {
a0Buffer[i] = read(A0, readDelay);
a1Buffer[i] = read(A1, readDelay);
a2Buffer[i] = read(A2, readDelay);
}
const unsigned long time2 = micros();
const float meanReadTime = (float)(time2 - time1) / (float)bufferSize;
const float meanReadPreTime = (float)(preTime2 - preTime1) / (float)preBufferSize;
delay(100);
// rotate buffer so that trigger is last value
for (int i = 0; i < (preBufferSize - j - 2) % preBufferSize ; i++) {
rotate1(a0Pre, preBufferSize);
rotate1(a1Pre, preBufferSize);
rotate1(a2Pre, preBufferSize);
}
//header values
Serial.print("preBufferSize,");
Serial.print("bufferSize,");
Serial.print("preReadFreq,");
Serial.println("readFreq");
Serial.print(preBufferSize);
Serial.print(",");
Serial.print(bufferSize);
Serial.print(",");
Serial.print((float)1E6 / meanReadPreTime);
Serial.print(",");
Serial.println((float)1E6 / meanReadTime);
Serial.println("Buffer End");
//column names
Serial.println("A0,A1,A2,micros");
for(int i = 0; i < preBufferSize; i ++) {
Serial.print(a0Pre[i]);
Serial.print(",");
Serial.print(a1Pre[i]);
Serial.print(",");
Serial.print(a2Pre[i]);
Serial.print(",");
Serial.println(meanReadPreTime*i);
}
for(int i = 0; i < bufferSize; i ++) {
Serial.print(a0Buffer[i]);
Serial.print(",");
Serial.print(a1Buffer[i]);
Serial.print(",");
Serial.print(a2Buffer[i]);
Serial.print(",");
Serial.println((meanReadTime*i) + (preBufferSize*meanReadPreTime));
}
}
void loop() {
delay(1000);
}
%
is supposed to behave consistently across architectures. If it doesn't, it's a bug. Could you show us a modulo operation that gives different outputs on AVR and ARM?