CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Garbage serial characters

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
maxrate



Joined: 01 Jan 2007
Posts: 38
Location: Mississauga, Ontario, Canada

View user's profile Send private message

Garbage serial characters
PostPosted: Tue Jun 11, 2024 4:55 pm     Reply with quote

Hello - I know garbage characters have been addressed in the past. Perhaps I'm not having much success with searching today.

I have a small red dev board (ebay/Aliexpress) PIC-DIP40. Has 5 buttons, LED's, DS18B820, XTAL, DB9 RS232, LCD header, 2.54mm pitch IO pin breakout header, USB power, 40 pin ZIP socket.

Using a PIC18F46K22 (my go to chip, as I have lot's of them).

Program repeats text over and over again, sending to hardware UART 1 (c6/c7 hardwired on dev board to DB9) Also, repeats same text over and over on hardware UART 2 (d6/d7) - needs external TTL to USB serial modules.

PORT1 - No issues with text flying across the DB9 to my Windows computer running TeraTerm.

PORT2 - Garbage/Noise on approx 5% of the characters, usually grouped together.

I've tried multiple modules, pull-up/pull-down resistors/etc. I find different modules give different levels of 'noise'.

Both streams are going to same PC - tried many different USB<>TTL devices. -Varying levels of noise-

Any suggestions?

MAIN.C

Code:
#include <main.h>

#INT_TIMER0
void  TIMER0_isr(void)
{

}

#INT_TIMER1
void  TIMER1_isr(void)
{

}

#INT_EXT
void  EXT_isr(void) // Interrupt #1 = PIN B0 on the PIC18F46K22 40 pin DIP chip
{
   
}

#INT_RDA
void  RDA_isr(void)
{

}

#INT_RDA2
void  RDA2_isr(void)
{
   
}

void main()
{
   port_b_pullups(0xFF);
   setup_adc_ports(sAN5, VSS_VDD);
   setup_adc(ADC_CLOCK_INTERNAL | ADC_TAD_MUL_20);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);      //32.7 ms overflow
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);      //65.5 ms overflow


   enable_interrupts(INT_TIMER0);
   enable_interrupts(INT_TIMER1);
   enable_interrupts(INT_EXT);
   enable_interrupts(INT_RDA);
   enable_interrupts(INT_RDA2);
   enable_interrupts(GLOBAL);


   while(TRUE)
   {

   fprintf(PORT2,"The quick brown fox jumps over the lazy dog. ");
   delay_ms(30);
   fprintf(PORT1,"The quick brown fox jumps over the lazy dog. ");
   delay_ms(30);
           
   }

}


MAIN.H

Code:
#include <18F46K22.h>
#device ADC=8

#FUSES NOWDT                    //No Watch Dog Timer

#use delay(crystal=32MHz)
#use STANDARD_IO( B )
#define TX1   PIN_C6
#define RX1   PIN_C7
#define LED_D0   PIN_D0
#define TX2   PIN_D6
#define RX2   PIN_D7
#define BATTERY   PIN_E0

#use rs232(baud=115200,parity=N,xmit=TX1,rcv=RX1,bits=8,stream=PORT1)
#use rs232(baud=115200,parity=N,xmit=TX2,rcv=TX2,bits=8,stream=PORT2)

#define LED PIN_D0
#define DELAY 200
maxrate



Joined: 01 Jan 2007
Posts: 38
Location: Mississauga, Ontario, Canada

View user's profile Send private message

PostPosted: Tue Jun 11, 2024 4:58 pm     Reply with quote

Neglected to mention, when I rid the code of all the interrupts/etc, things run well. What I'm specifically puzzled about is why only PORT2 giving the trouble and not PORT1...
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Wed Jun 12, 2024 1:38 am     Reply with quote

One warning. You must _NEVER_ have an iINT_RDA (or RDA2), enabled,
that does not read the received character in it. Doing so will cause UART
problems if a character is seen. Do not do this.....

However the reason for your problem, is that you are not using the UART
for PORT2. Your chip does not have PPS. So UART2 is on pins B6 & B7.
Your second stream is setup as a _software_ UART. Won't generate RDA2,
and transmission is all done by software timing. The timer interrupts will
therefore interfere with the bit timing. Result corrupted characters.

You must learn to use the pins that the hardware supports. Even on PPS
chips, there are restrictions on what devices can go where and you must
always refer to the data sheet when making your connections.
You could probably get it to work by using the DISABLE_INTS option
in your setup for PORT2, but you will still have problems in the future
if you want to receive on this port.
Fix your hardware and use the hardware pins for UART2.
temtronic



Joined: 01 Jul 2010
Posts: 9243
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Wed Jun 12, 2024 4:56 am     Reply with quote

hmm, I'm pretty sure it's the ICSP that's on B6,B7 with the 2nd UART on D6,D7 but need to check the datasheet...AFTER I make coffee.
Neighbour woke me up at 5:30 today AND my PC can't see the router or printer again..even though I have internet access...

some days I'd like to go back to the PIC16C84 !
asmallri



Joined: 12 Aug 2004
Posts: 1635
Location: Perth, Australia

View user's profile Send private message Send e-mail Visit poster's website

PostPosted: Wed Jun 12, 2024 5:51 am     Reply with quote

maxrate wrote:
Neglected to mention, when I rid the code of all the interrupts/etc, things run well. What I'm specifically puzzled about is why only PORT2 giving the trouble and not PORT1...


You have configured PORT2 to use the same TX pin for both transmit and receive.
_________________
Regards, Andrew

http://www.brushelectronics.com/software
Home of Ethernet, SD card and Encrypted Serial Bootloaders for PICs!!
maxrate



Joined: 01 Jan 2007
Posts: 38
Location: Mississauga, Ontario, Canada

View user's profile Send private message

PostPosted: Wed Jun 12, 2024 5:58 am     Reply with quote

Hi there Ttelmah and Temtronic

Egg on my face! I was convinced I was using the hardware UARTS. I certainly checked out the datasheet before hand - I've seem to have made two errors: Got my "B's and D's" crossed in my mind - oops. Also, I used the CCS wizard to generate the code and I made a terrible assumption that it would populate the values correctly based off the MCU selection given the values for the first UART were spot on. Data sheet was referenced before I launched the wizard to determine hardware UART1 and UART2 pins, also used to determine what pin the first interrupt was (RB0 in the case of the PIC18F46K22) as evidenced in the comments for INT0 interrupt routine.

Ttelmah, Temtronic, PCM Programmer and a few others - always great of you to offer assistance.

I am aware about the mandatory catching of characters on the input side of things. I note that when I remove the timer interrupt code things clear up. I thought it was behaving as a software uart, but was 'certain' I was using hardware.

Many thanks!!! Not triple checking wasted everyone's time - many apologies.

-Shaun
dyeatman



Joined: 06 Sep 2003
Posts: 1934
Location: Norman, OK

View user's profile Send private message

PostPosted: Wed Jun 12, 2024 7:25 am     Reply with quote

FWIW, using UART1 and UART2 specifies the hardware pins and
simplifies the RS232 setup (Nov 2021 man page 193-194).

Since bits and parity are at defaults this reduces the declarations to:
#use rs232(UART1, baud=115200,stream=PORT1)
#use rs232(UART2, baud=115200,stream=PORT2)
_________________
Google and Forum Search are some of your best tools!!!!
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Wed Jun 12, 2024 8:12 am     Reply with quote

Though one should really also add 'ERRORS', otherwise if you get an
error condition the UART can hang....
maxrate



Joined: 01 Jan 2007
Posts: 38
Location: Mississauga, Ontario, Canada

View user's profile Send private message

PostPosted: Wed Jun 12, 2024 11:23 am     Reply with quote

Thanks all for the tips. Excellent!
dyeatman



Joined: 06 Sep 2003
Posts: 1934
Location: Norman, OK

View user's profile Send private message

PostPosted: Wed Jun 12, 2024 12:36 pm     Reply with quote

Ttelmah, I always use ERRORS so I don't know why I left it off.
Thanks for the catch!

#use rs232(UART1, baud=115200,stream=PORT1, ERRORS)
#use rs232(UART2, baud=115200,stream=PORT2, ERRORS)
_________________
Google and Forum Search are some of your best tools!!!!
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Thu Jun 13, 2024 1:05 am     Reply with quote

Well said. Smile

It really is 'sticky' status. On PIC12/16/18, if using a hardware UART,
you should always have ERRORS in the UART definition, unless you are
adding your own error handling. On the UART, errors must be handled....

It changes on the PIC24/30/33, where really you really need to use an error
interrupt.

It is easy to miss it. Personally I wish that CCS would change the default
so that it normally adds the error handler, and have instead a 'NOERRORS'
setting to turn this off. Would avoid quite a few problems. Very Happy
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group