|
|
View previous topic :: View next topic |
Author |
Message |
samg
Joined: 05 Feb 2004 Posts: 2 Location: Colorado Springs, CO
|
printf delays in transmiting buffer |
Posted: Thu Feb 05, 2004 11:33 pm |
|
|
Can anyone tell me what the delay that the compiler uses for when the hardware RS232 buffer is full during transmitting.
I believe that the delay is longer than 15 milliseconds at 9600 baud.
The project uses a 20Mhz clock.
I am working on a project where a delay in the transmitting can cause probelms. I need to have the bytes transmit as fast as possible.
Should I be using putc instead of printf? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Fri Feb 06, 2004 12:03 am |
|
|
It doesn't do any delay. You do have to wait until a character
has been transmitted from the hardware UART, which frees up
the TXREG so it can accept the next character. The wait time
required will be:
Code: | # of bits/char 10
-------------- = ------- = 1.04 ms
baud rate 9600 |
Code: | 0000 00302 .................... printf("ABCDEFG");
0020 01A1 00303 CLRF 21
0021 0821 00304 MOVF 21,W
0022 2004 00305 CALL 004 // Fetch char from const string
0023 0AA1 00306 INCF 21,F // Increment the char count
0024 00F7 00307 MOVWF 77
0025 0877 00308 MOVF 77,W
0026 1E0C 00309 BTFSS 0C.4 // Is the transmitter ready ?
0027 2826 00310 GOTO 026 // If not, wait in a tight loop
0028 0099 00311 MOVWF 19 // Then send the char
0029 3007 00312 MOVLW 07 // Get the string length
002A 0221 00313 SUBWF 21,W // Compare it to # of chars sent
002B 1D03 00314 BTFSS 03.2 // Jump if we're done
002C 2821 00315 GOTO 021 // If not done, jump to top of loop
// This code fetches a char from the const string.
0004 100A @const bcf 0xA,0x0
0005 108A bcf 0xA,0x1
0006 110A bcf 0xA,0x2
0007 0782 addwf 0x2
0008 3441 retlw 0x41 // 'A'
0009 3442 retlw 0x42 // 'B'
000A 3443 retlw 0x43 // 'C'
000B 3444 retlw 0x44 // 'D'
000C 3445 retlw 0x45 // 'E'
000D 3446 retlw 0x46 // 'F'
000E 3447 retlw 0x47 // 'G'
000F 3400 retlw 0x0
|
|
|
|
samg
Joined: 05 Feb 2004 Posts: 2 Location: Colorado Springs, CO
|
I found my Bug, Thanks |
Posted: Fri Feb 06, 2004 12:53 am |
|
|
Using the C/ASM code like you showed, I found that it was a goof up in the printf I was using.
printf ("\x0F\x34\x00\xF0\x04");
I needed to push out some binary values and was looking for a quick way to push out binary sequences without taking up RAM.
The ASM code will show that the string length is 2 bytes.
The NULL in the center ends the string. (NULLs can't be printed in printf! Duh!)
changed to:
int CONST sequence_1 [5] = {0x0F,0x34,0x00,0xF0,0x04};
for (i=0;i<5;i++) {
putc(sequence_1[i]);
}
I need to do this because I have a bunch of sequences and
don't want to use up RAM storing them. And I know that
const byte arrays cannot pointed to so a generic function is out.
The above seems the most efficient.
Thanks for the help! |
|
|
Ttelmah Guest
|
Re: I found my Bug, Thanks |
Posted: Fri Feb 06, 2004 11:43 am |
|
|
samg wrote: | Using the C/ASM code like you showed, I found that it was a goof up in the printf I was using.
printf ("\x0F\x34\x00\xF0\x04");
I needed to push out some binary values and was looking for a quick way to push out binary sequences without taking up RAM.
The ASM code will show that the string length is 2 bytes.
The NULL in the center ends the string. (NULLs can't be printed in printf! Duh!)
changed to:
int CONST sequence_1 [5] = {0x0F,0x34,0x00,0xF0,0x04};
for (i=0;i<5;i++) {
putc(sequence_1[i]);
}
I need to do this because I have a bunch of sequences and
don't want to use up RAM storing them. And I know that
const byte arrays cannot pointed to so a generic function is out.
The above seems the most efficient.
Thanks for the help! |
Worth pointing out that CCS, has a 'shortcut', that may allow you to use a suitable 'generic' function. Any 'putc' type function, that accepts a single integer, can be called using the syntax:
putc("Constant string");
and the function will be called once for each character in the 'Constant string'. This works with your own functions, as well as CCS ones.
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
|