Find a timing that works with WS2815
This commit is contained in:
parent
5821dbffb5
commit
2aab355fff
2 changed files with 41 additions and 9 deletions
26
hello_gradient/src/bin/blazing.rs
Normal file
26
hello_gradient/src/bin/blazing.rs
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
#![no_std]
|
||||||
|
#![no_main]
|
||||||
|
|
||||||
|
use core::iter::repeat;
|
||||||
|
use lights::{
|
||||||
|
gamma::GammaCorrector,
|
||||||
|
PixelIterator,
|
||||||
|
rgb::{
|
||||||
|
gray
|
||||||
|
}
|
||||||
|
};
|
||||||
|
use lights_hal::{boot, delay, entry};
|
||||||
|
|
||||||
|
#[entry]
|
||||||
|
fn main() -> ! {
|
||||||
|
let mut lights = GammaCorrector(boot());
|
||||||
|
|
||||||
|
let mut pattern = repeat(gray(0)).take(15).chain(repeat(gray(255)).take(15)).cycle();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
pattern.clone().take(125).render_to(&mut lights);
|
||||||
|
|
||||||
|
pattern.next();
|
||||||
|
delay(1_000_000);
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,27 +31,33 @@ pub fn boot() -> impl Lights<Pixel = HardwareRgb> {
|
||||||
let mut pins = hal::Pins::new(peripherals.PORT);
|
let mut pins = hal::Pins::new(peripherals.PORT);
|
||||||
|
|
||||||
NeopixelLights {
|
NeopixelLights {
|
||||||
out: pins.d7.into_push_pull_output(&mut pins.port)
|
out: pins.d7.into_push_pull_output(&mut pins.port),
|
||||||
|
high_out: pins.d5.into_push_pull_output(&mut pins.port),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WS2815 lighting times
|
||||||
// approx. 20ns per clock cycle;
|
// approx. 20ns per clock cycle;
|
||||||
const ZERO_HIGH_CYCLES: u32 = 11; // smidge above 200ns
|
const ZERO_HIGH_CYCLES: u32 = 8; // about 160ns
|
||||||
|
const ZERO_LOW_CYCLES: u32 = 42; // about 840ns
|
||||||
const ONE_HIGH_CYCLES: u32 = 35; // about 700ns
|
const ONE_HIGH_CYCLES: u32 = 35; // about 700ns
|
||||||
const DATA_LOW_CYCLES: u32 = 25; // about 500ns
|
const ONE_LOW_CYCLES: u32 = 15; // about 300ns
|
||||||
const LATCH_CYCLES: u32 = 300; // about 6000ns
|
const LATCH_CYCLES: u32 = 15000; // about 300us
|
||||||
|
|
||||||
pub struct NeopixelLights<T: OutputPin> {
|
pub struct NeopixelLights<T: OutputPin, U: OutputPin> {
|
||||||
out: T
|
out: T,
|
||||||
|
high_out: U
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: OutputPin> NeopixelLights<T> {
|
impl<T: OutputPin, U: OutputPin> NeopixelLights<T, U> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn write(&mut self, bit: bool) {
|
fn write(&mut self, bit: bool) {
|
||||||
self.out.set_high();
|
self.out.set_high();
|
||||||
|
self.high_out.set_high();
|
||||||
delay(if bit { ONE_HIGH_CYCLES } else { ZERO_HIGH_CYCLES });
|
delay(if bit { ONE_HIGH_CYCLES } else { ZERO_HIGH_CYCLES });
|
||||||
self.out.set_low();
|
self.out.set_low();
|
||||||
delay(DATA_LOW_CYCLES);
|
self.high_out.set_low();
|
||||||
|
delay(if bit { ONE_LOW_CYCLES } else { ZERO_LOW_CYCLES });
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -67,7 +73,7 @@ impl<T: OutputPin> NeopixelLights<T> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<T: OutputPin> Lights for NeopixelLights<T> {
|
impl<T: OutputPin, U: OutputPin> Lights for NeopixelLights<T, U> {
|
||||||
type Pixel = HardwareRgb;
|
type Pixel = HardwareRgb;
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
|
Loading…
Reference in a new issue