  | 
	  | 
		 
	 
	
		| View previous topic :: View next topic   | 
	 
	
	
		| Author | 
		Message | 
	 
	
		
			ze.vana
 
 
  Joined: 11 Jun 2011 Posts: 15
  
			
			 
			 
			 
			
			
			
			
			
			
  
		  | 
		
			
				| PIC to PIC Display data transfer | 
			 
			
				 Posted: Sat May 26, 2012 6:44 am     | 
				     | 
			 
			
				
  | 
			 
			
				Hi people      
 
that is a simple example of data transfer PIC to PIC using small and cheap PICs.  Maybe this would be useful for beginners like me!
 
send.c
 
 	  | Code: | 	 		  
 
#include <16f628a.h>
 
#fuses INTRC_IO, NOLVP, NOWDT, PUT, BROWNOUT 
 
#use delay (clock=4M)
 
#use rs232(baud=9600,XMIT=PIN_B2,RCV=PIN_B1,bits=8) 
 
 
//#include "ds18b20.c"
 
byte send[3];
 
#define sreset (pin_b0)//RB0 ->- PIN1 MLCR 16F876 (resets display)
 
int8 div;
 
int8 temp=15;//temperature
 
int8 hrs=7,min=22;
 
 
void send_dat(void)
 
{
 
  int i;
 
  for (i=0; i<3; ++i)//1° RODA O I 10 VEZES
 
  {
 
  putc(send[i]);
 
  }
 
}
 
 
void main(void)
 
{ 
 
  int1 powerup;
 
  set_tris_a(0x00);   //DQ PIN_a4 
 
  set_tris_b(0b00111000); //RB1 RB2  Rx/tx) / RB0 ->- PIN1 MLCR 16F876
 
  output_low sreset;div=0;
 
  powerup=false;
 
 
  while(true)
 
   {
 
   //   ds1307_get_time(hrs,min,sec); 
 
   output_toggle(pin_b3);//it's working!     
 
   send[0]=hrs; send[1]=min; send[2]=temp;
 
   div++;
 
   if(!powerup && div >=10) { powerup=true; output_high sreset;} //RB0 ->- PIN1 MLCR 16F876
 
   if(powerup && div >10) {send_dat();  div=0; }
 
   }
 
  }
 
//RESET is to synchronize data transfer during initialization.
 
///////////////////////////////////////////////////////////////
 
// Put a 10K resistor from pin1 F876 to VDD 5V      //
 
// to VDD                                                            //
 
//  ----------                     ---------          -------  //
 
// |      RB0  |6-----------1|MCLR    B0|- A| DIS-  | //
 
// |  F628     |                   |  F876   B1|- B|PLAY  | //
 
// |    X RB2|8----------18|C7 RX    B2|- C|         | //
 
// |              |  TXD->        |           B3|- D|         | // 
 
///////////////////////////////////////////////////////////////
 
 | 	  
 
Receive.c
 
 	  | Code: | 	 		  
 
#include <16F876a.h>
 
#device ADC=10
 
#fuses XT, NOLVP, NOWDT, PUT, BROWNOUT
 
#use delay (clock=4M)
 
#use rs232(baud=9600,XMIT=PIN_C6,RCV=PIN_C7,bits=8) 
 
 
int16 div;
 
int hrs,min;
 
int hor4,hor3,hor2,hor1;
 
int temp;
 
int var2=0, var1=0;
 
int8 scan,div2;
 
#include "display.c"
 
byte receiv[3];
 
 
#INT_RDA
 
void rda_isr()
 
{
 
  int i;
 
  for (i=0; i<3; ++i)//receive 3 datas
 
  {                 //0 is the first
 
   receiv[i]=getc();
 
  }
 
hrs=receiv[0]; min=receiv[1]; temp=receiv[2]; 
 
}
 
 
void select(void)
 
{
 
if (div <4000 )//show hours
 
   {
 
   dig4=hor4;//dez hora
 
   dig3=hor3;//unid hora
 
   dig2=hor2;//dez minuto
 
   dig1=hor1;//unid minuto
 
   }
 
if(div >2000 )//show degrees
 
  {
 
              dig4=var2;    //dezena de graus
 
              dig3=var1;   //unidade de graus
 
              dig2=10;    //grau Simbolo
 
              dig1=11;//11= zero off
 
   }
 
div++;
 
if(div >4000)  div=0;
 
}
 
 
void convert(int valor)//temperature
 
     {
 
     var2=valor/10;            // 45 / 10=4
 
     var1=valor -(var2 * 10); // 45 -(4 x 10)=5  
 
     }
 
 
void main()
 
{
 
 enable_interrupts(global);
 
 enable_interrupts(INT_rda);
 
 set_tris_a(0x01);
 
 set_tris_b(0x00);
 
 set_tris_C(0b10000000 );      
 
 div=0; div2=0; scan=100; //display time -> delay_ms(scan)
 
 
while (true)
 
  {
 
  hor4=hrs/10;             //ex.: 23 /10      =2
 
  hor3=hrs -(hor4 * 10);  //      23 -(2 x 10)=3 
 
  hor2=min/10;           // ex.:  45 / 10     =4
 
  hor1=min -(hor2 * 10);//      45 -(4 x 10)  =5                 
 
  convert(temp);
 
  mostra();//Display
 
  select();
 
  }
 
}
 
 | 	  
 
Display.c
 
 	  | Code: | 	 		  
 
////////////////////////////// display moto
 
//display PIC 16f876a       // I use it on my Byke
 
//B0 A         C0 K1        // to show time and degrees
 
//B1 B         C1 K2        //
 
//B2 C         D2 K3        //
 
//B3 D         D3 K4        //
 
//B4 E                      //
 
//B5 F                      //
 
//B6 G   B7 NOT USED        //
 
//////////////////////////////
 
 
 struct cont_pins
 
{
 
int data:4;//digitos
 
} cont;
 
#byte cont = 7   // 7 is the portc address.
 
 
//---------------------------------------
 
byte CONST seg[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0b1100011,0b0000000,0b1000000};
 
int dig4=0,dig3=0,dig2=0,dig1=0;  //     10=degree symbol  11=zero_off 12=negative signal
 
 
void mostra(void)              
 
    {
 
 output_b(seg[dig4]);                    
 
 cont.data=0b1110;//1  k4,k3,k2,k1              
 
   delay_us(scan);
 
 cont.data=0b1111; //Apaga display.
 
   delay_us(10);
 
 output_b(seg[dig3]);
 
 cont.data=0b1101;  //2
 
   delay_us(scan);
 
 cont.data=0b1111; //Apaga display.
 
   delay_us(scan);
 
output_b(seg[dig2]);
 
 cont.data=0b1011;//4
 
  delay_us(scan);
 
 cont.data=0b1111; //Apaga display.
 
  delay_us(scan);
 
 output_b(seg[dig1]);
 
 cont.data=0b0111;//8
 
  delay_us(scan);
 
 cont.data=0b1111; //Apaga display.
 
 delay_us(scan);;
 
 } | 	 
  | 
			 
		  | 
	 
	
		  | 
	 
	
		
			dyeatman
 
 
  Joined: 06 Sep 2003 Posts: 1968 Location: Norman, OK 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				 | 
			 
			
				 Posted: Sat May 26, 2012 8:15 am     | 
				     | 
			 
			
				
  | 
			 
			
				Thank you ze, I think this can be helpful to some of the upcoming "newbies".  
 
 
However, a couple of suggestions:
 
1. Add comments at the start of the program with a description of how the 
 
PICS are connected and any other useful info.
 
 
2. Clean up and post in the Code Library for everyone.
 
 
These types of contributions are a help to all. Thanks for your efforts! _________________ Google and Forum Search are some of your best tools!!!! | 
			 
		  | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
	 
	    
	   | 
	
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
  
		 |