Well for reference this works. Its fairly easy to modify the code to use a variables for the value for the pulse width which should be 0 - 4095
Code:i2cControl var BYTE i2cAddress var BYTE pcaAddress var BYTE pcaAddress = $40 i2cAddress = pcaAddress << 1 ;Reset ;PCA9685_MODE1 0x0 i2cControl = 0 I2CWRITE SDApin,SCLpin,i2cAddress,i2cControl,[0] ;Set PWM to 500Hz ;Prescaler = 11 ;Calculate prescaler by: ;floor((((25000000/4096)/requiredFreqInHertz)-1)+0.5) ;For lack of float support or floor function the value can be calculated and then hard-coded ;Get old mode oldMode var BYTE ;PCA9685_MODE1 0x0 i2cControl = 0 I2CREAD SDApin,SCLpin,i2cAddress,i2cControl,[oldMode] newMode var BYTE ;MODE1 Sleep newMode = (oldMode & $7F) | $10 ;Set MODE1 Sleep ;PCA9685_MODE1 0x0 i2cControl = 0 I2CWRITE SDApin,SCLpin,i2cAddress,i2cControl,[newMode] ;Set Prescaler ;PCA9685_PRESCALE $FE ;Prescaler is 11 i2cControl = $FE I2CWRITE SDApin,SCLpin,i2cAddress,i2cControl,[11] ;Set old mode ;PCA9685_MODE1 0x0 i2cControl = 0 I2CWRITE SDApin,SCLpin,i2cAddress,i2cControl,[oldMode] Pause 5 ;Set MODE1 AutoIncrementOn ;PCA9685_MODE1 0x0 i2cControl = 0 I2CWRITE SDApin,SCLpin,i2cAddress,i2cControl,[oldMode | $A1] ;;Set a PWM channel ;; pcaChannel var BYTE pcaPwmValue var BYTE pcaChannel = 0 pcaPwmValue = 4095 ;LED0_ON_L 0x6 i2cControl = $6 + 4*pcaChannel I2CWRITE SDApin,SCLpin,i2cAddress,i2cControl,[0,0,pcaPwmValue,pcaPwmValue >> 8] pcaChannel = 1 pcaPwmValue = 1024 ;LED0_ON_L 0x6 i2cControl = $6 + 4*pcaChannel I2CWRITE SDApin,SCLpin,i2cAddress,i2cControl,[0,0,pcaPwmValue,pcaPwmValue >> 8]




Bookmarks