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