The PIC microcontroller has a dead simple instruction set format. Each instruction is exactly 14 bits long, composed of a variety of numbers at differing bit lengths.
I am trying to build a function that can take all these inputs and build a number that represents that instruction.
This is what I have been trying to get working:
def fileRegOp(opcode, d, f):
out = opcode << 13
out = out | d << 7
out = out | f
return out
print "FIN:", bin(fileRegOp(1,True,15))
It outputs
FIN: 0b10000010001111
Which looks good, except the bits are the wrong way round. I think it should read:
FIN: 0b00000111111000
I've seen solutions on SO that involve loops to flip the bits around, but I'm sure there's a better way.
Whats the most elegant way to write this function?
More detail on the instruction set: Datasheet see page 121,122
解决方案
Your shifts are wrong.
You are shifting by the index of the top-most bit, which isn't right. You must shift by the index of the lowermost (rightmost) bit in each field.
So it should be:
def fileRegOp(opcode, d, f):
return (opcode << 8) | (d << 7) | f
This gives, with some editing to add padding zeros on the left:
>>> bin(fileRegOp(1,True,15))
'0b00000110001111'
Of course, it might be sensical to also limit-check the arguments.