The PineBlaster is a microcontroller-based pseudoclock, built on the Digilent
chipKIT Max32™ Prototyping Platform. It provides for programmable pulse
sequences. It supports up to 15000 instructions, pulse periods between 50ns
and 56 seconds, and up to 2 billion repetitions of a pulse in one instruction.

The code can be loaded onto a chipkit
max32 via the arduino-like MPIDE. The device is then programmable over a
serial connection.


Use MPIDE (available on the ChipKIT github or from to compile and upload the code
(pineblaster.pde) to the ChipKIT MAX32.

Tested on:
 * MPIDE 0022 - 2011.12.14.
 * MPIDE 0023 - 2012.09.03.
Newer versions of MPIDE are not supported (there may be updated code in a branch of the pineblaster bitbucket repository, but these will not necessarily maintain the same specifications as published in our paper)
One modification is required: compiler optimisations must be disabled. This is
required so that the compiler doesn't produce unpredictable code, or multiple
code paths for the same bit of source code. So we do this to ensure our code
is deterministic.

To disable compiler optimisations, edit
<MPIDE_folder>/hardware/pic32/platforms.txt and replace all instances of:
 * '-O3' with '-O0'
 * '-O2' with '-O0'
 * '-Os' with '-O0'

You must restart MPIDE after changing platforms.txt.

Remember to select the correct board (Tools->Board->ChipKIT MAX32) and serial port in the MPIDE software, before compiling and uploading the program.


The Pineblaster talks serial over USB, at 115200bps. Newlines should be a
carriage return and line feed ( CRLF, '\r\n').

Pin 5 is the output, pin 3 is the hardware trigger. Both are 3.3v TTL

Commands that can be sent over serial are:

Say hello to the pineblaster. It will say 'hello' back. Used to test

Get the pineblaster ready for a hardware triggered run. The pineblaster
will say 'ok' when it's ready, and then will start the run when the
input on pin 3 goes high. There is a delay on the order of a few hundred
nanoseconds, this should be measured and accounted for if important. When
the program is complete, the pineblaster will say 'done'.

Starts a run immediately without waiting for a hardware trigger. This
can also be triggered by sending a CRLF by itself (useful for mashing
enter repeatedly when testing something). When the program is complete,
the pineblaster will say 'done'.

While a run is in progress with either of the above two commands,
any serial communication will be interpreted as an abort request. The
pineblaster will reset, forgetting its program, and will not be responsive
for several seconds.

'set i j k':
Program in an instruction. i, j and k are integers. i is the number of
the instruction, from 0 to 14999.  j and k are 32 bit integers for the
half-period and number of reps respectively for the pulses that the
pineblaster should produce for this instruction. The half period is
measured in CPU clock cycles (12.5ns with the built-in clock, may be
different if using an external clock) and must be at least 4. There
are some special values: if both half-period and reps are zero,
this indicates a STOP instruction.  All programs must end with such
a STOP instruction. A half period of 0 and rep number of 1 indicates
a WAIT instruction. The program will pause and resume upon a hardware
trigger. There is a minimum wait duration of approx 1us before the device
is ready for a trigger, and a delay upon resumption of the same duration
as when hardware triggering a run to begin. If these are important they
should be measured and accounted for.

Example program:

set 0 4 3
set 1 0 1
set 2 10 1
set 3 0 0

This program first pulses three times with a half-period of 4 CPU cycles (instruction 0). 
Then it waits for a hardware trigger (instruction 1).
It then pulses once with a half period of 10 CPU cycles (instruction 2).
It then stops (instruction 3).

'go high'
Sets the output to digital high. It will go low prior to a run if 'start' or 'hwstart' are called.

'go low'
Sets the output to digital low.

Resets the device. It will be unresponsive for several seconds.