private I2cDeviceRegister OLAT;         //Pin latches register
        
        /// <summary>
        /// Creates a mcp23008 port expander
        /// </summary>
        /// <param name="slaveAddress">i2c address of the chip.</param>
        /// <returns></returns>
        public async static Task<Mcp230xx> CreateMcp23008(int slaveAddress, int interruptPin = -1)
        {
            var device = await GetDevice(slaveAddress);
            var iPin = interruptPin == -1 ? null : GenericGpioController.GetDefault().OpenPin(interruptPin);

            var expander = new Mcp230xx(device, 0x00, 0x01, iPin);
            expander.InterruptActiveValue = GpioPinValue.High;
            return expander;
        }
        /// <summary>
        /// Creates a new mcp23017 port expander
        /// </summary>
        /// <param name="slaveAddress">i2c address of the chip.</param>
        /// <returns></returns>
        public async static Task<Mcp230xx[]> CreateMcp23017(int slaveAddress, int interruptPin = -1)
        {
            var registerAddresses = new byte[] { 0x00, 0x01 };
            var expanders = new Mcp230xx[2];
            var device = await GetDevice(slaveAddress);
            var iPin = interruptPin == -1 ? null : GenericGpioController.GetDefault().OpenPin(interruptPin);

            for (var i = 0; i < registerAddresses.Length; i++)
            {
                var expander = new Mcp230xx(device, registerAddresses[i], 0x02, iPin); 
                expander.InterruptMirrorEnabled = true;
                expander.InterruptActiveValue = GpioPinValue.Low;
                expanders[i] = expander;
            }

            return expanders;
        }