v = struct.unpack(">h", s)
return v[0]/1024.0*6.6
+ # http://codepad.org/qtYpZmIF
+ def pwm(self, freq, duty_cycle_percent):
+ lPrescaler = {0:1, 1:8 , 2:64, 3:256}
+ Fosc = 32e6
+ Tcy = 2.0 / Fosc
+ period = 1.0 / freq
+ prescaler = 1
+
+ # find needed prescaler
+ for i in range(4):
+ prescaler = lPrescaler[i]
+ PRy = period * 1.0 / (Tcy * prescaler)
+ PRy = int(PRy - 1)
+ OCR = int(PRy * duty_cycle_percent)
+
+ if PRy < (2 ** 16 - 1):
+ break # valid value for PRy, keep values
+
+ cmd = struct.pack(">BBHH", 0b00010010, i, OCR, PRy)
+ ret = self.command(cmd, 1)
+ if ord(ret) != 0x1:
+ raise Exception()
+
def spi_command(self, cmd):
ret = self.command(cmd, 1)
if ord(ret) != 0x1:
raise Exception("Bad I/O pin")
state = self.update_io()
return state & (1 << dPinToBit[pin])
+
+ def mode_i2c(self, bEnablePower=False, bEnablePullup=False, iSpeedkHz=100):
+ if self.command(chr(0x2), 4) != "I2C1":
+ raise Exception()
+
+ dSpeeds = {
+ 5: 0x0,
+ 50: 0x1,
+ 100: 0x2,
+ 400: 0x3,
+ }
+ if iSpeedkHz not in dSpeeds.keys():
+ raise Exception("Invalid I2C speed")
+ ret = self.command(chr(0b01100000 | dSpeeds[iSpeedkHz]), 1)
+ if ord(ret) != 0x1:
+ raise Exception()
+
+ periphals = 0b01000000
+ if bEnablePower:
+ periphals |= (1<<3)
+ if bEnablePullup:
+ periphals |= (1<<2)
+ ret = self.command(chr(periphals), 1)
+ if ord(ret) != 0x1:
+ raise Exception()
+
+ def i2c_write(self, addr, reg, s):
+ # 1. Write
+ # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
+ msg = struct.pack(">BHHBB%ds" % len(s), 0x08, 2+len(s), 0, addr, reg, s)
+ ret = self.command(msg, 1)
+
+ if ord(ret[0]) != 0x1:
+ raise Exception("I2C write error")
+
+ def i2c_read(self, addr, reg, num_read):
+ # set reg
+ self.i2c_write(addr, reg, "")
+
+ # command (1) | number of write bytes (2) | number of read bytes (2) | bytes to write (0..)
+ msg = struct.pack(">BHHB", 0x08, 1, num_read, addr | 0x1)
+ ret = self.command(msg, 1 + num_read)
+
+ if ord(ret[0]) != 0x1:
+ raise Exception("I2C read error")
+
+ return ret[1:]
+
+ def i2c_search(self):
+ for i in range(128):
+ msg = struct.pack(">BHHB", 0x08, 1, 1, i)
+ ret = self.command(msg, 1)
+ if ord(ret) == 0x1:
+ print "Found I2C Addr: 0x%x" % (i & ~0x1)