Je moet wel de CCPTMRS0 en CCPTMRS1 registers goed zetten...
Dit topic is gesloten
Special Member
Je moet wel de CCPTMRS0 en CCPTMRS1 registers goed zetten...
Golden Member
Ik kom dan uit op
pic basic code:
CCPTMRS0 = %10101010
(dwz CCP3 op TMR4 voor PWM mode)
Maar moet dan TMR4 ook nog worden 'aangezet?/ ingesteld'
Special Member
Ja, zelfde als je met timer 2 hebt gedaan...
Waarom laat je trouwens niet alles op 1 timer lopen? (timer 2, die loopt toch al?)
[Bericht gewijzigd door Arco op woensdag 17 februari 2021 15:43:02 (49%)
Golden Member
Ik weet niet of ik het zo goed heb gedaan:
pic basic code:
T4CON = %11000000 'Pre: 16 - Post:1
T4CLKCON = %00000001 'Fosc / 4
PR4 = 49
CCP3CON = %10001111
CCPTMRS0 = %10101010
PWM3_Init(500)
PWM3_Start()
Duty = 127
PWM3_Set_Duty(Duty)
Het signaal op de CCP3 Poort (B.5) blijft echter hoog...
Special Member
Heb je de CCP3 pin wel ergens naartoe gemapped in de PPS? (default hangt die los)
Golden Member
Op 17 februari 2021 16:09:10 schreef Arco:
Heb je de CCP3 pin wel ergens naartoe gemapped in de PPS? (default hangt die los)
Nee, die had ik niet gemapped. Uit de Sheet begreep ik dat RB5 de Default pin is voor CCP3. Maar dat kan ik alsnog doen..
Special Member
Alleen inputs hebben een default, outputs niet.
Golden Member
Ja, Dat is het dus wel...
pic basic code:
RB5PPS = 0x0B 'Map B.5 To CCP3
En het loopt...
Golden Member
Waar ik nog wel mee zit in relatie tot MB en de Datasheet:
Uit de sheet begrijp ik dat ik eigenlijk het CCP3CON Register moet zetten.
Maar als ik dat niet doe, werkt het toch. Mijn vermoeden is dat de Compiler dit voor me doet op het moment dat ik PWM3_Init() doe.
Hoe weet je nu wanneer de compiler dat soort registers zet en wat je echt zelf moet doen? Kan ik dat ergens vinden?
Special Member
PWM3_Init() doet waarschijnlijk een mapping naar een pin (niemand weet welke, dat staat niet in de helpfile... )
Als je dat niet wilt, moet je PWM3_Remappable_Init() gebruiken... (die doet alleen het hoogstnoodzakelijke en blijft van de mapping af)
Golden Member
Ja, er gebeuren nu war rare dingen.
Wat is raar: iedere CCP (PWM) werkt, maar zodra ik er 2 tegelijk wil, doet geen van allen het meer..
Ik mag toch voor iedere CCP dezelfde timer gebruiken? (ik kan alleen kiezen uit TMR 2, 4, en 6 voor PWM)
Golden Member
Heel apart...
Ik heb dit in de Main:
pic basic code:
PWM3_Remappable_Init(500)
PWM3_Remappable_Start()
For i1 = 0 to 254 step 20
Duty = i1
PWM3_Set_Duty(Duty)
Delay_Ms(500)
Next i1
Verder geen Timer aan /uitzetten, geen geen CCPTMRS0... helemaal niks.
En toch werkt dit...
Geen idee op welke timer, etc
Dit is toch raar?
Special Member
Er is ook een PWM3_Remappable_Set_Duty()...
Golden Member
Maar het rare is dat ik wel een PWM kan krijgen, maar niks heb ingesteld voor TMR.
Slechts een remap, een init en duty cycle en hij gaat..
Betekent dus ook dat ik geen TMR kan instellen. Apart allemaal...
Golden Member
Het lijkt er een beetje op de PWM in deze PIC16F18857 zijn eigen (interne) timer heeft.
Maar dat haal ik niet uit de Datasheet...
Special Member
Het kan zijn dat de pwm_init een vaste timer toewijst, maar da's helaas nergens te vinden.
Ik gebruik die pwm library nooit. 't Zijn maar een paar instellingen die je zo ook kunt doen...
Golden Member
Op 17 februari 2021 22:36:44 schreef Arco:
Het kan zijn dat de pwm_init een vaste timer toewijst, maar da's helaas nergens te vinden.
Ik gebruik die pwm library nooit. 't Zijn maar een paar instellingen die je zo ook kunt doen...
Daar ben ik dan erg benieuwd naar hoe die init te omzeilen. Tops welkom!
Maar om het even apart te kunnen teset, heb ik even een nieuw projectje gemmaakt zonder de ballast van de sterrenhemel.
Nu heb ik weer zo'n dag:
pic basic code:
program PWM_18857
main:
ANSELC = %00000000
TRISC = %00000000
LATC.1 = 1
Delay_Ms(500)
LATC.1 = 0
Delay_Ms(500)
while true wend
end.
Dit super mini programma reset de PIC steeds na de eerste delay...
Hoe is dat nu weer mogelijk?
Special Member
Watchdog of MCLRE aangezet?
[Bericht gewijzigd door Arco op woensdag 17 februari 2021 23:23:37 (20%)
Golden Member
Op 17 februari 2021 22:36:44 schreef Arco:
Het kan zijn dat de pwm_init een vaste timer toewijst, maar da's helaas nergens te vinden.
Ik gebruik die pwm library nooit. 't Zijn maar een paar instellingen die je zo ook kunt doen...
Nou, het mini programma met alleen PWM is nu aan de praat.
Het probleem lijkt inderdaad te wijzen naar de PWM-Init van MikroBasic, die daar 'iets moois' van maakt..
Ik heb:
pic basic code:
PWM1_Remappable_INIT(500)
PWM1_Remappable_START()
PWM2_Remappable_INIT(500)
PWM2_Remappable_START()
RC2PPS = 0x09 'Map C.2 To CCP1 Pin 13
RC1PPS = 0x0A 'Map C.1 To CCP2 Pin 12
De 'gewone' Init koppelt de PWM's aan de pinnen zoals in de datasheet staat vermeld: CCP1 aan Poort C.2, CCP2 aan Poort C.1
Bij de Remappable_init moet je de pinnen zelf toewijzen. Dat heb ik gedaan in bovenstaand programmaatje.
Beide PWM's doen het afzonderlijk, maar alleen eentje tegelijk (als je de ander 'wegcommentariëert').
Ze worden ook aan 'een' timer toegewezen. Welke is een raadsel.
Het zal dan zaak worden om de INIT te vervangen door het goed zetten van registers in het programma.
Ik heb het zo en lijkt te werken:
pic basic code:
CCP1CON = %10000000
CCP2CON = %10000000
CCPTMRS0 = %10101010
T4CON = %11000000 'Pre: 16 - Post:1
T4CLKCON = %00000001 'Fosc / 4
PR4 = 49
GIE_bit = 1 'Enable timer irq
PEIE_bit = 1
TMR4IE_bit = 1 'Enable Timer1 overflow interrupt
[Bericht gewijzigd door Bavelt op donderdag 18 februari 2021 00:30:34 (16%)
Golden Member
Zo werkt het:
pic basic code:
Program PWM_18857
Dim i1 As Byte
Dim Duty As Byte
main:
ANSELA = %00000000
ANSELB = %00000000
ANSELC = %00000000
TRISB = %00000000
TRISC = %00000000
LATC = 0
LATB = 0
CCP1CON = %10000000 'Enable CCP1
CCP2CON = %10000000 'Enable CCP2
CCP3CON = %10000000 'Enable CCP3
CCP4CON = %10000000 'Enable CCP4
CCPTMRS0 = %10101010 'Timer 4 for PWM
T4CON = %11000000 'Pre: 16 - Post:1
T4CLKCON = %00000001 'Fosc / 4
PR4 = 49
RC2PPS = 0x09 'Map C.2 To CCP1 Pin 13
RC1PPS = 0x0A 'Map C.1 To CCP2 Pin 12
RB5PPS = 0x0B 'Map B.5 To CCP3 Pin 26
RB6PPS = 0x0C 'Map B.6 To CCP4 Pin 27
PWM1_Remappable_START()
PWM2_Remappable_START()
PWM3_Remappable_START()
PWM4_Remappable_START()
Duty = 0
PWM1_Remappable_SET_Duty(Duty)
PWM2_Remappable_SET_Duty(Duty)
PWM3_Remappable_SET_Duty(Duty)
PWM4_Remappable_SET_Duty(Duty)
While true
For i1 = 0 to 64 step 8
Duty = i1
PWM1_Remappable_SET_Duty(Duty)
Delay_Ms(500)
Next i1
For i1 = 0 to 64 step 8
Duty = i1
PWM2_Remappable_SET_Duty(Duty)
Delay_Ms(500)
Next i1
For i1 = 0 to 64 step 8
Duty = i1
PWM3_Remappable_SET_Duty(Duty)
Delay_Ms(500)
Next i1
For i1 = 0 to 64 step 8
Duty = i1
PWM4_Remappable_SET_Duty(Duty)
Delay_Ms(500)
Next i1
Wend
end.
Ik mis enkel nog de parameter voor de frequentie...
Golden Member
Op 17 februari 2021 22:36:44 schreef Arco:
Het kan zijn dat de pwm_init een vaste timer toewijst, maar da's helaas nergens te vinden.
Ik gebruik die pwm library nooit. 't Zijn maar een paar instellingen die je zo ook kunt doen...
Wat dat betreft is dat wel herkenbaar. Ik heb vroeger tussen assembler-programmeurs gezeten die werkelijk gruwelden van hetgeen de compilers van 'hogere programmeertalen' er van maakten...
Zo zal dat ook in MikroBasic zijn. Ogenschijnlijk makkelijk te gebruiken routines, waarbij dje de controle verliest op wat er echt gebeurt...
Golden Member
Ik ben met wat afrondende dingen bezig.
Zo stuur ik vanuit de PIC (16F18857) de leds voor 'Mars' (4 stuks, 3mm) en wat andere ledjes aan voor testdoeleinden.
Ik heb ze nu rechtstreeks op de poorten aangesloten met een serie weerstand van 330 Ohm. (source, geen sink).
Ik heb de datasheet wat lopen doorpluizen, ik begreep daaruit dat je max 50 mA uit een poort mag halen?.
Dat kwam me redelijk royaal over...
Alternatief zou zijn om de ledjes aan te sturen met bv een ULN2803. Zitten 8
drivers in en lekker compact.
Of is het geen bezwaar om bv in totaal 8 ledjes aan de poorten te hangen?
Special Member
Normaal wordt aangeraden om sourcen tot 3mA, en sinken tot 8mA te beperken. (dan zijn de uitgangsnivo's nog TTL-correct)
Nieuwere pics zijn inderdaad 50mA (oudere 25mA). Maar da's Absolute maximum ratings (de waarde waarbij 'ie kapot gaat of kan gaan.).
Daar kom je dus liefst niet in de buurt...
Golden Member
Dan doe ik er een ULN2803 tussen, kleine moeite en kost amper ruimte.
Want uiteindelijk zit het printje hoog aan het plafond achter een paneel. Dan wil je graag dat dat stabiel werkt.
Daarbij vermoed ik dat 50 mA weliswaar mag, maar kan me amper voorstellen dat er geen cumulatief maximum aan zit, Als ik 8 poorten met 50mA zou belasten, dan verstook je al 0,4 A....
Dit topic is gesloten