diff --git a/examples/hist.rs b/examples/hist.rs
new file mode 100644
index 0000000000000000000000000000000000000000..f0e753ff00a9ce4888f4249e57c7696473e1a586
--- /dev/null
+++ b/examples/hist.rs
@@ -0,0 +1,132 @@
+//! Prints raw samples from the capacitor random number generator.
+//! These would not usually be used directly, instead use `CapRng`.
+//! Raw samples are useful to analyse the entropy.
+
+#![no_std]
+#![no_main]
+#![feature(type_alias_impl_trait)]
+
+#[cfg(not(feature = "defmt"))]
+use log::{debug, info, warn, error};
+
+#[cfg(feature = "defmt")]
+use defmt::{debug, info, warn, panic, error};
+#[cfg(feature = "defmt")]
+use {defmt_rtt as _, panic_probe as _};
+
+use embassy_rp::gpio::{Flex, AnyPin, Pin};
+use embassy_rp::Peripheral;
+use embassy_executor::Spawner;
+
+#[embassy_executor::main]
+async fn main(_spawner: Spawner) {
+    let p = embassy_rp::init(Default::default());
+    let mut cp = cortex_m::peripheral::Peripherals::take().unwrap();
+
+    // 0.1uF
+    // let mut gpio = (Flex::new(p.PIN_6), 6);
+    // 0.01uF ?
+    // let mut gpio = (Flex::new(p.PIN_10), 10);
+    // nothing
+    // let mut gpio = Flex::new(p.PIN_22);
+    // nothing, adc pin
+    // let mut gpio = (Flex::new(p.PIN_28), 28);
+
+    // let mut gpio = (Flex::new(p.PIN_15), 15);
+
+    // // wifi sd_clk, or led for non-w
+    // let mut gpio = (Flex::new(p.PIN_29), 29);
+    // // check wifi is off.
+    // let mut gpio23 = Flex::new(p.PIN_23);
+    // assert!(gpio23.is_low());
+    // // wifi cs high
+    // let mut gpio25 = Flex::new(p.PIN_25);
+    // gpio25.set_low();
+    // gpio25.set_as_output();
+
+    // let mut gpio = Flex::new(p.PIN_15);
+    // let mut gpio = Flex::new(p.PIN_20);
+    // let mut gpio = p.PIN_20.into();
+
+    let mut hist = [0u32; 200];
+
+    let PRINT = 1000;
+    // let PRINT = 50;
+
+    // let mut gpios = [
+    //     p.PIN_22.degrade().into_ref(),
+    //     p.PIN_6.degrade().into_ref(),
+    //     p.PIN_10.degrade().into_ref(),
+    //     p.PIN_13.degrade().into_ref(),
+    //     // p.PIN_23.degrade().into_ref(),
+    //     // p.PIN_24.degrade().into_ref(),
+    //     p.PIN_25.degrade().into_ref(),
+    // ];
+
+    let mut gpios = [
+        // serial
+        // p.PIN_0.degrade().into_ref(),
+        // p.PIN_1.degrade().into_ref(),
+
+        p.PIN_2.degrade().into_ref(),
+        p.PIN_3.degrade().into_ref(),
+        p.PIN_4.degrade().into_ref(),
+        p.PIN_5.degrade().into_ref(),
+        p.PIN_6.degrade().into_ref(),
+        p.PIN_7.degrade().into_ref(),
+        p.PIN_8.degrade().into_ref(),
+        p.PIN_9.degrade().into_ref(),
+        p.PIN_10.degrade().into_ref(),
+        p.PIN_11.degrade().into_ref(),
+        p.PIN_12.degrade().into_ref(),
+        p.PIN_13.degrade().into_ref(),
+        p.PIN_14.degrade().into_ref(),
+        p.PIN_15.degrade().into_ref(),
+        p.PIN_16.degrade().into_ref(),
+        p.PIN_17.degrade().into_ref(),
+        p.PIN_18.degrade().into_ref(),
+        p.PIN_19.degrade().into_ref(),
+        p.PIN_20.degrade().into_ref(),
+        p.PIN_21.degrade().into_ref(),
+        p.PIN_22.degrade().into_ref(),
+        // wl_on
+        // p.PIN_23.degrade().into_ref(),
+        // p.PIN_24.degrade().into_ref(),
+        // wl_cs, gate of vsys adc mosfet
+        p.PIN_25.degrade().into_ref(),
+        p.PIN_26.degrade().into_ref(),
+        p.PIN_27.degrade().into_ref(),
+        p.PIN_28.degrade().into_ref(),
+        // p.PIN_29.degrade().into_ref(),
+    ];
+    // let mut gpios = [
+    //     p.PIN_22.degrade().into_ref(),
+    // ];
+
+    for gpio in gpios.iter_mut() {
+        for low_delay in 0..1 {
+            let pin = gpio.pin();
+            let mut n = 0;
+            caprand::noise(gpio.reborrow(), low_delay,
+                &mut cp.SYST,
+                |v, overshoot| {
+                    // info!("{}", v);
+
+                    let vu = v as usize;
+                    hist[vu.min(hist.len()-1)] += 1;
+                    n += 1;
+                    if n % PRINT == 0 {
+                        info!("gpio {} delay {} iter {}", pin, low_delay, n);
+                        for (p, h) in hist.iter_mut().enumerate() {
+                            if *h > 0 {
+                                info!("{}: {}", p, h);
+                                *h = 0;
+                            }
+                        }
+                    }
+                    n < PRINT
+            }).unwrap();
+        }
+    }
+    cortex_m::asm::bkpt()
+}
diff --git a/examples/noise.rs b/examples/noise.rs
index 1dca3b7b16c696c91b07153a4da148723d5ad03c..09075cd137350ed8f08f3640360346f09a064aed 100644
--- a/examples/noise.rs
+++ b/examples/noise.rs
@@ -50,7 +50,7 @@ async fn main(_spawner: Spawner) {
 
     let mut hist = [0u32; 200];
 
-    let PRINT = 10000;
+    let PRINT = 20000;
     // let PRINT = 50;
 
     // let mut gpios = [
@@ -76,29 +76,30 @@ async fn main(_spawner: Spawner) {
         // p.PIN_7.degrade().into_ref(),
         // p.PIN_8.degrade().into_ref(),
         // p.PIN_9.degrade().into_ref(),
-        p.PIN_10.degrade().into_ref(),
+        // p.PIN_10.degrade().into_ref(),
         // p.PIN_11.degrade().into_ref(),
         // p.PIN_12.degrade().into_ref(),
-        p.PIN_13.degrade().into_ref(),
-        p.PIN_14.degrade().into_ref(),
-        p.PIN_15.degrade().into_ref(),
+        // p.PIN_13.degrade().into_ref(),
+        // p.PIN_14.degrade().into_ref(),
+        // p.PIN_15.degrade().into_ref(),
         p.PIN_16.degrade().into_ref(),
-        p.PIN_17.degrade().into_ref(),
-        p.PIN_18.degrade().into_ref(),
-        p.PIN_19.degrade().into_ref(),
-        p.PIN_20.degrade().into_ref(),
-        p.PIN_21.degrade().into_ref(),
+        // p.PIN_17.degrade().into_ref(),
+        // p.PIN_18.degrade().into_ref(),
+        // p.PIN_19.degrade().into_ref(),
+        // p.PIN_20.degrade().into_ref(),
+        // p.PIN_21.degrade().into_ref(),
         p.PIN_22.degrade().into_ref(),
         // p.PIN_23.degrade().into_ref(),
         // p.PIN_24.degrade().into_ref(),
         // wl_cs, gate of vsys adc mosfet
-        p.PIN_25.degrade().into_ref(),
+        // p.PIN_25.degrade().into_ref(),
         // p.PIN_26.degrade().into_ref(),
         // p.PIN_27.degrade().into_ref(),
         // p.PIN_28.degrade().into_ref(),
         // p.PIN_29.degrade().into_ref(),
     ];
 
+    info!("gpio,delay,time,n");
     for gpio in gpios.iter_mut() {
         for low_delay in 0..1{
             let pin = gpio.pin();
@@ -106,22 +107,11 @@ async fn main(_spawner: Spawner) {
             caprand::noise(gpio.reborrow(), low_delay,
                 &mut cp.SYST,
                 |v, overshoot| {
-                    // info!("{}", v);
-
-                    let vu = v as usize;
-                    hist[vu.min(hist.len()-1)] += 1;
+                    info!("{},{},{},{}", pin, low_delay, v, n);
                     n += 1;
-                    if n % PRINT == 0 {
-                        info!("gpio {} delay {} iter {}", pin, low_delay, n);
-                        for (p, h) in hist.iter_mut().enumerate() {
-                            if *h > 0 {
-                                info!("{}: {}", p, h);
-                                *h = 0;
-                            }
-                        }
-                    }
                     n < PRINT
             }).unwrap();
         }
     }
+    cortex_m::asm::bkpt()
 }
diff --git a/src/cap.rs b/src/cap.rs
index feb736e4e9beb5df0589904e084eefc8df3e2ec5..9b01e32ee4cfc832113de577c556b89cbc5833ae 100644
--- a/src/cap.rs
+++ b/src/cap.rs
@@ -1,8 +1,8 @@
 #[cfg(not(feature = "defmt"))]
-use log::{debug, info, warn, error};
+use log::{debug, info, warn, error, trace};
 
 #[cfg(feature = "defmt")]
-use defmt::{error, debug, info, panic};
+use defmt::{error, debug, info, panic, trace};
 
 use core::arch::asm;
 
@@ -109,7 +109,7 @@ impl<'t> SyTi<'t> {
 }
 // Returns (ticks: u32, pos: u8)
 // `pos == 0` are less precise than other results
-fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Result<(u32, u8), ()> {
+fn time_rise(pin: PeripheralRef<AnyPin>, low_cycles: u32, syst: &mut SYST) -> Result<(u32, u8), ()> {
     let pin_num = pin.pin() as usize;
     let mask = 1u32 << pin_num;
 
@@ -132,11 +132,13 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
 
     let soe_set = soe.value_set().ptr();
     let soe_clr = soe.value_clr().ptr();
-    let mut t = SyTi::new(syst);
 
-    // actual low time is low_delay+1 cycles
-    match (low_delay, low_delay % 3) {
-        (0, _) => unsafe {
+    match (low_cycles, low_cycles % 3) {
+        (0, _) => {
+            panic!("Don't use this");
+            // no pull low
+        },
+        (1, _) => unsafe {
             asm!(
                 "str {mask}, [{soe_set}]",
                 // low for 1 cycle
@@ -146,9 +148,9 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
                 soe_set = in(reg) soe_set,
                 soe_clr = in(reg) soe_clr,
                 options(nostack, readonly),
-                )
+                );
         },
-        (1, _) => unsafe {
+        (2, _) => unsafe {
             asm!(
                 "str {mask}, [{soe_set}]",
                 // low for 2 cycles
@@ -159,12 +161,10 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
                 soe_set = in(reg) soe_set,
                 soe_clr = in(reg) soe_clr,
                 options(nostack, readonly),
-                )
+                );
         },
-        (_, 2) => unsafe {
-            // min delay of 2
-            let mut d = low_delay + 1;
-            assert!(d % 3 == 0);
+        (_, 0) => unsafe {
+            // min low time of 3
             asm!(
                 "str {mask}, [{soe_set}]",
                 "000:",
@@ -178,15 +178,12 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
                 mask = in(reg) mask,
                 soe_set = in(reg) soe_set,
                 soe_clr = in(reg) soe_clr,
-                d = inout(reg) d,
+                d = in(reg) low_cycles,
                 options(nostack, readonly),
                 );
-            assert_eq!(d, 0);
         },
-        (_, 0) => unsafe {
-            // min delay of 3
-            let mut d = low_delay + 1;
-            assert!(d % 3 == 1);
+        (_, 1) => unsafe {
+            // min low time of 4
             asm!(
                 "str {mask}, [{soe_set}]",
                 // one cycle
@@ -202,15 +199,12 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
                 mask = in(reg) mask,
                 soe_set = in(reg) soe_set,
                 soe_clr = in(reg) soe_clr,
-                d = inout(reg) d,
+                d = in(reg) low_cycles,
                 options(nostack, readonly),
                 );
-            assert_eq!(d, 0);
         },
-        (_, 1) => unsafe {
-            // min delay of 4
-            let mut d = low_delay + 1;
-            assert!(d % 3 == 2);
+        (_, 2) => unsafe {
+            // min low time of 5
             asm!(
                 "str {mask}, [{soe_set}]",
                 // one cycle
@@ -228,16 +222,15 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
                 mask = in(reg) mask,
                 soe_set = in(reg) soe_set,
                 soe_clr = in(reg) soe_clr,
-                d = inout(reg) d,
+                d = in(reg) low_cycles,
                 options(nostack, readonly),
                 );
-            assert_eq!(d, 0);
         },
         // `match` doesn't understand modulo
         _ => unreachable!()
     }
 
-    t.reset();
+    let mut t = SyTi::new(syst);
     // unsafe {
     //     soe.value_set().write_value(1 << pin_num);
     // }
@@ -306,30 +299,37 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
 
     let tick = t.done()?;
 
-    let pos = if x0 & mask != 0 {
-        0
-    } else if x1 & mask != 0 {
-        1
-    } else if x2 & mask != 0 {
-        2
-    } else if x3 & mask != 0 {
-        3
-    } else if x4 & mask != 0 {
-        4
-    } else if x5 & mask != 0 {
-        5
-    } else {
-        6
-    };
-    let tick = tick + pos;
-    // first measurement is less precise.
-    let precise = pos != 0;
+    let result = (x0 & mask) << 0
+        | (x1 & mask) << 1
+        | (x2 & mask) << 2
+        | (x3 & mask) << 3
+        | (x4 & mask) << 4
+        | (x5 & mask) << 5;
+
+    // let pos = if x0 & mask != 0 {
+    //     0
+    // } else if x1 & mask != 0 {
+    //     1
+    // } else if x2 & mask != 0 {
+    //     2
+    // } else if x3 & mask != 0 {
+    //     3
+    // } else if x4 & mask != 0 {
+    //     4
+    // } else if x5 & mask != 0 {
+    //     5
+    // } else {
+    //     6
+    // };
+    // let tick = tick + pos;
+    // // first measurement is less precise.
+    // let precise = pos != 0;
 
     unsafe {
+        // Turn off pullup when not used
         pac::PADS_BANK0
             .gpio(pin_num)
             .modify(|s| {
-                // No pullup
                 s.set_pue(false);
             });
     };
@@ -340,7 +340,7 @@ fn time_rise(pin: PeripheralRef<AnyPin>, low_delay: u32, syst: &mut SYST) -> Res
 // `f()` is called on each output `u32`.
 pub fn noise<'d, F>(
     mut pin: PeripheralRef<AnyPin>,
-    low_delay: u32,
+    low_cycles: u32,
     syst: &mut SYST,
     mut f: F,
 ) -> Result<(), ()>
@@ -421,22 +421,8 @@ where
     for (i, _) in core::iter::repeat(()).enumerate() {
 
         let (meas, precise) = critical_section::with(|_cs| {
-            // pin.set_pull(Pull::Down);
-            // // let t = SyTi::new(syst);
-            // while pin.is_high() {}
-            // // let ticks = t.done()?;
-            // // Keep pulling down for `overshoot` cycles
-            // cortex_m::asm::delay(overshoot);
-
-            // // Pull up, time how long to reach threshold
-            // pin.set_pull(Pull::None);
-            // debug!("pulldown {}", ticks);
-
-            // let t = SyTi::new(syst);
-            // while pin.is_high() {}
-            // let r = t.done().map(|t| (t, true));
-
-            let (r, pos) = time_rise(pin.reborrow(), 0, syst)?;
+
+            let (r, pos) = time_rise(pin.reborrow(), low_cycles, syst)?;
             let precise = pos == 0;
 
             // let mut gpio = Flex::<AnyPin>::new(pin.reborrow());