| 
	
	|  |  |  
	
		| View previous topic :: View next topic |  
		| Author | Message |  
		| nurquhar 
 
 
 Joined: 05 Aug 2006
 Posts: 149
 Location: Redditch, UK
 
 
			      
 
 | 
			
				| Why does #use rs232 ENABLE=PIN not work with puts or printf |  
				|  Posted: Sun Oct 08, 2006 1:08 am |   |  
				| 
 |  
				| I have an odd problem with the way puts and printf are working when using the #use rs232 ENABLE feature.  Basically I can see the output on Hyperterminal from the putc() but a string sent with puts() or printf() sends blanks.  I am using SP485REN chip with B0 connected to the DE and /RE inputs. 
 The following prog compiled with 3.249 gives the following output.
 
 
  	  | Code: |  	  | // CPU Clock Freq
 #define   FOSC   20000000
 #define BAUDRT   9600
 
 #include <16F876A.h>
 #include <stdio.h>
 
 #fuses HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
 #use delay(clock=FOSC)
 #use rs232 (baud=BAUDRT, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS=8, ENABLE=PIN_B0)
 
 
 void main()
 {
 unsigned int ch ;
 
 putc('O') ;
 putc('k') ;
 putc('\r') ;
 putc('\n') ;
 
 puts("Hello from Puts") ;
 
 putc('H') ;
 putc('e') ;
 putc('l') ;
 putc('l') ;
 putc('o') ;
 putc('\r') ;
 putc('\n') ;
 
 while(1) {
 if (kbhit()) {
 ch = getc() ;
 putc(ch) ;
 if (ch == 0x31) {
 puts("Puts a long string to test the output") ;
 putc('N') ;
 putc('o') ;
 putc(' ') ;
 putc('1') ;
 putc('\r') ;
 putc('\n') ;
 }
 }
 }
 }
 
 
 | 
 
 The output on the terminal with me typing 1,2,3
 
 
  	  | Quote: |  	  | Ok ts
 Hello
 1ut
 No 1
 23
 | 
 
 I thought puts()/printf used putc at the bottom level ?  However it seems to be doing the enable in a different way.
 
 Any ideas ?
 |  |  
		|  |  
		| nurquhar 
 
 
 Joined: 05 Aug 2006
 Posts: 149
 Location: Redditch, UK
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Sun Oct 08, 2006 1:29 am |   |  
				| 
 |  
				| I made a small mod and used my own puts which works ! Whats wrong with CCS version ? 
 
 
  	  | Code: |  	  | // CPU Clock Freq #define   FOSC   20000000
 #define BAUDRT   9600
 
 #include <16F876A.h>
 #include <stdio.h>
 
 #fuses HS,NOWDT,PUT,NOPROTECT,NOBROWNOUT,NOLVP,NOCPD,NOWRT
 #use delay(clock=FOSC)
 #use rs232 (baud=BAUDRT, xmit=PIN_C6, rcv=PIN_C7, PARITY=N, BITS=8, ENABLE=PIN_B0)
 
 char buf[40] ;
 
 void myputs(char *str)
 {
 for(; *str != 0 ; str++) {
 putc(*str) ;
 }
 putc('\r') ;
 putc('\n') ;
 }
 
 void main()
 {
 unsigned int ch ;
 
 putc('O') ;
 putc('k') ;
 putc('\r') ;
 putc('\n') ;
 
 //   puts("Hello from Puts") ;
 strcpy(buf, "Hello from Puts") ;
 myputs(buf) ;
 
 putc('H') ;
 putc('e') ;
 putc('l') ;
 putc('l') ;
 putc('o') ;
 putc('\r') ;
 putc('\n') ;
 
 while(1) {
 if (kbhit()) {
 ch = getc() ;
 putc(ch) ;
 if (ch == 0x31) {
 //            puts("Puts a long string to test the output") ;
 strcpy(buf, "Puts a long string to test the output") ;
 myputs(buf) ;
 
 putc('N') ;
 putc('o') ;
 putc(' ') ;
 putc('1') ;
 putc('\r') ;
 putc('\n') ;
 }
 }
 }
 }
 | 
 
 Output for 1,2,3
 
 
  	  | Quote: |  	  | Ok Hello from Puts
 Hello
 1Puts a long string to test the output
 No 1
 23
 | 
 [/code]
 |  |  
		|  |  
		| PCM programmer 
 
 
 Joined: 06 Sep 2003
 Posts: 21708
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Oct 08, 2006 2:16 pm |   |  
				| 
 |  
				| puts() is a macro that calls printf.   Here's the macro definition from stdlib.h.
 
  	  | Code: |  	  | #define puts(s) {printf(s); putchar(13); putchar(10);} | 
 Here's the stdlib.h file location:    c:\program files\picc\drivers\stdio.h
 
 So the problem is in printf.
 
 Here's a report in April 2005 of the same problem.
 http://www.ccsinfo.com/forum/viewtopic.php?t=22421
 
 It appears that 'enable' only works with putc().   So one way to do
 a work-around would be to use the re-direction feature of the CCS
 printf() function, and send the output to putc.    Example:
 
 
  	  | Code: |  	  | #include <16F877.h>
 #fuses XT, NOWDT, NOPROTECT, PUT, BROWNOUT, NOLVP
 #use delay(clock=4000000)
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, Enable=PIN_B0, ERRORS)
 
 my_putc(char c)
 {
 putc(c);
 }
 
 //===================================
 void main()
 {
 printf(my_putc, "Hello World");
 
 while(1);
 }
 | 
 I looked at the .LST file, and this does work.
 |  |  
		|  |  
		| nurquhar 
 
 
 Joined: 05 Aug 2006
 Posts: 149
 Location: Redditch, UK
 
 
			      
 
 | 
			
				|  |  
				|  Posted: Mon Oct 09, 2006 12:52 am |   |  
				| 
 |  
				| Dear PCM 
 Thanks for confirming what I suspected.  ie its a long standing CCS bug.  Re-directing through "myputc" with printf(myputc, "xxx") is certanily a good work around, however it would be much better if CCS fixed it.  I am guesing the fix will consume another valuable stack level.  Especialy if you only have an level 8 stack to start with !
 
 I'll post it as bug to CCS, you never know if may get fixed by April 2007.
 |  |  
		|  |  
		|  |  
  
	| 
 
 | 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
 
 |