Simple comms, PIC to Pi. Comms must be based on a full 'request / acknowledge' handshake approach because the Pi end will be using s/w to 'fetch' the bits and that means variable bit-timing. One good thing about Req/Ack is that the number of Data i/o lines (width) can be whatever we like, although (rto keep i/o pin count down) we normally use a sigle bit for serial transmission. As with all serial Tx, LSB is sent first. Note that the PIC /ack and Data drive i/o pins MUST be 'open collector' with EXTERNAL pull-up resistors to 3v3 (the Pi GPIO uses 3v3 and the typical PIC 5v). loop: PIC Pi wait for /req lo idle (req hi) pull /req lo, wait for /ack lo set data bit pull /ack lo sample data bit wait for req hi release req hi, wait for ack hi release data, release ack hi loop loop Above 'works' so long as the Pi 'knows in advance' what data length to expect (eg. 10 bits DAC o/p from PIC) and so long as neither end gets 'out of step'. 'Synchronisation' can be supported by using the Data line 'outside the handshake' as a 'ready to send first bit' flag. This means the PIC sets data lo when it's ready with bit 0, and the Pi checks the data bit each time after finding ack Hi (and before pulling /req lo). If the Pi gets 'out of step' then the data bit will be found unexpectedly Lo. idle: PIC Pi idle (req hi) wait for PIC power-on (Data Lo) if ready with bit0, pull Data Lo, else leave Data Hi Data Lo found, start the fetch count loop: wait for /req lo pull /req lo, wait for /ack lo set data bit pull /ack lo wait for req hi sample data bit release req hi, wait for ack hi if end of Data set Data Lo, else set Data Hi release ack hi loop sample Data = if Hi, continue fetch count, loop if Lo, end count (error if incomplete), idle The above should be 'fool proof'. If the PIC is powered off, the 3v3 pull-up resistor on Data will ensure the Pi sees it as hi. If the Pi finds Data unexpectedly Lo, it can drop the bits recieved so far and start the count again. Uisng additional i/o pins as 'select' bits it's even possible for the Pi to 'talk' to multiple PIC's using the same 3 wires (one additional i/o will be needed per PIC). If 'select' is used, the PIC will need to assign 4 pins, however even the 14pin 16F684 should have sufficient pins (especially if the internal OSC is used).