diff --git a/developpment/drivers/pca9685/pca9685.cpp b/developpment/drivers/pca9685/pca9685.cpp index 2952390..b0c169d 100644 --- a/developpment/drivers/pca9685/pca9685.cpp +++ b/developpment/drivers/pca9685/pca9685.cpp @@ -7,7 +7,7 @@ Pca9685::Pca9685(i2c_ch1_pImpL* i2c, ErrorHandler* err) errorHandling = err; m_isExternalClock = 0; m_oscillatorFreq = PCA9685_FREQUENCY_OSCILLATOR; - setPwmFreq(200); + setPwmFreq(48); m_currentLED = PCA9685_LED_PWM_REG_START; errorHandling->addNewError(-1,__FILE__,"Selected duty cycle is too big",KILL); @@ -16,10 +16,13 @@ Pca9685::Pca9685(i2c_ch1_pImpL* i2c, ErrorHandler* err) errorHandling->addNewError(-4,__FILE__,"Selected PWM frequency is too slow",SPARE); errorHandling->addNewError(-5,__FILE__,"Oscillator frequency can't be 0 or inferior to 0",KILL); errorHandling->addNewError(-6,__FILE__,"Oscillator frequency cant't be higher than 50 MHz",KILL); - + errorHandling->addNewError(-7,__FILE__,"On Duty Cyle if greater than alowed maximum of 4095",SPARE); + errorHandling->addNewError(-8,__FILE__,"Off Duty Cyle if greater than alowed maximum of 4095",SPARE); + errorHandling->addNewError(-9,__FILE__,"Cumulation of the On & Off Duty Cyle if greater than alowed maximum of 4095",SPARE); + errorHandling->addNewError(-10,__FILE__,"On & Off Duty Cyle can't be equal to each other",SPARE); } -/*Refere to datasheet page 52 +/*Refere to datasheet page 25 * * * osc_clock @@ -47,7 +50,7 @@ void Pca9685::setPwmFreq(uint16_t frequency) } m_currentPrescale = (m_oscillatorFreq / ( 4096 * frequency) ) -1; - + std::cout << "Prescaler is set to: " << unsigned(m_currentPrescale) << std::endl; sleep(); i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, PCA9685_REG_PRESCALE, m_currentPrescale); wakeup(); @@ -61,20 +64,48 @@ void Pca9685::setDutyPercent(uint8_t ledNo, uint8_t on, uint8_t off) { } -void Pca9685::setDutyRaw(uint8_t ledNo, uint8_t on, uint8_t off) +void Pca9685::setDutyRaw(uint8_t ledNo, uint16_t on, uint16_t off) { m_currentLED = PCA9685_LED_PWM_REG_START + (ledNo * PCA9685_LED_NEXT_OFFSET); + + if(on > 4095) + { + on = 4095; + off = 0; + errorHandling->handleError(-7,__FILE__); + } + + if(off > 4095) + { + off = 4095; + on = 0; + errorHandling->handleError(-8,__FILE__); + } - std::cout << "Led" < 4095) + { + off = 4095; + on = 0; + errorHandling->handleError(-9,__FILE__); + } + if(on == off) + { + off = 4095; + on = 0; + errorHandling->handleError(-10,__FILE__); + } + i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, m_currentLED, on & 0xFF); + i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, m_currentLED + PCA9685_PWM_ON_H_OFFSET, on >> 8); + i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, m_currentLED + PCA9685_PWM_OFF_L_OFFSET, off & 0xFF); + i2c_pca9685->writeWord(PCA9685_I2C_ADDRESS, m_currentLED + PCA9685_PWM_OFF_H_OFFSET, off >> 8); } + void Pca9685::setDutyMicroSecond(uint8_t ledNo, uint16_t on, uint16_t off) { } + void Pca9685::setOnOff(uint8_t ledNo, bool onOff, bool invert) { diff --git a/developpment/drivers/pca9685/pca9685.h b/developpment/drivers/pca9685/pca9685.h index 3ad7629..567c69d 100644 --- a/developpment/drivers/pca9685/pca9685.h +++ b/developpment/drivers/pca9685/pca9685.h @@ -60,7 +60,7 @@ class Pca9685 void setPwmFreq(uint16_t frequency); void setPwmMicroSeconds(uint16_t microSeconds); void setDutyPercent(uint8_t ledNo, uint8_t on, uint8_t off); - void setDutyRaw(uint8_t ledNo, uint8_t on, uint8_t off); + void setDutyRaw(uint8_t ledNo, uint16_t on, uint16_t off); void setDutyMicroSecond(uint8_t ledNo, uint16_t on, uint16_t off); void setOnOff(uint8_t ledNo, bool onOff, bool invert); void confClk(bool internExtern, uint32_t freq); diff --git a/developpment/drivers/pca9685/pca9685.o b/developpment/drivers/pca9685/pca9685.o index 1d2a388..d15926e 100644 Binary files a/developpment/drivers/pca9685/pca9685.o and b/developpment/drivers/pca9685/pca9685.o differ diff --git a/developpment/interfacer.cpp b/developpment/interfacer.cpp index 7b6f324..6da26f3 100644 --- a/developpment/interfacer.cpp +++ b/developpment/interfacer.cpp @@ -55,10 +55,9 @@ int main(int argc, char *argv[]) std::cout << "Main" << std::endl; // errorHandle.addNewError(-34,__FILE__,"Test eroor 2",KILL); // errorHandle.handleError(-34,__FILE__); - pwmGenarator.setDutyRaw(1,200,200); + pwmGenarator.setDutyRaw(0,0,atoi(argv[2])); commander.addNewCommand("i2c", "The test command for testing the test", dummy); commander(argv[1]); - return 1; } diff --git a/developpment/interfacer.o b/developpment/interfacer.o index 43ca89d..630f262 100644 Binary files a/developpment/interfacer.o and b/developpment/interfacer.o differ diff --git a/developpment/runtest b/developpment/runtest index 166ad9f..188f497 100755 Binary files a/developpment/runtest and b/developpment/runtest differ