| View previous topic :: View next topic   | 
	
	
	
		| Author | 
		Message | 
	
	
		
			sorasit46
 
 
  Joined: 07 May 2007 Posts: 69
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| why! Tx - Rx source code not work | 
			 
			
				 Posted: Mon Dec 06, 2010 5:36 pm     | 
				     | 
			 
			
				
  | 
			 
			
				I've searched, using the search tool and have not found a solution.
 
Please help.
 
Rx code
 
 	  | Code: | 	 		  /* Recieved */
 
#include <12f675.h>
 
#device  adc=10
 
#fuses   INTRC_IO                   
 
#fuses   NOWDT                      
 
#fuses   PUT                        
 
#fuses   NOMCLR                     
 
#fuses   NOBROWNOUT                 
 
#fuses   NOCPD                      
 
#fuses   NOPROTECT                  
 
#use     delay (clock=4000000)
 
#byte    OSCCON = 0x8F
 
 
#define DATA     PIN_A5           // input
 
#define Led      PIN_A4           // output
 
 
int16 rxbit (void)                // check bit cycle
 
      {
 
       int16 x;
 
       x = 0;
 
       while (input (DATA)==1) {x++;}
 
       while (input (DATA)==0) {x++;}
 
       return (x);
 
      }
 
 
void rxpre (void)                 // check preamble
 
     {
 
      int16 x;
 
      char c;
 
      c = 0;
 
      while (c<5)                 // check bit 0
 
            {
 
             x = rxbit ();
 
             if (x>=33 && x<=37) c++; else c = 0;
 
            }
 
      while (x<53) {x = rxbit ();}     // check bit 1           
 
     }
 
 
char rxbyte (void)                // read one byte
 
     {
 
      char x,i;
 
      x = 0;
 
      for (i=0;i<=7;i++)
 
          {
 
           x >>= 1;
 
           if (rxbit ()>53) x |= 0x80;
 
          }
 
      return (x);
 
     }
 
 
char rxrecv (void)
 
     {
 
      char c,x ;                         
 
      rxpre ();c = rxbyte ();x = rxbyte ();
 
      if (c==0x240 ) return (x);  // match         
 
     }
 
 
void main (void)
 
     {
 
      char x;
 
      disable_interrupts(GLOBAL);
 
      setup_adc_ports(NO_ANALOGS);
 
      setup_adc(ADC_OFF);      
 
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 
      setup_timer_1(T1_DISABLED);
 
      setup_adc(ADC_CLOCK_INTERNAL);   
 
      port_a_pullups(true);
 
      set_tris_A(0b11101111);
 
      OSCCON = 0x60;delay_ms(100);
 
      output_low (Led);
 
      while (true)
 
            {
 
             x = rxrecv ();
 
             if (x==0x1)
 
                {
 
                 output_high(Led);delay_ms(100);
 
                 output_low(Led);delay_ms(50);
 
                }
 
            }
 
} | 	  
 
 
Tx code
 
 	  | Code: | 	 		  /* SEND */
 
#include <12f675.h>
 
#fuses INTRC_IO                 
 
#fuses NOWDT                     
 
#fuses PUT                       
 
#fuses NOMCLR                    
 
#fuses NOBROWNOUT                 
 
#fuses NOCPD                      
 
#fuses NOPROTECT                  
 
#use   delay (clock=4000000)
 
#byte  OSCCON = 0x8F
 
 
#define DATA     PIN_A4           // output
 
#define LED      PIN_A0           // output
 
#define Send     PIN_A1           // input
 
 
void tx0 (void)                   // send bit 0
 
     {
 
      output_high (DATA);delay_us (250);
 
      output_low (DATA);delay_us (250);
 
     }
 
 
void tx1 (void)                   // send bit 1
 
     {
 
      output_high (DATA);delay_us (500);
 
      output_low (DATA);delay_us (500);
 
     }
 
 
void txbyte (char x)              // send one byte
 
     {
 
      char i;
 
      for (i=0;i<=7;i++)
 
          {
 
           if ((x & 1)==1) tx1 (); else tx0 ();
 
           x >>= 1;
 
          }
 
     }
 
 
void txsend (char x)
 
     {
 
      txbyte (0);txbyte (0);      // preamble
 
      tx1 ();                     // start
 
      txbyte (0x240);             // code 1
 
      txbyte (x);                 // command
 
      tx0 ();                     // end
 
      output_high (LED);delay_ms (100);
 
      output_low (LED);
 
     }
 
 
void main (void)
 
     {
 
      disable_interrupts(GLOBAL);
 
      setup_adc_ports(NO_ANALOGS);
 
      setup_adc(ADC_OFF);
 
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 
      setup_timer_1(T1_DISABLED);
 
      set_tris_A(0b11101110);                
 
      setup_adc(ADC_CLOCK_INTERNAL);  
 
      port_a_pullups(true);
 
      output_low (LED);
 
      OSCCON = 0x60;
 
      delay_ms(20);
 
      while (true) 
 
            {if (input (Send)==0) {txsend (0x1);delay_ms(500);}}
 
}
 
 | 	  
 
 
Thanks for the help!
  Last edited by sorasit46 on Tue Dec 07, 2010 2:45 am; edited 2 times in total | 
			 
		  | 
	
	
		  | 
	
	
		
			vinniewryan
 
 
  Joined: 29 Jul 2009 Posts: 154 Location: at work 
			
			 
			 
			
			
			
			
			 
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Dec 06, 2010 7:10 pm     | 
				     | 
			 
			
				
  | 
			 
			
				What is your compiler version?
 
What isn't working?
 
Have you tried to run a simple test program using this mcu? _________________ Vinnie Ryan | 
			 
		  | 
	
	
		  | 
	
	
		
			ezflyr
 
 
  Joined: 25 Oct 2010 Posts: 1019 Location: Tewksbury, MA 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Mon Dec 06, 2010 9:15 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Hi,
 
 
First you need to have a strategy to debug stuff like this on your own. It's your project and no one is going to take a greater interest in it than you! Also, you've got all the hardware right in front of you, so you have a significant advantage over a bunch of random folks on an internet forum!
 
 
Having said that, you need a way to find out what is going on inside the PIC. I have found it handy to have a serial LCD that I can connect to a spare pin and use to display diagnostic messages. Sometimes this doesn't always work in time critical sections of the code, but it may be a start. You can also get creative with extra LEDs to help debug what is going on. You also really need to look at how your PIC chips are connected - is there a common GND between them, for instance. Next, take small steps in the problem (for example, can the Tx output a single bit and can it be received by the RX?) and build toward the final solution.
 
 
Frankly, your code needs a lot of work. Most of the setup stuff is unnecessary, as is the use of TRIS (you aren't using Fast IO). I also noticed that you define OSCCON differently in each program - 0x08F and 0x8F. Not sure why you are doing that in the first place, but it is a discrepancy.
 
 
John | 
			 
		  | 
	
	
		  | 
	
	
		
			sorasit46
 
 
  Joined: 07 May 2007 Posts: 69
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Dec 07, 2010 2:57 am     | 
				     | 
			 
			
				
  | 
			 
			
				 	  | ezflyr wrote: | 	 		  Hi,
 
.....
 
Frankly, your code needs a lot of work. Most of the setup stuff is unnecessary, as is the use of TRIS (you aren't using Fast IO). I also noticed that you define OSCCON differently in each program - 0x08F and 0x8F. Not sure why you are doing that in the first place, but it is a discrepancy.
 
 
John | 	  
 
 
Thanks
 
Now! I using Fast IO & define OSCCON  in each program - 0x8F.
 
But It's not work.
 
My compiler is PCWHD IDE 4.057. | 
			 
		  | 
	
	
		  | 
	
	
		
			Wayne_
 
 
  Joined: 10 Oct 2007 Posts: 681
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Dec 07, 2010 3:00 am     | 
				     | 
			 
			
				
  | 
			 
			
				First problem.
 
 
I actually expect this does not even compile, you should post the compiler error messages and warnings if there are any!
 
 
 	  | Code: | 	 		  
 
char rxrecv (void)
 
     {
 
      char c,x ;                         
 
      rxpre ();
 
      c = rxbyte ();
 
      x = rxbyte ();
 
      if (c == 0x240) 
 
            return (x);  // match         
 
     }
 
 | 	  
 
 
I have made it more readable by seperating the lines, Can YOU spot the error ?
 
 
This routine only returns a value if c == 0x240. You need another return(0); statement at the end. | 
			 
		  | 
	
	
		  | 
	
	
		
			Wayne_
 
 
  Joined: 10 Oct 2007 Posts: 681
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Dec 07, 2010 3:18 am     | 
				     | 
			 
			
				
  | 
			 
			
				And another problem  , this is funny  , an honest mistake...
 
 
 	  | Code: | 	 		  
 
char rxrecv (void)
 
     {
 
      char c,x ;                         
 
      rxpre ();c = rxbyte ();x = rxbyte ();
 
      if (c==0x240 ) return (x);  // match         
 
     }
 
 | 	  
 
 
The same problem lies in the tx routine.
 
 
What value is 0x240 ? lol. What size is c ?
 
 
I expect because the error is in both it would not affect the working of your code. | 
			 
		  | 
	
	
		  | 
	
	
		
			sorasit46
 
 
  Joined: 07 May 2007 Posts: 69
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Tue Dec 07, 2010 7:49 pm     | 
				     | 
			 
			
				
  | 
			 
			
				Thanks for the help!
 
I'm trying to recheck. | 
			 
		  | 
	
	
		  | 
	
	
		
			sorasit46
 
 
  Joined: 07 May 2007 Posts: 69
  
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Sat Dec 11, 2010 5:26 am     | 
				     | 
			 
			
				
  | 
			 
			
				My mistake in this code. 
 
 	  | Quote: | 	 		  
 
void rxpre (void)                 // check preamble
 
     {
 
      int16 x;
 
      char c;
 
      c = 0;
 
      while (c<5)                 // check bit 0
 
            {
 
             x = rxbit ();
 
             if (x>=66 && x<=74) c++; else c = 0;
 
            }
 
      while (x<106) {x = rxbit ();}     // check bit 1           
 
     }
 
 
char rxbyte (void)                // read one byte
 
     {
 
      char x,i;
 
      x = 0;
 
      for (i=0;i<=7;i++)
 
          {
 
           x >>= 1;
 
           if (rxbit ()>106) x |= 0x80;
 
          }
 
      return (x);
 
     }
 
 | 	 
  | 
			 
		  | 
	
	
		  | 
	
	
		 |