![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
16LF73 Guest
|
RS232 problem |
Posted: Tue Oct 07, 2008 9:23 am |
|
|
Chip: 16LF76 CCS version: 3.1110
Code: | #use Delay(Clock=153600,RESTART_WDT)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=n,bits=8,ERRORS) |
I use RS232 to interface an OEM module. Timer1 interrupt is used for some background tasks (such as blinking LEDs etc)
Because the clock is slow (153.6K), I have to short the Timer1 routine to less than 2 ms, otherwise, PIC constantly misses RS232 input data (the received data is garbled). Even when Timer1 rountine is less than 1 ms, PIC still sometimes (about 2%) misses RS232 data.
Any suggestions?
PIC uses Timer0, right? Could I change the frequency of timer0 interrupt?
Regards, |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah Guest
|
|
Posted: Tue Oct 07, 2008 10:23 am |
|
|
Seriously, at this clock, the system executes just 38400 instructions per second. 9600bps, means a character can arrive every 1/960th second, or every 40 instructions. The way you talk about the timer being used in the 'background', suggests you are using an interrupt. If so, 'no way' is it going to work reliably. The interrupt handler has a typical overhead of nearly 60 instructions...
Don't implement interrupts. Instead have a fast loop running that tests the RS232 received flag (if kbhit), receiving a character if one is waiting, then tests the timer interrupt flag, and services this if it has set. Clear it, and loop as fast as possible. However even doing this, if data arrives at high speed, and the timer routines take more than a very few instructions, expect to lose data.
You just don't have enough clock speed to do the jobs you want.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
16LF73 Guest
|
RS232 problem |
Posted: Tue Oct 07, 2008 1:18 pm |
|
|
Ttelmath, Thanks for your reply.
Yes. Timer1 is using an interrupt (every 200 ms).
RS232 is using "both interrupt and loop" ------- when received the first char, PIC goes to RS232 ISR rountine, then tests (LOOP) the RS232 receiving flag to receive whole message. after received whole message, it exits RS232 ISR. |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah Guest
|
|
Posted: Tue Oct 07, 2008 2:03 pm |
|
|
At your clock rate, it is going to take more than 1mSec, to even get into, and out of the interrupt routine. Even with the interrupt routine _itself_ being less than 1mSec, the total time in the ISR, is going to be perhaps 2.5mSec. It then takes moe than half a mSec to get into the RS232 ISR. This adds up to more than the total buffering available for the chip, hence data is lost. Hence my suggestion to not involve interrupt handling at all, but stay out in the 'main', and poll the interrupt bits. This is potentially much faster.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|