Hi Community, i have a big problem. I want to write something like a ECHO - Funktion. That means i recive a char an send it back like in this source ...
void serial_int (void) interrupt 4 using 3 { static char chr = '\0'; if (RI == 1) { chr = SBUF; RI = 0; TI = 1; TL0 = 0xFF; } else if (TI == 1) { TI = 0; if (chr != '\0') { if (chr == '\r') chr = '\n'; SBUF = chr; while(TI == 0); TL0 = 0xFF; chr = '\0'; } } }
You need to implement buffers for the input/output stream. Take a look to: Getting Started User's Guide (GS51.PDF), Chapter 9, Using On-Chip Peripherals, Serial Interface.
thank you very much it works :)
while(TI == 0); Please don't use statements like that inside an interrupt. If you do, it will start a resonance cascade and the entire universe will implode. Really.
Is there a better way to wait until; something should happen. For example wait until TI is high.
Ti generates an interrupt, handle it there. Erik
Hi Community, i am back with a new problem. The funktion is to slow, is there a better way for this source :
static void com_isr (void) interrupt 4 using 1 { unsigned char c; if (TI != 0) { TI = 0; // clear interrupt request flag if (ostart != oend) { // if characters in buffer and SBUF = outbuf[ostart++ & (OLEN-1)]; // transmit character sendfull = 0; // clear 'sendfull' flag } else { // if all characters transmitted sendactive = 0; // clear 'sendactive' } } if (RI) { if(echo=='1') { putbuf(c); } RI = 0; if (istart + ILEN != iend) { inbuf[iend++ & (ILEN-1)] = c; } } }
void putbuf (char c) { if (!sendfull) { // transmit only if buffer not full if (!sendactive) { // if transmitter not active: sendactive = 1; // transfer first character direct SBUF = c; // to SBUF to start transmission } else { ES = 0; // disable serial interrupts during buffer update outbuf[oend++ & (OLEN-1)] = c; // put char to transmission buffer if (((oend ^ ostart) & (OLEN-1)) == 0) { sendfull = 1; } // set flag if buffer is full ES = 1; // enable serial interrupts again } } }
Have you looked at the examples in the downloads section? Make sure all your indexes & flags are in DATA space.
Yes , i have looked at this example. But it's to slow too. Isn't there any way to do this faster. I thing its the time i am waiting for the TI.
"I thing its the time i am waiting for the TI" You aren't waiting for TI. When TI goes true the ISR is called. Are you just trying to echo characters back out of the UART?
static void com_isr (void) interrupt 4 using 1 { .... putbuf(c); .... } void putbuf (char c) using 0 { The default "using 0" added to show the problem. Erik
static void com_isr (void) interrupt 4 using 1 { .... putbuf(c); .... } void putbuf (char c) using 0 {
View all questions in Keil forum