static const int maxSpeed = 10000000ULL; //10 MHz
static const int maxSpeedBeforeDelay = 392000000ULL; //max F_CPU_ACTUAL before doing delays (measured for 10MHz, -O2)
void shiftOut_msbFirst(uint8_t dataPin, uint8_t clockPin, uint8_t value)
{
uint32_t mask;
if (F_CPU_ACTUAL > maxSpeedBeforeDelay) {
uint32_t cycles = (F_CPU_ACTUAL / 3 / maxSpeed);
uint32_t t = ARM_DWT_CYCCNT;
for (mask = 0x80; mask; mask >>= 1) {
digitalWrite(dataPin, value & mask);
do {;} while(ARM_DWT_CYCCNT - t < cycles);
t += cycles;
digitalWrite(clockPin, HIGH);
do {;} while(ARM_DWT_CYCCNT - t < cycles);
t += cycles;
digitalWrite(clockPin, LOW);
do {;} while(ARM_DWT_CYCCNT - t < cycles);
t += cycles;
}
}
else
for (mask = 0x80; mask; mask >>= 1) {
digitalWrite(dataPin, value & mask);
digitalWrite(clockPin, HIGH);
digitalWrite(clockPin, LOW);
}
}
Teensyduino 1.49 supports Arduino versions 1.8.5 and 1.8.7 and 1.8.8 and 1.8.9 and 1.8.10 and 1.8.11.
Future versions of Teensyduino will drop support for Arduino 1.8.7 and 1.8.8 and 1.8.10
Is Arduino 1.8.11 well-known to being problematic on Raspberry Pi's and is everyone moving quickly away from it?
Yes, seems so. Arduino 1.8.11 uses AdoptOpenJDK Java, which causes trouble on some systems.
Arduino 1.8.12 was recently released, reverting back to Oracle Java. Please give 1.8.12 a try, using Teensyduino 1.51-beta1.
https://forum.pjrc.com/threads/59566-Teensyduino-1-51-Beta-1