Beste mensen,
Voor een project heb ik een hele hoop PWM kanalen nodig. Ik vond op de site van NXP de PCA9635, een verdomd interessant chipje. 16 kanaals PWM op ruim 90kHz.
Besteld en een klein printje voor geetst..nu druk aan het proggen..
Maar helaas...ik doe iets fout en weet echt niet wat..
Aangezien er totaal geen applicationnotes over deze chip te vinden zijn en het forum van NXP zo dood als een pier is, probeer ik het maar hier..
Hier is het datasheet:
http://www.nxp.com/acrobat_download/datasheets/PCA9635_5.pdf
Ik verbind mijn LEDs vanuit de uitgang naar gnd. Moet kunnen volgens mij, gezien de totempole output.
Als ik de power aanzet springen de LEDs allemaal aan.
Klopt volgens het datasheet (default status).
Allereerst stel ik de nodige registers in (MODE1, LEDOUT0, LEDOUT1, LEDOUT2 en LEDOUT3).
Vervolgens stuur ik de PWM data voor de individuele uitgangen.
Helaas pindakaas, de uitgangen van het IC blijven gewoon hoog staan.
Heeft iemand ervaring met deze chip?
Verdere toelichting:
De I2C stuur ik vanuit een PIC18F452, met devolgende routines:
errorlevel -226 ;surpress warning 226
;-----------------------------------------------------------------------------------
Start_I2C MACRO ;macro to send startbit I2C transfer
bcf PIR1,SSPIF ;
bsf SSPCON2,SEN ;send Startbit
btfss PIR1,SSPIF ;
goto $-2 ;
bcf PIR1,SSPIF ;Start bit is done, ready for transfer
ENDM ;
;-----------------------------------------------------------------------------------
Stop_I2C MACRO ;macro to send stopbit I2C transfer
bcf PIR1,SSPIF ;
bsf SSPCON2,PEN ;send Stopbit
btfss PIR1,SSPIF ;
goto $-2 ;
bcf PIR1,SSPIF ;Stop bit is done, transfer is done
ENDM ;
;-----------------------------------------------------------------------------------
WaitForACK_I2C MACRO ;macro to wait for acknowledge-bit
btfss PIR1,SSPIF ;
goto $-2 ;
bcf PIR1,SSPIF ;Acknowledge has been received
ENDM ;
;-----------------------------------------------------------------------------------
Send_I2C MACRO ;macro to write to I2C peripherals
movwf SSPBUF ;
WaitForACK_I2C ;
ENDM ;
;-----------------------------------------------------------------------------------
Hmmm..ik hoop dat iemand me kan vertellen waar ik de fout in ga, of waar ik nog op moet letten..
Dank is groot!!
Op 21 september 2007 15:46:46 schreef DIY:
Beste mensen,
Voor een project heb ik een hele hoop PWM kanalen nodig.startbit I2C transfer bcf PIR1,SSPIF ; bsf SSPCON2,SEN ;send Startbit btfss PIR1,SSPIF ; goto $-2 ; bcf PIR1,SSPIF ;Start bit is done, ready for transfer ENDM ;
Is voor mij al een tijdje geleden dat ik wat met assembler en picjes met i2c gedaan heb, maar wat me opvalt is dat je geen banks selecteerd en die goto $-2 moet dat niet zijn goto $-1?
ik ben trouwens ook op zoek naar een manier om 16 kanalen te kunnen pwm maar dan ook met variabele frequentie (wel alle gelijk). Mijn idee was een i/o expander met spi interface en dan iedere ms bijvoorbeeld een nieuwe status te sturen.
Iemand andere ideeen?
Op 21 september 2007 16:30:35 schreef RedTiger:
Is voor mij al een tijdje geleden dat ik wat met assembler en picjes met i2c gedaan heb, maar wat me opvalt is dat je geen banks selecteerd en die goto $-2 moet dat niet zijn goto $-1?
In de 16F series wel ja, niet in de 18F. Simulatie heeft mij bewezen dat dit klopt.
Op 21 september 2007 16:38:15 schreef DIY:
[...]In de 16F series wel ja, niet in de 18F. Simulatie heeft mij bewezen dat dit klopt.
Kan je zeggen op welke pagina in de datasheet staat dat het initieren van een startbit een interrupt genereert?
Op 21 september 2007 16:46:46 schreef DIY:
pagina 150.
Als we het over deze datasheet hebben:
http://ww1.microchip.com/downloads/en/devicedoc/39564b.pdf
dan staat bij mij wat anders, op blz 137:
edit: zie dat ik naar de pdf bladzij keek. start conditie is mij ook niet helemaal duidelijk zie ook pdf bladzij 155
bit 0 van SSPCON2:
SEN: START Condition Enabled/Stretch Enabled bit
In Master mode:
1 = Initiate START condition on SDA and SCL pins. Automatically cleared by hardware.
0 = START condition IDLE
en op blz 80:
PIR1 bit 3 SSPIF: Master Synchronous Serial Port Interrupt Flag bit
1 = The transmission/reception is complete (must be cleared in software)
0 = Waiting to transmit/receive
volgens mij moet je dus na het setten van de startbit wachten todat ie door de hardware gecleared is, dan de data verzenden en dan wachten op het interrupt bitje
Nee, daar ligt het niet aan. Ik heb het gevoel dat m'n i2c routines goed zijn. Heb deze eerder gebruikt en dat werkte toen ook.
Mijn idee is dat er iets met de PCA IC aan de hand is. Ga straks maar eens goed scoopje kijken of er wel ACKs teruggestuurd worden..
Neemt niet weg dat alle info omtrent die PCA9635 welkom is!
Op 21 september 2007 18:47:30 schreef DIY:
Nee, daar ligt het niet aan. Ik heb het gevoel dat m'n i2c routines goed zijn. Heb deze eerder gebruikt en dat werkte toen ook.
Mijn idee is dat er iets met de PCA IC aan de hand is. Ga straks maar eens goed scoopje kijken of er wel ACKs teruggestuurd worden..Neemt niet weg dat alle info omtrent die PCA9635 welkom is!
heb nu ook geen tijd om in de datasheet van dat ding te kijken maar ik weet wel uit ervaring dat het niet gegarandeerd is dat de routine zoals die nu werkt ook voor andere i2c ic's werkt. Als het nl zo is dat het ic maar 1 bericht verwacht en bijv. de ACK of repeat start genegeert wordt kan het zijn dat het werkt maar in dit geval niet.
Wat ik idd geval raar vindt is dat je de hele tijd PIR1,SSPIF pollt.
Volgens de datasheet van dat ding moet ie na iedere byte ene ACK geven, je zou kunnen testen of ie dat geeft na het versturen van het slave adres (let op R/W = 0).
Op blz 7 staat ook nog wat over het instellen van het slave adres, je kan niet zomaar alle pinnen aan gnd leggen lijkt het wel en het ic heeft ook geen interne pull-ups. Misschien kan je eens testen of het wel werkt als je A0 hoog maakt?
Ik ga die i2c inderdaad nog maar eens nakijken...
Wat je zegt over die interrupt flag..dit is wat microchip zelf als voorbeeld geeft. Je kunt die I2C vanuit de PIC op verschillende manieren aanpakken..
Mijn vermoeden is dat de crux in de ack zit. Op mijn scoop heb ik (nog) geen ack voorbij zien komen.
Wel het hele pakket, en dat ziet er op zich goed uit. Hele schone signalen, en de de bytes lijken te kloppen.
Alleen die ack..
En dat datasheet van NXP is nu niet echt een sheet waar je blij van wordt. Had iets logischer opgesteld kunnen worden, maar ja, dat vind ik wel vaker.. 
[Bericht gewijzigd door DIY op (85%)]
Op 22 september 2007 17:36:50 schreef DIY:
Ik ga die i2c inderdaad nog maar eens nakijken...
[...]
Mijn vermoeden is dat de crux in de ack zit. Op mijn scoop heb ik (nog) geen ack voorbij zien komen.
Alleen die ack..
Heb je al geprobeerd om alleen het slave adres te versturen en dan kijken of er een ACK komt? Volgens de datasheet van NXP op blz 6/7 is er een speciale start up sequence nodig.
Die startup sequence is niet "nodig". Moet in mijn geval echter wel, en dat deed ik.
Tenminste..ik schreef data naar de registers die anders gevuld moesten worden dan de default state.
En dat bleek maar niet werken..
Nu ben ik er uit. Bladzijde 10, tabel 4, voetnoot 2. Daar had ik overheen gelezen.
Anyway, de print lijkt te doen wat ie moet doen.
@Redtiger: dank voor het willen meedenken.