View previous topic :: View next topic |
Author |
Message |
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
[SOLVED] PIC18F04Q40 UART problem |
Posted: Wed Mar 16, 2022 1:10 am |
|
|
I am getting the following error in driver rs485 when using PIC18F04Q40.
Code: | RS485.c:121:18: Error#102 Expect comma |
for the line
Working fine for all other processors
Last edited by alan on Thu Mar 17, 2022 11:32 pm; edited 1 time in total |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19487
|
|
Posted: Wed Mar 16, 2022 2:05 am |
|
|
Two separate problems here.
This chip has multiple UARTs. These are also PPS peripherals.
So the compiler has to be told which UART to use, and what pins it
is on. The complaint is 'misleading', it really needs to be something like
"I don't know which UART you want to use and where it is connected".
So:
Code: |
#include <18F04Q40.h>
#device ADC=12
#FUSES NOWDT //No Watch Dog Timer
#use delay(internal=16000000)
#pin_select U1TX=PIN_C4
#pin_select U1RX=PIN_C5
#use rs232(UART1, baud=9600, NOINIT)
//Tell the compiler which UART to use by default and assign pins to it
//but don't start it. This is now the default UART.
void main()
{
setup_uart(TRUE); //This now merrily works & starts the UART
while(TRUE)
{
}
}
|
|
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Wed Mar 16, 2022 2:32 am |
|
|
Thanks Ttelmah, that were just plain dumb from me. I had a pre-processor setting hardware depending on the 'device' and forgot to update it.
Any way I need 9 bit protocol and this does not work
Code: | #use rs232(baud=38400, UART1, bits=9, long_data, errors, stream=RS485)
|
Complaining about the bits=9;
Quote: | Error#99 Option invalid 9 not supported by hardware UART peripheral |
I know I am missing something here |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Wed Mar 16, 2022 2:47 am |
|
|
According to data sheet the chip can handle 9 bits.
Quote: |
Half and full-duplex asynchronous transmit and receive
Two-byte input buffer
One-byte output buffer
Programmable 7-bit or 8-bit byte width
9th bit address detection
9th bit even or odd parity
|
CCS 5.105 |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19487
|
|
Posted: Wed Mar 16, 2022 4:37 am |
|
|
No, it doesn't.....
If you read, it says:
Programmable 7-bit or 8-bit byte width
9th bit address detection
9th bit even or odd parity
It only supports the 9th bit for parity or address detection. Not for normal
use for data. The actual transmitted character only supports 7 or 8 bits. |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Wed Mar 16, 2022 4:51 am |
|
|
Thanks Ttelmah
Ok, then I might misunderstand the following, but according to me that is 9 bit protocol.
from datasheet
Quote: | Asynchronous 9-bit UART Address mode. 9th bit: 1 = address, 0 = data |
Setting of UxCON0 to MODE 4
Quote: | Bits 3:0 – MODE[3:0] UART Mode Select (1)
Value
Description
1111 - Reserved
1101
1100 - LIN Host/Client mode (4)
1011 - LIN Client Only mode (4)
1010 - DMX mode (4)
1001 - DALI Control Gear mode (4)
1000 - DALI Control Device mode (4)
0111 - Reserved
0101
0100 - Asynchronous 9-bit UART Address mode. 9th bit: 1 = address, 0 = data
0011 - Asynchronous 8-bit UART mode with 9th bit even parity
0010 - Asynchronous 8-bit UART mode with 9th bit odd parity
0001 - Asynchronous 7-bit UART mode
0000 - Asynchronous 8-bit UART mode |
|
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Wed Mar 16, 2022 4:53 am |
|
|
Ttelmah wrote: | No, it doesn't.....
If you read, it says:
Programmable 7-bit or 8-bit byte width
9th bit address detection
9th bit even or odd parity
It only supports the 9th bit for parity or address detection. Not for normal
use for data. The actual transmitted character only supports 7 or 8 bits. |
If this TRUE, it means I can't use this chip for 9 bit protocol |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9220 Location: Greensville,Ontario
|
|
Posted: Wed Mar 16, 2022 5:15 am |
|
|
You can use the PIC, but NOT the HW UART. You'll have to write your own SW(SoftWare) UART functions for transmit and receive 9 bit data.
I am curious as to what 'device' actually uses 9 data bits.
It may be possible to use 2 bytes from the HW UART by just masking off the top 7 bits of the 2nd byte ??
You might be able to use the 9th bit 'address or data flag' as the real 9th bit data ? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19487
|
|
Posted: Wed Mar 16, 2022 7:58 am |
|
|
It uses the 9th bit just two ways.
First as parity.
Second as a 'flag' to say an address is being sent.
You can't use it to send 9bit data. As Jay says to do this you'd have to
use software. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9220 Location: Greensville,Ontario
|
|
Posted: Wed Mar 16, 2022 8:12 am |
|
|
curious was I...
so I found an article that the SENDER uses the parity bit as the 9th data bit and the Receiver then 'recovers' the 9th data bit by reading the parity bit in the UART registers.
Seems like a LOT of coding when sending/receiving 2 bytes is EASY.
It has to be some 'special' device that sends 9 data bits ?? |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19487
|
|
Posted: Wed Mar 16, 2022 8:50 am |
|
|
Two bytes takes a lot longer.
I must admit I use 9bit data quite often. Things like a display system,
where words with the 9th bit set are the commands, and stuff without
this are the data. For this type of system, the address ability could
potentially be used, but not on the receiver, because of the way this
is handled.
The trick way is to change the UART parity settings according to what
bit is required. However a lot of work and makes the data transmission
a lot more complex....
So a lot depends on how the 9th bit actually needs to be used. Perhaps
a description of what is wanted could be forthcoming?. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9220 Location: Greensville,Ontario
|
|
Posted: Thu Mar 17, 2022 7:12 am |
|
|
re: Quote: | Two bytes takes a lot longer. |
aww, not that much longer, especially at 9600 baud, so maybe 1ms ?
Hmm double the baudrate...it'd take the same time....
Used to fix Teletypes that ran at 300 Baud and my energy system runs at 24 Baud ( yes, twenty four baud) |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19487
|
|
Posted: Thu Mar 17, 2022 10:51 am |
|
|
Slight differences in scales....
Those display controllers use 500Kbaud.When you are sending 50KB of
data per screen Using 10 extra bit times for each transfer becomes very
significant!. |
|
|
alan
Joined: 12 Nov 2012 Posts: 357 Location: South Africa
|
|
Posted: Thu Mar 17, 2022 11:32 pm |
|
|
Answer from CCS. PIC are capable of 9 bit, not yet implemented, so manually setup serial for me
Quote: | Currently the compiler's #use rs232() directive doesn't support setting up the PIC's UART in the Asynchronous Address Mode (9-bit) that the PIC18F04Q40 device family has. It is on our list to add support for that mode to the #use rs232() directive in the future. |
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19487
|
|
Posted: Fri Mar 18, 2022 2:32 am |
|
|
That I'm afraid is not the right answer.
Your chip does not support normal 9bit operation. It does support a 9bit
address mode. It is this that CCS are telling you the compiler does not
support, but even if they implement this, it won't allow you to send 9bit
data.
As already said, it does depend massively on what you actually want 9bit
support 'for'? If (for example), you want this for RS485, for an address
character, then the address mode support will work for this. It won't
though allow you to send 9bit data.
The CCS reply has answered "how can I enable this chip's 9bit mode",
but not "can I send/receive 9bit data with this chip".
The answer to this later question is "you can't". |
|
|
|