View previous topic :: View next topic |
Author |
Message |
newguy
Joined: 24 Jun 2004 Posts: 1908
|
Update: PPS and the 18F24K40 - fixed in next release |
Posted: Thu Jun 29, 2017 8:35 am |
|
|
This is my first time working with a processor that features re-mappable pins and I'm having a bit of difficulty with the CCP2 module, which I'm using in PWM mode. v5.073.
I have CCP2OUT mapped to PIN_B2 using:
Code: | #pin_select CCP2OUT=PIN_B2 |
What I *want* to do is to initially take manual control of PIN_B2 until I need the PWM. Initially I have the PWM turned off by explicitly calling
Code: | setup_ccp2(CCP_OFF); |
The issue is that, with the #pin_select, I can't drive PIN_B2 high. Without the #pin_select, I have complete control.
I think I can get around this by initially setting up the CCP2 module to generate a PWM signal, but not clock it. That will force the pin high as though I manually set it high, but it just doesn't "feel right".
Is there a way of getting manual control with the #pin_select left in, or do I have to configure and reconfigure the pin select "on the fly" with the pin_select() function?
Last edited by newguy on Thu Jun 29, 2017 11:42 am; edited 2 times in total |
|
|
gaugeguy
Joined: 05 Apr 2011 Posts: 303
|
|
Posted: Thu Jun 29, 2017 8:47 am |
|
|
Because LATxy is one of the pps output options and because a pin can only have one output option at a time, LATxy (which allows standard I/O control) and CCP2 cannot be configured to the same pin at the same time.
Changing on the fly is the only option if the pin needs to be under LAT control some time and CCP2 control some time. |
|
|
jeremiah
Joined: 20 Jul 2010 Posts: 1353
|
|
Posted: Thu Jun 29, 2017 9:35 am |
|
|
This actually surprises me. I don't generally work with PIC18's so they can be fundamentally different, but on PIC24's I often use I/O operations on output pins that are also mapped a peripheral via #pin_select. In particular we use a UART TX pin as I/O when the UART is turned off. In those cases, just turning off the UART is enough to release the pin back to the I/O controller.
Is this a difference in how the PIC18 is designed I wonder? |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1908
|
|
Posted: Thu Jun 29, 2017 10:15 am |
|
|
So far nothing I've tried gives me control of that pin back once I assign it to the CCP2 module with a PPS statement. I've also tried "unassigning" it with
Code: | pin_select("NULL", PIN_B2) |
but that doesn't truly "unassign" the pin either. I looked into trying to "reassign" it back to the latch but can't work that out.
So I did things the hard way - deal with it solely as a PWM and then playing with its assigned timer (starting & stopping) to trigger that line high/low "manually". ...And in so doing found a bug with the compiler: when you try to turn off timer 6 (could be other timers affected too) the compiler gives me:
Code: | .................... setup_timer_6(T6_DISABLED, 0, 1);
0B78: MOVLB 1
0B7A: BCF xF7.0
|
Not only is that the wrong register, it's also the wrong bit. I've alerted CCS to the bug. |
|
|
newguy
Joined: 24 Jun 2004 Posts: 1908
|
|
Posted: Thu Jun 29, 2017 11:33 am |
|
|
There's definitely issues with v5.073 and PPS. If I take manual control of the PPS registers, I can easily switch back & forth from CCP2OUT controlling PIN_B2, and manually controlling PIN_B2. |
|
|
guy
Joined: 21 Oct 2005 Posts: 297
|
|
Posted: Mon Dec 18, 2017 3:56 am |
|
|
When changing a PPS output using pin_select() from one pin to another is there a way to disconnect the old one? It seems the compiler leaves the old one connected.
PIC16LF18855 offers this as a feature (periph. outputs CAN BE connected to several pins) but I don't see the compiler (v. 5.075) allowing me to disconnect, either automatically or manually.
Code: |
.................... pin_select("U1TX",TX_UUT,TRUE,TRUE);
0B72: CLRF 77
0B73: BTFSC 0B.7
0B74: BSF 77.0
0B75: BCF 0B.7
0B76: MOVLW 55
0B77: MOVLB 1D
0B78: MOVWF 0F
0B79: MOVLW AA
0B7A: MOVWF 0F
0B7B: BCF 0F.0
0B7C: BTFSC 77.0
0B7D: BSF 0B.7
0B7E: MOVLW 10
0B7F: MOVLB 1E
0B80: MOVWF 23
0B81: CLRF 77
0B82: BTFSC 0B.7
0B83: BSF 77.0
0B84: BCF 0B.7
0B85: MOVLW 55
0B86: MOVLB 1D
0B87: MOVWF 0F
0B88: MOVLW AA
0B89: MOVWF 0F
0B8A: BSF 0F.0
0B8B: BTFSC 77.0
0B8C: BSF 0B.7 |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Mon Dec 18, 2017 9:48 am |
|
|
The default is to leave it attached. Removal is what NULL is for.
Code: |
pin_select("U1TX",TX_UUT,TRUE,FALSE);
pin_select("U2TX",TX_UUT,FALSE,TRUE);
|
Connects both peripherals to the single pin.
Code: |
pin_select("NULL",TX_UUT,TRUE,FALSE);
pin_select("U1TX",TX_UUT,FALSE,TRUE);
|
Deselects the existing selections, then connects U1tX. |
|
|
guy
Joined: 21 Oct 2005 Posts: 297
|
|
Posted: Mon Dec 18, 2017 1:24 pm |
|
|
Thank you Ttelmah. Makes sense, just not mentioned in the help file...
Next question, or a pointer where to find the answer:
What is the relationship between Open-Drain, Current-Control Drive, Input Threshold etc. and PPS? Does the PPS MUX connect directly to the pin or before the fancy driving/input features? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Mon Dec 18, 2017 1:58 pm |
|
|
This is a data sheet one.
For example for the PIC16LF18855 you mention.
Look at section 12-1.
See how it says "Current-Controlled mode is available
regardless of which peripheral drives the output."
However on some other chips and peripherals for example the input thresholds do depend on the peripheral selected.
Then I2C for example, selects the open collector drive. |
|
|
guy
Joined: 21 Oct 2005 Posts: 297
|
|
Posted: Mon Dec 18, 2017 2:14 pm |
|
|
Correct, but all other I/O features I checked are not explained (OD, TTL/CMOS Input, Slew rate limit). |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Mon Dec 18, 2017 2:35 pm |
|
|
Most are features of the output driver or input. PPS just connects the signal to the driver. |
|
|
guy
Joined: 21 Oct 2005 Posts: 297
|
|
Posted: Mon Dec 18, 2017 3:09 pm |
|
|
So you're saying that the features do apply to the PPS functions? Thanks.
I'm very excited with these options (although I don't suppose Microchip will maintain all of them throughout all new PICs). It allows for a single chip design (max. 50mA per output, no series resistors required for low current LEDs, no pull ups required, open drain, etc.) and much more flexibility. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19535
|
|
Posted: Tue Dec 19, 2017 8:58 am |
|
|
Quote: |
no series resistors required for low current LEDs
|
Er. No.....
Read the data sheet. You must not use the current source without a series resistor designed to do most of the voltage dropping for you, or you risk overheating the source.
It is totally stupid, but the only uses for it are actually to give the regulation. Using it to actually deliver power will overload this part. |
|
|
guy
Joined: 21 Oct 2005 Posts: 297
|
|
Posted: Tue Dec 19, 2017 9:09 am |
|
|
I read it. I feel totally safe using it to directly drive a 2mA SMD LED - the heat is negligible. It also means that in battery operated applications the LED has constant current throughout the battery life cycle regardless of the voltage, a great feature not easily performed with discrete parts. |
|
|
|