Sterrenhemel

Dit topic is gesloten

Arco

Special Member

Je moet wel de CCPTMRS0 en CCPTMRS1 registers goed zetten...

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

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'

Fouten zijn het bewijs dat je het probeert..
Arco

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%)

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

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...

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Heb je de CCP3 pin wel ergens naartoe gemapped in de PPS? (default hangt die los)

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

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..

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Alleen inputs hebben een default, outputs niet.

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

Golden Member

Ja, Dat is het dus wel... :)

pic basic code:

RB5PPS = 0x0B                                               'Map B.5 To CCP3

En het loopt...

Fouten zijn het bewijs dat je het probeert..
Bavelt

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?

Fouten zijn het bewijs dat je het probeert..
Arco

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)

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

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)

Fouten zijn het bewijs dat je het probeert..
Bavelt

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?
:?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Er is ook een PWM3_Remappable_Set_Duty()... ;)

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

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... :>

Fouten zijn het bewijs dat je het probeert..
Bavelt

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...

Fouten zijn het bewijs dat je het probeert..
Arco

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...

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

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? :?

Fouten zijn het bewijs dat je het probeert..
Arco

Special Member

Watchdog of MCLRE aangezet?

[Bericht gewijzigd door Arco op woensdag 17 februari 2021 23:23:37 (20%)

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

Golden Member

Fouten zijn het bewijs dat je het probeert..
Bavelt

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%)

Fouten zijn het bewijs dat je het probeert..
Bavelt

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...

Fouten zijn het bewijs dat je het probeert..
Bavelt

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... :/

Fouten zijn het bewijs dat je het probeert..
Bavelt

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?

Fouten zijn het bewijs dat je het probeert..
Arco

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...

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

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....

Fouten zijn het bewijs dat je het probeert..

Dit topic is gesloten