diff --git a/adafruit_register/i2c_bit.py b/adafruit_register/i2c_bit.py index 581be5d..92a327c 100644 --- a/adafruit_register/i2c_bit.py +++ b/adafruit_register/i2c_bit.py @@ -43,10 +43,10 @@ class RWBit: :param int register_width: The number of bytes in the register. Defaults to 1. """ def __init__(self, register_address, bit, register_width=1): - self.bit_mask = 1 << bit + self.bit_mask = 1 << (bit%8) # the bitmask *within* the byte! self.buffer = bytearray(1 + register_width) self.buffer[0] = register_address - self.byte = bit // 8 + 1 + self.byte = bit // 8 + 1 # the byte number within the buffer def __get__(self, obj, objtype=None): with obj.i2c_device as i2c: diff --git a/adafruit_register/i2c_bits.py b/adafruit_register/i2c_bits.py index 5afecd4..e67ac0a 100644 --- a/adafruit_register/i2c_bits.py +++ b/adafruit_register/i2c_bits.py @@ -48,12 +48,13 @@ def __init__(self, num_bits, register_address, lowest_bit, register_width=1): self.bit_mask = 0 for _ in range(num_bits): self.bit_mask = (self.bit_mask << 1) + 1 - self.bit_mask = self.bit_mask << lowest_bit - if self.bit_mask >= (1 << 8): - raise ValueError() + self.bit_mask = self.bit_mask << (lowest_bit%8) + if self.bit_mask >= 0xFF: + raise ValueError("Cannot have more bits than fit in a single byte") + self.buffer = bytearray(1 + register_width) self.buffer[0] = register_address - self.lowest_bit = lowest_bit + self.lowest_bit = lowest_bit % 8 # lowest bit within byte self.byte = lowest_bit // 8 + 1 def __get__(self, obj, objtype=None):