View previous topic :: View next topic |
Author |
Message |
bdeb
Joined: 05 Nov 2010 Posts: 42 Location: Sweden
|
Unable to deactivate CTS |
Posted: Tue Jun 11, 2024 2:31 am |
|
|
uP=18F16Q41, CCS=5.115, IDE=MPLAB 6.0, OS=Win10
Dear gurus, once again I'm stuck...
The problem is that CTS for UART1 (default PB7) is *working* though it should be off!
Using no buffers in #use-statement should *deactivate* handshaking:
Code: | #use rs232(UART1, BAUD=115200, BITS=8, STOP=1, PARITY=N, ERRORS, STREAM=LTE) |
Trying:
Code: | #pin_select U1CTS=NULL | just says "Invalid directive"
Also tried:
Code: | #byte U1CTSPPS = getenv("SFR:U1CTSPPS")
and later U1CTSPPS = 0; |
...but that makes no difference, even if trying "CTS_LEVEL=HIGH" in #use rs232
Have no spare inputs that could "fake" a CTS pin.
At my wits end and begging for tips..
All the best:
/Björn |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19534
|
|
Posted: Tue Jun 11, 2024 4:14 am |
|
|
I'd just turn this off yourself. If this works, report it to CCS.
So:
[code]
#byte U1CON2=getenv("SFR:U1CON2")
U1CON2 &= 0xFC; //set low two bits to 0
[code] |
|
|
bdeb
Joined: 05 Nov 2010 Posts: 42 Location: Sweden
|
|
Posted: Tue Jun 11, 2024 5:13 am |
|
|
Thank you Ttelmah,
Already tried that, does not help.
Probably because #use rs232 "happens" in header file, and does not care if handshake is turned off later in code.
Thank's anyway!
/Björn |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19534
|
|
Posted: Tue Jun 11, 2024 6:07 am |
|
|
You need to talk to CCS.
The problem is not just that it is enabling CTS. It is configuring the UART
incorrectly in several other ways. This chip has different register placements
than the older PIC's, and it appears whoever set up the data configuration,
has not got it quite right. It is writing values into registers that the data
sheet says are 'reserved', and not configuring some other registers at all.
This is a classic problem of jumping on a new chip, before it has been tested
and the problems found.
You might find 5.116 fixes this it has a note that it 'updated definitions for
the newest chips'. |
|
|
bdeb
Joined: 05 Nov 2010 Posts: 42 Location: Sweden
|
|
Posted: Tue Jun 11, 2024 6:52 am |
|
|
Thank's again!
Will update and post back with results!
I know I'm "bleeding edge" - but just love the new units....
Just the pin_select saved 2 extra board layers.
All the best:
Björn |
|
|
bdeb
Joined: 05 Nov 2010 Posts: 42 Location: Sweden
|
|
Posted: Wed Jun 12, 2024 5:16 am |
|
|
Update:
Tried v 5.117 but still not working.
Sent mail to CCS support.
Keep you posted!
/Björn |
|
|
bdeb
Joined: 05 Nov 2010 Posts: 42 Location: Sweden
|
|
Posted: Thu Jun 13, 2024 3:32 am |
|
|
Update:
Just tried to set PB7 as analog input.
This makes it work, but feels like a risky hack for production..
Will notify CCS. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19534
|
|
Posted: Fri Jun 14, 2024 1:26 am |
|
|
Provided you can use this pin as analog, this works on your chip since
the ANSEL register disables digital I/O on the pins when they are selected
as analog.
Better possibly (though untested):
Code: |
#include <mainCTS.h>
#pin_select U1TX=PIN_C0
#pin_select U1RX=PIN_C1
#use rs232(UART1, NOINIT, ERRORS, STREAM=LTE)
//UART Baud Rate equals [Fosc*(1+(BRGS*3)]/[(16*(BRG+1))]
#byte U1BRGL = getenv("SFR:U1BRGL")
#byte U1BRGH = getenv("SFR:U1BRGH")
#byte U1CON0 = getenv("SFR:U1CON0")
#byte U1CON1 = getenv("SFR:U1CON1")
#byte U1CON2 = 0x2AD //getenv("SFR:U1C0N2") //does not work
#BIT U1ON = U1CON1.7
#define BAUD 115200
void initUART(void)
{
int16 BRG;
//setup IART1 for 115200, no handshake
U1ON=FALSE; //disable the UART
U1CON0 = 0b10110000; //8bit TX EN, RX EN, FAST clock, no auto baud
U1CON2 = 0x80; //Disables flow control one stop bit, no checksum, not inverted
//Now calculate BRG from clock
BRG = ((getenv("CLOCK")*4)/(BAUD*16))-1; //This should calculate the BRG value
U1BRGL=make8(BRG,0); //low byte
U1BRGH=make8(BRG,1);
//Now enable the UART
U1ON=TRUE;
}
void main()
{
int n;
initUART();
while(TRUE) //silly test
{
for (n=0;n<255;n++)
fputc(n,LTE);
}
}
|
This turns off the compilers UART initialisation, and goes DIY. What is
interesting is that the getenv on U1CON2 does not work. Since this is
the register with the CTS control bits in it, it probably explains what
is wrong.
When they supply the fix all you do is get rid of the manual INIT, and
turn the initialisation in the #USE RS232. |
|
|
bdeb
Joined: 05 Nov 2010 Posts: 42 Location: Sweden
|
|
Posted: Thu Jun 27, 2024 12:10 pm |
|
|
Update.
The nice guys at CCS came back today with news that this was caused by a MSB from 16-bit multiply that was placed in U1CON2 by mistake.
Compiler fix is on the priority list.
Thank you Ttelmah
/Björn |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19534
|
|
Posted: Fri Jun 28, 2024 6:57 am |
|
|
That is very interesting. They had a problem with the MSB from a multiply
wrapping into another register before. I had tried in the simulator and
found the value in U1CON2 was wrong, but hadn't spotted that it was right
and then changing to wrong. |
|
|
|