Page 1 of 1

PIC18F46K22 UART Interrupt problem

Posted: Tue Feb 02, 2021 7:44 pm
by Clive44
Hi
I'm using a PIC18F46K22 to send and receive RS232 with Flowcode 8.
I have a compiler problem on receive when trying to use the circular buffer.
After failing to find the problem on my own code, I have downloaded UART_test.fcfx from this forum (published by chipfryer on the 9th April 2020) and get exactly the same compiler error.

C:\Program Files (x86)\Flowcode\Common\Compilers\pic\batch\pic_xc8_comp.bat 18F46K22 "C:\FLOWCO~1\" "UART_Test"

C:\FLOWCO~1>C:\PROGRA~2\Flowcode\Common\COMPIL~1\pic\batch\..\bin\xc8.exe --chip=18F46K22 "UART_Test.c" --MSGDISABLE=359,1273,1388 --FLOAT=32 --DOUBLE=32
Microchip MPLAB XC8 C Compiler (Free Mode) V1.45
Build date: Nov 15 2017
Part Support Version: 1.45
Copyright (C) 2017 Microchip Technology Inc.
License type: Node Configuration

using updated 32-bit floating-point libraries; improved accuracy might increase code size
C:\ProgramData\MatrixTSL\FlowcodeV8\CAL\PIC\PIC_CAL_Delay.c: 85: non-reentrant function "_delay_us" appears in multiple call graphs and has been duplicated by the compiler
C:\ProgramData\MatrixTSL\FlowcodeV8\CAL\PIC\PIC_CAL_Delay.c: 105: non-reentrant function "_delay_ms" appears in multiple call graphs and has been duplicated by the compiler
UART_Test.c: 7846: non-reentrant function "_FCD_04071_LCD__Cursor" appears in multiple call graphs and has been duplicated by the compiler
UART_Test.c: 8006: non-reentrant function "_FCD_04071_LCD__RawSend" appears in multiple call graphs and has been duplicated by the compiler
. . .


Memory Summary:
Program space used A34h ( 2612) of F000h bytes ( 4.3%)
Data space used 62h ( 98) of F37h bytes ( 2.5%)
Configuration bits used 7h ( 7) of 7h words (100.0%)
EEPROM space used 0h ( 0) of 400h bytes ( 0.0%)
ID Location space used 0h ( 0) of 8h bytes ( 0.0%)
Data stack space used 0h ( 0) of EB4h bytes ( 0.0%)


Whatever I've tried I cannot get rid of the 'non reentrant' messages above.

Any help appreciated.

Thanks. Clive

Re: PIC18F46K22 UART Interrupt problem

Posted: Tue Feb 02, 2021 8:15 pm
by kersing
Are you calling display functions in the interrupt routine? If so, remove them, interrupts should be short and not use display components as those are too slow.
In the interrupt set a flag and/or add any received data to a circular buffer and handle that in the main program code.

Re: PIC18F46K22 UART Interrupt problem

Posted: Tue Feb 02, 2021 8:30 pm
by Clive44
Hi kersing

I have removed the display functions in the interrupt routine and now it compliles without errors.
Looks like you've solved it - thank you
I'll double check that everything is working OK tomorrow, but this is a big step forwards.

Cheers

Clive

Re: PIC18F46K22 UART Interrupt problem

Posted: Wed Feb 03, 2021 6:34 pm
by Clive44
Hi kersing

Although the program compiles Ok now, I cannot get the receive interrupt to work.
The interrupt routine just sets a Flag "RxFlag = 1".

However, when running the program in a loop and sending RS232 data to the PIC (from a terminal program on the PC via a RS232 to USB dongle) RxFlag always stays at 0.
I've tried setting the UART to 'channel1' and 'software'. No difference.

I can send and receive RS232 to the PC OK, just cannot get the interrupt to work.

Any ideas?

Regards

Clive

Re: PIC18F46K22 UART Interrupt problem

Posted: Wed Feb 03, 2021 6:55 pm
by medelec35
Hi Clive,
Can you post your flowchart so we can see if we can spot any issues?

Re: PIC18F46K22 UART Interrupt problem

Posted: Wed Feb 03, 2021 7:28 pm
by Clive44
Hi Martin

Flowcode file attached.

Background info.
One PCB (remote) with 4 buttons.
RS232 to this PCB with 4 LEDs.
Message format is "MBx<carriage return><line feed>
Where MB stands for 'Message' 'Buttons' and x is the button data from 0 to 15 to show which buttons have been pressed.
What I'm trying to do is detect 'MB' in the circular buffer, then pull the next byte for the button info, then check we've got carriage return, line feed to prove that this is a valid message.

Regards

Clive