TLC5940 en RGBleds met picbasic

Op 13 mei 2015 18:20:53 schreef Arco:
@DaanSteeman :
Je gebruikt HFOSC met een 20MHz kristal en hebt PLL op enabled staan. Dat is niet compatible met elkaar.
De PLL werkt alleen met een XT/kristal (of de interne) oscillator en tussen 4...8MHz.
Bij 20MHz kristal wordt dit na de PLL 80MHz, en dat kan de chip natuurlijk niet trekken...

YESSSSSS dat was het probleem. Haha ik kan me er iets bij voorstellen dat 80MHz wat veel van t goeie is. Afijn, het is gelukt. Super bedankt!!!

Maar dan toch nog even 1 vraag voor educatieve doelen... wat is dat PLL precies? Het vermenigvuldigd de frequentie met 4. Maar is dat puur bedoeld om met de interne klok hogere frequenties te kunnen halen?

Nogmaals beide enorm bedankt voor de hulp en goede tips!

Vr. Groet

Daan Steeman

PS: @Lambiek: Ik zie in die settings die jij voorstelde dat hele PLL niet terug komen. Kan het zijn dat tenzij je dat anders specificeert, dat het altijd uit staat?

Arco

Special Member

Als je de PLL aanzet, kun je een 4(5)MHz kristal gebruiken om op 16(20)MHz te komen. Wordt gedaan omdat een 4(5)MHz kristal minder EMC ellende uitstraalt als een 20MHz exemplaar...
Je hebt trouwens ook WDT_ON en LVP_ON staan. Als je die niet gebruikt moeten die uit anders krijg je nog meer ellende...
De default config waarden staan in de datasheet. (dus ook voor de PLL)

[Bericht gewijzigd door Arco op woensdag 13 mei 2015 20:06:54 (11%)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com
Lambiek

Special Member

PS: @Lambiek: Ik zie in die settings die jij voorstelde dat hele PLL niet terug komen. Kan het zijn dat tenzij je dat anders specificeert, dat het altijd uit staat?

Bij mijn weten wel ja.

Als je haar maar goed zit, GROETEN LAMBIEK.

Beide nogmaals bedankt. Dit is typisch het soort ding waar ik van leer. Mocht ik weer vast lopen dan meld ik me wel ;).

Met vriendelijke groet

Daan Steeman

Heren, ik ben intussen een eind verder en het lukt (mede dankzij jullie hulp) aardig om voor elkaar te krijgen wat ik wil.

Maar nu, ik wil een schuifschakelaar gebruiken om verschillende standen te kunnen kiezen (volledig aan, volledig uit, afhankelijk van 3 potmeters en een automatische stand dat hij van kleur wisselt). Hiervoor wil ik natuurlijk gebruik maken van de ingangen op de pic om te bepalen op welke stand de schuifschakelaar staat. Ik heb gezien dat ze bestaan waar je simpelweg 1 vaste pin verbind met 1 van de overige pinnen. Dit betekend dus dat 1 van de overige pinnen naar 0v word getrokken (of althans, zo sluit ik het aan).
Nu wil ik gebruik maken van de onboard Pull-ups. Het vreemde is dat die niet willen werken. Ook niet na het grondig doorspitten van de datasheet en beide registers die iets over de pullups te zeggen hebben goed in te stellen. En met TRIS de pinnen tot ingang bombarderen:

pic basic code:

;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F1938

Declare Reminders Off
@ CONFIG_REQ = 0 ; Override Compiler's configuration settings
Asm-
__Config _Config1, 0x3FA2 ;FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_ON & FCMEN_ON 
__Config _Config2, 0x1EFF ;WRT_OFF & VCAPEN_OFF & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF 
Endasm-
Declare Reminders On

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

Declare All_Digital = FALSE 
Declare Xtal = 20

Declare Adin_Res 10                                                    ; an/dig converter resolutie van 12 bits
Declare Adin_Stime 1000                                                ; sampletime van 50us
ANSELA = %00000111                                                    ; van A0, A1, A2 ANologe ingang maken
ADCON1 = %10000000                                                    ; ADconverter instellen
APFCON = %01000000                                                    ;CCP3 op pin b.5 zetten
OPTION_REG.7 = 0                                                      ; Pullup weerstanden instelbaar via WPUx register
WPUB = %00001111                                                      ; onboard pullupweerstanden aanzetten op b.3 t/m b.0 pinnen
        ;76543210
PORTA = %00000000                                                     ; alle pinnen laag maken ivm flikkeren bij opstarten
PORTB = %00001111                                                     ; b.3 t/m b.0 ingang om stand te kiezen
PORTC = %00000000                                                     ; 
PORTE = %00000000                                                     ;
        ;76543210                                                              ;
TRISA = %00000111                                                     ; pin a.0,a.1,a.2 zijn de potmeters
TRISB = %00001111                                                     ;
TRISC = %00000000                                                     ;
TRISE = %00000000                   

Kunnen jullie misschien zien waar het mis gaat. Want de interne pull-ups doen niks, en zelfs met een externe pull-up wilt hij niet naar de 5v. Dus om de een of andere reden sinkt hij alles wat ik er aan hang. Hoewel een ingang naar mijn weten hoogomig is...

Alvast bedankt,

Daan Steeman

Arco

Special Member

Zet de pinnen eens op digitaal, dat helpt... :)
(ANSELB bits goed instellen, default is analoog)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Ah kijk ja dat zou schelen :P. Waar staan die default settings in de datasheet? Je had het er eerder ookal over maar ik kan ze niet vinden. Bij sommige registers staat het er bij. Maar lang niet bij alles?

Arco

Special Member

???
Ik zie toch de defaults bij alle registers er gewoon bij staan? (er staat R/W - 1/1, en '1' is analoog)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Oooowwww is dit:

De default van het register waar dat boven staat?

Ik doelde op dit soort text in de uitleg van het register:

Arco

Special Member

Ja,

De kopregel is de default state na een POR/BOR of andere reset (Zie ook de 'legend' voor omschrijving)
Zoals je ziet klopt het ook met de 'default' tekst in jouw voorbeeld...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 21 mei 2015 13:37:24 schreef Arco:
Ja,

De kopregel is de default state na een POR/BOR of andere reset (Zie ook de 'legend' voor omschrijving)
Zoals je ziet klopt het ook met de 'default' tekst in jouw voorbeeld...

Kijk zo leert een mens nog eens wat ;). Ik heb het ANSELB register goed ingesteld. Maar nogsteeds doen maar 2 van de pinnen wat ik wil. B0 en B1 hebben nu de interne pullup. Maar B2 en B3 hangen nogsteeds rond de 0v. Maakt het nog uit in welke volgorde de registers staan?

Ik heb nu dit staan:

pic basic code:

Declare All_Digital = FALSE 
Declare Xtal = 20

Declare Adin_Res 10                                                    ; an/dig converter resolutie van 12 bits
Declare Adin_Stime 1000                                                ; sampletime van 50us
         ;76543210
APFCON = %01000000                                                    ; CCP3 op pin b.5 zetten
ANSELA = %00000111                                                    ; van A0, A1, A2 ANologe ingang maken
ANSELB = %00100000                                                    ; Poortb uitgangen digitale uitgangen maken
ADCON1 = %10000000                                                    ; ADconverter instellen
OPTION_REG.7 = 0                                                      ; Pullup weerstanden instelbaar via WPUx register
WPUB = %00001111                                                      ; onboard pullupweerstanden aanzetten op b.3 t/m b.0 pinnen
        ;76543210
PORTA = %00000000                                                     ; alle pinnen laag maken ivm flikkeren bij opstarten
PORTB = %00000000                                                     ; b.3 t/m b.0 ingang om stand te kiezen
PORTC = %00000000                                                     ; 
PORTE = %00000000                                                     ;
        ;76543210                                                              ;
TRISA = %00000111                                                     ; pin a.0,a.1,a.2 zijn de potmeters
TRISB = %00101111                                                     ;
TRISC = %00000110                                                     ;
TRISE = %00000000                                                     ;
Arco

Special Member

Zou volgens mij moeten werken. Heb je wat aan de niet werkende pinnen hangen? Pull-ups zijn maar heel zwak (~100uA)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Nope hangt niks aan. Afgezien van 1 draadje naar een plek op t breadboard waar ik makkelijker bij kan (ik schakel momenteel met een draadje ergens in prikken. Ik kon geen goede schakelaar vinden bij de plaatselijke electronicahandel). En ik heb inderdaad eerder gehoord dat die onboard pullups heel zwak zijn, daarom heb ik het getest met een externe pullup van 10k, 1k en zelfs 500R. Maar ook dat mag niet baten. Met 500ohm direct naar de 5v trekt hij de pin naar krap 200mv. Dus de pic sinkt om de een of andere reden de stroom. Nou zou ik dat zelf aan een instelling wijten (zoals je gemerkt hebt ben ik geen held met registers instellen. Dat deed proton/fuseconfigurator tot nu toe voor me)Maar voor die 4 pinnen waarvan er 2 het wel doen zijn de instellingen identiek. Plus dat jij zegt dat het zou moeten werken.

Arco

Special Member

Gebeurt er niet iets in de rest van je code? (ik neem aan dat er nog meer is...)
Alle PORTx=.... moet je eigenlijk vervangen door LATx=.... (de 16f1xxx en hoger hebben voor output een apart LATx register, PORTx is alleen voor input)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Haha er is zeker meer ;). maar het enige wat ik daar doe is met IF kijken welke pin laag is en op basis daarvan een bepaald deel van het programma doorlopen.

Wat betreft dat LATx, dus als je een pin met TIRS tot ingang maakt moet je die met PORTx hoog of laag maken? Een ingang is toch juist iets wat van buitenaf word aangestuurt en wat je met de PIC in kan lezen?

Hieronder staat de hele code. Misschien zie ik zelf iets over het hoofd.

pic basic code:

;-------------------------------------------------------------------------------
;**** Added by Fuse Configurator ****
; Use the Fuse Configurator plug-in to change these settings

Device = 16F1938

Declare Reminders Off
@ CONFIG_REQ = 0 ; Override Compiler's configuration settings
Asm-
__Config _Config1, 0x3FA2 ;FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF & BOREN_ON & CLKOUTEN_OFF & IESO_ON & FCMEN_ON 
__Config _Config2, 0x1EFF ;WRT_OFF & VCAPEN_OFF & PLLEN_OFF & STVREN_ON & BORV_LO & LVP_OFF 
Endasm-
Declare Reminders On

;**** End of Fuse Configurator Settings ****
;-------------------------------------------------------------------------------

Declare All_Digital = FALSE 
Declare Xtal = 20

Declare Adin_Res 10                                                    ; an/dig converter resolutie van 12 bits
Declare Adin_Stime 1000                                                ; sampletime van 50us
         ;76543210
APFCON = %01000000                                                    ; CCP3 op pin b.5 zetten
ANSELA = %00000111                                                    ; van A0, A1, A2 ANologe ingang maken
ANSELB = %00100000                                                    ; Poortb uitgangen digitale uitgangen maken
ADCON1 = %10000000                                                    ; ADconverter instellen
OPTION_REG.7 = 0                                                      ; Pullup weerstanden instelbaar via WPUx register
WPUB = %00001111                                                      ; onboard pullupweerstanden aanzetten op b.3 t/m b.0 pinnen
       ;76543210
LATA = %00000000                                                      ; alle pinnen laag maken ivm flikkeren bij opstarten
LATB = %00000000                                                      ; 
LATC = %00000000                                                      ; 
LATE = %00000000                                                      ;
        ;76543210                                                     ;
TRISA = %00000111                                                     ; pin a.0,a.1,a.2 zijn de potmeters
TRISB = %00101111                                                     ; b.3 t/m b.0 ingang om stand te kiezen
TRISC = %00000110                                                     ;
TRISE = %00000000                                                     ;
                                                                      

;poortnamen declareren
Symbol POTR = PORTA.0
Symbol POTG = PORTA.1
Symbol POTB = PORTA.2
Symbol S1 = PORTB.3
Symbol S2 = PORTB.2
Symbol S3 = PORTB.1
Symbol S4 = PORTB.0

;Logische constanten declareren
Symbol Saan = 0
Symbol Suit = 1

;varriabelen declareren
Dim ADR As Word        ; 10bits waarde van ADconverter voor het rode kanaal
Dim ADG As Word        ; 10bits waarde van ADconverter voor het groene kanaal
Dim ADB As Word        ; 10bits waarde van ADconverter voor het blauwe kanaal
Dim DUTYR As Byte      ; 8bits dutycycle voor het rode kanaal
Dim DUTYG As Byte      ; 8bits dutycycle voor het groene kanaal
Dim DUTYB As Byte      ; 8bits dutycycle voor het blauwe kanaal
Dim Subrout As Bit     ; bitje dat 1 moet zijn als een deel van het programma als subroutine doorlopen word
Dim Teller As Byte     ; tellertje dat gebruikt word tijdens het upcyclen/downcyclen tijdens de AUTO stand

Cls
Clear

;WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWhoofdmenuWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
Main:


HPWM 1, DUTYR, 2000                                                   ;respectievelijke dutycycles naar ccpmodules schrijven
HPWM 2, DUTYG, 2000                                                   ;
HPWM 3, DUTYB, 2000                                                   ;

DelayMS 100
If S1 = Saan Then                                                     ; stand 1 gaat op de potmeters
  GoTo Potmeters                                                      ;
EndIf                                                                 ;
If S2 = Saan Then                                                     ; stand 2 staan de leds op vol vermogen 
  GoTo VOLaan                                                         ;
EndIf                                                                 ;
If S3 = Saan Then                                                     ; stand 3 gaan de leds automatisch van kleur veranderen
  GoTo AUTO                                                           ;
EndIf                                                                 ;
If S4 = Saan Then                                                     ; stand 4 gaan de leds compleet uit
  GoTo UIT                                                            ;
EndIf                                                                 ;
                                                                      ;

If Subrout = 1 Then
  Subrout = 0
  Return
EndIf

GoTo Main

;---------------------------------------------------------------------potmeters-----------------------------------------------------------------------------------------------
Potmeters:

  ADR = ADIn 0                                                          ;10 bits waarde van AD converter krijgen
  ADG = ADIn 1                                                          ;
  ADB = ADIn 2                                                          ;

  DUTYR = ADR/4                                                         ;door te delen door 4 (=2^2) ontstaat er een 8 bits waarde 
  DUTYG = ADG/4                                                         ;
  DUTYB = ADB/4                                                         ;
GoTo Main
;---------------------------------------------------------------------volledig aan-----------------------------------------------------------------------------------------------
VOLaan: 

  DUTYR = 255
  DUTYG = 255
  DUTYB = 255
GoTo Main
;---------------------------------------------------------------------volledig uit-----------------------------------------------------------------------------------------------
UIT:

  DUTYR = 0
  DUTYG = 0
  DUTYB = 0
GoTo Main
;---------------------------------------------------------------------Autmatisch van kleur wisselen-----------------------------------------------------------------------------------------------
AUTO: 

For DUTYR = DUTYR To 0 Step 10
  HPWM 1, DUTYR, 2000
  DelayMS 50
Next

For DUTYG = DUTYG To 0 Step 10
  HPWM 2, DUTYG, 2000
  DelayMS 50
Next

For DUTYB = DUTYB To 0 Step 10
  HPWM 3, DUTYB, 2000
  DelayMS 50
Next

GoTo Main



End

PS: het deel waarbij de boel automatisch van kleur wisselt is uiteraard nog "under construction" ;)

Arco

Special Member

Een ingang kun je niet hoog of laag maken via software, je kunt hem alleen uitlezen. (via het PORTx register)
Outputs kun je wel hoog of laag maken, dat gaat via het LATx register...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 21 mei 2015 17:13:20 schreef Arco:
Een ingang kun je niet hoog of laag maken via software, je kunt hem alleen uitlezen. (via het PORTx register)
Outputs kun je wel hoog of laag maken, dat gaat via het LATx register...

Aha dus via het PORTx register maak je niks hoog of laag. Je gebruikt het alleen maar om uit te lezen. Dus als ik bijvoorbeeld een led aan wil zetten moet ik

pic basic code:

LATb.1 = 1.... 

schrijven en als ik een schakelaar wil inlezen moet ik

pic basic code:

If portb.1 = 0 then...

schrijven. Ik vermoedde al dat ik je verkeerd begreep, ik dacht dat je met PORTx ingangen hoog of laag kon maken :+

weer wat geleerd ;). Heb je nog iets raars in de rest van de code kunnen vinden?

EDIT: ik heb nog eens verder zitten uitproberen... de pullups op poort B.0 B.1 en B.4 doen het. Voor de rest sinkt de rest alles wat ik er op zet (withing reason uiteraard) en hebben ze zelfs een negatieve spanning van rond de -25mv als er niks aan hangt.
En als ik de CCP module die op de Bpoort zit uitschakel en een andere gebruik (zodat ik dus overal pullups aan heb staan en verder NIKS met die poort doe. Dan stopt ineens een heel andere CCP module (ccp1) ermee. En de pullups doen het nog steeds niet.

[Bericht gewijzigd door DaanSteeman op vrijdag 22 mei 2015 10:36:17 (11%)

Na behoorlijk wat zoekwerk heb ik weer wat meer informatie kunnen vergaren. Op het moment dat ik de ccp modules helemaal uit het programma haal doen alle pullups het. Maar zodra ik de ccpmodules weer aan zet houd de helft van de pullups er weer mee op. Dit geld voor meerdere pics en ook met externe pullups. De pic sinkt die pinnen echt.

Daarnaast heb ik een programma waar alle ccpmodules op werkte vergeleken met een waar de blauwe (ccp3) het niet deed. Uiteindelijk was het geen wat het verschil maakte het commando "CLS" om het lcdscherm leeg te maken.... alleen 2 kleinigheidjes, er hangt geen lcdscherm aan (er ligt niet eens een in de buurt xD), en een lcdscherm heeft geen BAL te maken met een ccpmodule naar mijn weten.

Heeft iemand enig idee waardoor dit veroorzaakt kan worden??

EDIT: Ik verdacht de voeding op een gegevenmoment. Ik gebruik namelijk een verbouwde computervoeding. Op het moment dat ik daar ook de 12V voor de ledstrip vanaf trek zakt de 5V inderdaad tot 4,7V. Ik heb nu de 12V vanaf een apparte voeding gepakt en dan blijft de 5V netjes 5V. Maar ook dan zakt een deel van de pinnen met pullup naar 0V.

Het lijkt haast volkomen willekeur te zijn. 1 ccp module doet het niet. Ik zet ergens "CLS" tussen en de andere twee stoppen met werken. Maar de module die het niet meer deed die begint spontaan met werken (en precies volgens programma).
Zet ik bewust 1 ccpmodule aan en de rest uit, geeft hij geen enkel teken van leven en zakt de pin met pullup naar 0V.
Zet ik bewust 1 andere ccpmodule aan, doet hij het perfect en blijft de pulluppin netjes op 5V tenzij ik hem met de knop naar de 0V trek.
Zet ik bewust alleen de laatste ccpmodule aan geeft hij geen enkel teken van leven maar blijft de pulluppin netjes op 5V tenzij ik hem met de knop naar de 0V trek.

[Bericht gewijzigd door DaanSteeman op vrijdag 22 mei 2015 19:56:00 (23%)

Arco

Special Member

Ik zie niet goed hoe Picbasic dat doet met HPWM, zonder te weten/vragen welke timer je wilt gebruiken. (iedere PWM kan timer2, 4, of 6 gebruiken)
Gaat het met gewone PWM aansturing (zonder de ingebakken functies) wel goed?

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Wat bedoel je met de gewone PWM aansturing? Handmatig de kanalen, timers enzovoorts instellen volgens dit rijtje (komt uit de datasheet).

Arco

Special Member

Ja, Instellen is vrij simpel.
Zelfs met de Picbasic functies zul je toch in moeten stellen welke timer er gebruikt moet worden. (CCPTMRS0 en CCPTMRS1 registers)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Voor zover ik weet doet de HPWM functie dat allemaal voor je ;). Maargoed, ik ben op het moment bezig om de registers uit te pluizen om het "handmatig" te doen. Ik neem aan dat ik al die registers maar 1 keer hoef in te stellen en als dat eenmaal gebeurt is alleen de dutycycle moet veranderen als ik dat wil.

Ik heb er dit van gebakken. Maar er is geen teken van leven. Zie jij de fout toevallig?

pic basic code:

 TRISC.2 = 1             ; module uitzetten door de pin als ingang te configureren
 CCPTMRS0 = %00000000    ; timer 2 word gebruikt
 PR2 = %11111011         ; timer2 instellen op ongeveer 2000Hz
 CCP1CON = %00001100     ;alleen PxA word gemoduleerd. de overige worden als portpins geset
 CCP1CON.4 = DUTYR.0     ; de 2 lsb in het ccp1con register zetten
 CCP1CON.5 = DUTYR.1     ; de 2 lsb in het ccp1con register zetten
 DUTYR = DUTYR >> 2      ; die 2 lsb bits uit de dutyr halen door 2 bits naar rechts te schuiven
 CCPR1L = DUTYR          ; de resterende msb in het ccpr1l register zetten
 TRISC.2 = 0             ; de module aanzetten

[Bericht gewijzigd door DaanSteeman op vrijdag 22 mei 2015 21:10:11 (55%)

Arco

Special Member

Timer 2 staat uit. Aanzetten met T2CON.bit2 = 1

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Op 22 mei 2015 20:05:43 schreef Arco:
Ik zie niet goed hoe Picbasic dat doet met HPWM, zonder te weten/vragen welke timer je wilt gebruiken. (iedere PWM kan timer2, 4, of 6 gebruiken)

Ik denk dat de compiler gewoon een default gebruikt. Er is maar 1 HPWM mogelijk, meerdere worden niet ondersteund. De syntax is HPWM channel, dutycycle, frequency.
Het is in PicBasic gewoon mogelijk de SFR's van waarden te voorzien.
Ik heb in een ver verleden een 3 kanaals PWM voor een 16F737 opgezet.
Deze net even opgeduikeld en zo te zien ben je op het goede spoort (ik ken deze pic niet).

Just find out what you like and let it kill you

Goed, even het nodige zoekwerk later heb ik er dit van gebreid. Dit staat bovenin bij de rest van de configregels:

pic basic code:

T2CON.2 = 1
CCPTMRS0 = %00000000    ; timer 2 word gebruikt voor alle ccpmodules
CCPTMRS1 = %00000000    ; timer 2 word gebruikt voor alle ccpmodules
PR2 = %11111011         ; timer2 instellen op ongeveer 2000Hz
CCP1CON = %00001100     ;alleen PxA word gemoduleerd. de overige worden als portpins geset
CCP2CON = %00001100     ;alleen PxA word gemoduleerd. de overige worden als portpins geset
CCP3CON = %00001100     ;alleen PxA word gemoduleerd. de overige worden als portpins geset

en dit staat op de plek waar tot nu toe HPWM...... stond

pic basic code:

;ccpmodule1 instellen 
 TRISC.2 = 1             ; module uitzetten door de pin als ingang te configureren
 CCP1CON.4 = DUTYR.0     ; de 2 lsb in het ccp1con register zetten
 CCP1CON.5 = DUTYR.1     ; de 2 lsb in het ccp1con register zetten
 BD2 = DUTYR/4
 CCPR1L = BD2          ; de resterende msb in het ccpr1l register zetten
 TRISC.2 = 0             ; de module aanzetten
;ccpmodule2 instellen
 TRISC.1 = 1
 CCP2CON.4 = DUTYG.0
 CCP2CON.5 = DUTYG.1
 BD2 = DUTYG/4
 CCPR2L = BD2
 TRISC.1 = 0
;ccpmodule3 instellen
 TRISB.5 = 1
 CCP3CON.4 = DUTYB.0
 CCP3CON.5 = DUTYB.1
 BD2 = DUTYB/4
 CCPR3L = BD2
 TRISB.5 = 0

Het positive is dat het werkt. Dat wil zeggen hij geeft de verschillende dutycycles door aan de ccp modules en die voeren dat uit. Maar het eerste probleem, het niet werken van de pullups is niet opgelost. Een deel doet het, een deel totaal niet. Dus het zelfde resultaat als met HPWM....

@hadv: Het vreemde is dat het met HPWM 1, HPWM 2 en HPWM 3 precies deed wat ik wilde (voor het PWM verhaal in elk geval). Alleen die pullups hebben toch niks te maken met de ccpmodules?