|
|
View previous topic :: View next topic |
Author |
Message |
kd5uzz
Joined: 28 May 2006 Posts: 56
|
Serial communications problem |
Posted: Mon May 29, 2006 12:22 am |
|
|
Using compiler ver 3.203
Using 'siow.exe'
Just playing with serial communications.
If I type:
I get:
Quote: | Power On (sertest.c)\0A
` r (à` r (à (à \0D
|
If I disable INT_RDA and instead
Code: |
while (TRUE) {
while(!KBHIT()){
}
a=getc();
printf(a);
}
|
in 'main()' everything I type is echoed correctly.
All my printf's work fine. Ideas?
Code: | #include <16F876a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#define DIAG_LED_ON output_low(PIN_A2)
#define DIAG_LED_OFF output_high(PIN_A2)
#define delay200 delay_ms(200)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
void blink (int times, int dl) {
int i;
for (i=1;i<=times;++i) {
delay_ms(dl);
DIAG_LED_ON;
delay_ms(dl);
DIAG_LED_OFF;
}
}
#INT_RDA
void SerIn(){
disable_interrupts(INT_RDA);
while (kbhit()){
printf(getc());
}
enable_interrupts(INT_RDA);
}
void main() {
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
printf("Power On (sertest.c)\n\r");
while (TRUE){
blink(1,10);
}
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 29, 2006 1:21 am |
|
|
Don't check kbhit in the isr. Don't disable and enable INT_RDA inside
the isr. Just get one character and echo it back. Don't use printf()
with a character variable as the only argument. It doesn't work.
Use putc() instead. Or, if you want to use printf(), then use the "%c"
format string to tell printf that you're giving it a character.
Here is your program re-written with the changes above for int_rda.
Code: |
#include <16F876A.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#int_rda
void rda_isr(void)
{
putc(getc());
}
//========================
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(1);
} |
|
|
|
kd5uzz
Joined: 28 May 2006 Posts: 56
|
|
Posted: Mon May 29, 2006 1:41 am |
|
|
Thanks! I think I understand my mistakes now. |
|
|
DClark
Joined: 19 May 2008 Posts: 1
|
|
Posted: Wed Jul 09, 2008 7:44 pm |
|
|
Would I be able to receive a hex stream (say from a GPS receiver) if I used your code as follows:
Code: | /*********************************************************/
#include <16F876A.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#int_rda
void rda_isr(void)
{
printf("%u ",getc());
}
//========================
void main()
{
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
while(1);
} |
|
|
|
Ttelmah Guest
|
|
Posted: Sat Jul 12, 2008 2:38 am |
|
|
The problem here, is what is sent, versus what arrives.
If (for instance), you receive the character 'A'. This has a value in ASCII, of '65' (decimal). %u, will then print these _two_ characters back. Now, this will work fine, if you just send one character, but if you have a stream of characters:
ABC etc.
Then the transmission becomes:
656667
Twice as many characters (and gets even worse if a character with a value over 99 arrives). The problem then is that the transmission cannot keep up, and receive data will start to be lost.
Generally, simple rule is to do as little as possible in the ISR. Receive your character, and store it into a buffer.If you are retransmitting, and this is going to take longer than the reception, you have to add 'flow control', and tell the transmitter to 'stop', when the buffer approaches being full.
As a 'demo', sending one character in the ISR, is OK. Sending more, is likely to cause problems...
Best Wishes |
|
|
|
|
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
|