What im trying to do:
Define a precise timing output on some DUE pins, using direct port manipulation to drive some SK6182 RGBW 32 bit LEDs. I am trying to drive 10 strings in parallel.
Per SK6182 datasheet,
"1" is defined as 900ns high, 300ns low.
"0" is defined as 300ns high, 900ns low.
If I write the port values directly, all works fine.
For example, a "1" defined like this
#define NOP40 __asm__ __volatile__ ("nop\n\t"...40 times) #define NOP20 __asm__ __volatile__ ("nop\n\t"...20 times) ... REG_PIOC_ODSR = 0xFFFFFFFF; NOP20; //300ns high REG_PIOC_ODSR = 0xFFFFFFFF; NOP40; //600ns high REG_PIOC_ODSR = 0x00000000; NOP20;//300ns low
Above works ok, and im getting a clean 900ns high and 300ns low signal on DUE pin.
However, if I change above code to this
unsigned long m=0x0xFFFFFFFF; REG_PIOC_ODSR = 0xFFFFFFFF; NOP20; //300ns high REG_PIOC_ODSR = m; NOP40; //600ns high REG_PIOC_ODSR = 0x00000000; NOP20; //300ns low
The timing gets inaccurate, and high time jitters between 900~1100ns.
I disabled the interrupts using noInterrupts();
Any idea as why this happens and more important what is causing the 200ns jitter?
I do understand that MCU needs extra 1-2clocks (might be way off on this on this) to take the "m" variable and write it into the register, but I don't understand why the delay is not consistent.
Any suggestions appreciated. Thanks:)