Fix timings for solid output

This commit is contained in:
Tangent Wantwight 2021-07-05 01:22:59 -04:00
parent 295d98359d
commit 3cb7fc1a57

View file

@ -39,19 +39,13 @@ pub fn boot() -> NeopixelLights<
} }
} }
// WS2815 lighting times // WS2815 ideal lighting times
// approx. 20ns per clock cycle; // approx. 20ns per clock cycle;
// const ZERO_HIGH_CYCLES: u32 = 11; // about 220ns // const ZERO_HIGH_CYCLES: u32 = 11; // about 220ns
// const ONE_HIGH_CYCLES: u32 = 29; // about 580ns // const ONE_HIGH_CYCLES: u32 = 29; // about 580ns
// const ZERO_LOW_CYCLES: u32 = 29; // about 580ns // const ZERO_LOW_CYCLES: u32 = 29; // about 580ns
// const ONE_LOW_CYCLES: u32 = 11; // about 220ns // const ONE_LOW_CYCLES: u32 = 11; // about 220ns
// experimentally, there is some unknown overhead
// but these timings appear to work for me:
const ZERO_HIGH_CYCLES: u32 = 2;
const ONE_HIGH_CYCLES: u32 = 9;
const ZERO_LOW_CYCLES: u32 = 10;
const ONE_LOW_CYCLES: u32 = 10;
const LATCH_CYCLES: u32 = 15000; // about 300us const LATCH_CYCLES: u32 = 15000; // about 300us
pub struct NeopixelLights<T: OutputPin, U: OutputPin, V: OutputPin> { pub struct NeopixelLights<T: OutputPin, U: OutputPin, V: OutputPin> {
@ -72,11 +66,13 @@ where
// go high // go high
self.high_out.set_high().unwrap(); self.high_out.set_high().unwrap();
// experimentally, there is some unknown overhead
// but these timings appear to work for me
unsafe { unsafe {
compiler_fence(Ordering::SeqCst); compiler_fence(Ordering::SeqCst);
asm!( asm!(
// ? nops // 8 nops
"nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;",
); );
compiler_fence(Ordering::SeqCst); compiler_fence(Ordering::SeqCst);
} }
@ -85,7 +81,7 @@ where
unsafe { unsafe {
compiler_fence(Ordering::SeqCst); compiler_fence(Ordering::SeqCst);
asm!( asm!(
// 7 nops // 14 nops
"nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;",
"nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;",
); );
@ -99,7 +95,7 @@ where
unsafe { unsafe {
compiler_fence(Ordering::SeqCst); compiler_fence(Ordering::SeqCst);
asm!( asm!(
// 2 nops // 15 nops
"nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;",
"nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;", "nop;",
); );