It's working! 
It turns out there were two problems. The first was a mistake with the circuitry - the 1K resistors for one of the half-bridges was bypassed when connected to the PIC. This meant that one pin was having to source too much current and destabalising the PIC. I imagine this is why the PICAXE was rather flakey.
The second was with the following code:
Code:
TRISA = %01100001
TRISB = 0
PORTA = 0
PORTB = 0
By setting the TRIS registers, all the pins defined as outputs are made high. I believe that in the few nanoseconds(!) between the registers being set and the ports being set to 0, the strain of setting everything high (and thus the motors sucking up all that current as you described) was causing the voltage to drop and the brownout detection to reset the PIC. It turns out that PICAXE's have brownout disabled, which is why the PICAXE worked but this PBP code wasn't working. Disabling brownout detection fixed everything 
Thank you so much
If it wasn't for your help (especially your mention of the brownout reset!) I don't think I would have ever got to a solution!
Bookmarks