Fix timings for solid output
This commit is contained in:
parent
295d98359d
commit
3cb7fc1a57
1 changed files with 7 additions and 11 deletions
|
@ -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;",
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue