Tufican
 
 
  Joined: 23 Feb 2011 Posts: 10 Location: Turkey- izmir 
			
			 
			 
			
			
			
			
			
			
			
  
		  | 
		
			
				| Pwm decoder from rc transmitter | 
			 
			
				 Posted: Thu Jan 26, 2012 5:37 am     | 
				     | 
			 
			
				
  | 
			 
			
				I write this code. It reads 4 pwm signals from a remote controller from 1 pin with 4 to 1 multiplexer.
 
 
You can use this program for your quadcopter multicopter helicopter or plane.
 
 
You can add imu sensors and another sensors.
 
The program is working good and output data is coming from uart.
 
I use 74153 mux.
 
Mux selector pins is pin_d0 and pin_d1
 
and pic 18f4580 8mhz internal with 4xpll 32mhz.
 
 
Data format is
 
0*0*0*0
 
If every channels will left
 
data is
 
-8*-8*-8*-8
 
 
If every channels will right
 
8*8*8*8
 
coming from uart
 
 
loop time is 20ms
 
 
 	  | Code: | 	 		  
 
#include <18F4580.h>
 
#fuses HS,NOPROTECT,NOLVP,NOWDT
 
#use delay(internal=8Mhz , clock=32Mhz)
 
 
#use rs232(baud=38400, xmit=PIN_C6, rcv=PIN_C7)
 
 
#use fast_io(b) //Port yönlendirme komutları B portu için geçerli
 
int a=0;
 
int t=0;
 
int sira=1;
 
int k[5];
 
 
#INT_CCP1   // INT_CCP1 kesmesi fonksiyonu
 
void yakala1_kesmesi ()
 
{
 
if(a==1)
 
a=0;
 
else
 
a=1;
 
}
 
 
void main() {
 
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
 
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
 
  
 
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
 
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
 
 
   set_tris_b(0x00);   // B portu komple çıkış
 
   set_tris_d(0x00);   // B portu komple çıkış
 
   set_tris_c(0x07);   // RC0, RC1 ve RC2 pini giriş
 
 
   output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor
 
   output_d(0x00); // İlk anda B portu çıkışı sıfırlanıyor
 
   setup_ccp1(CCP_CAPTURE_re); // CCP1 kesmesi yükselen aktif// fe olursa düşen
 
 
 
   CCP_1_HIGH=0x00; // CCPR1H kaydedicisi sıfırlanıyor
 
   CCP_1_LOW=0x00;  // CCPR1H kaydedicisi sıfırlanıyor
 
  
 
   enable_interrupts(INT_CCP1);  // INT_CCP1 kesmesi aktif yapılıyor
 
   enable_interrupts(GLOBAL);    // Aktif edilen kesmelere izin ver
 
   
 
   k[1]=0;
 
   k[2]=0;
 
   k[3]=0;
 
   k[4]=0;
 
   
 
   Delay_ms(10);
 
   printf("START!");
 
   Delay_ms(10);
 
 
   while(TRUE) 
 
   {
 
   output_d(sira-1);
 
   //delay_ms(1);
 
   setup_ccp1(CCP_CAPTURE_re); 
 
 while(a==0)
 
 {
 
 //output_d(1);
 
 }
 
 if(a==1)
 
 {
 
 setup_ccp1(CCP_CAPTURE_fe);
 
 while(a==1)
 
 {
 
 t++;
 
 delay_us(15);
 
 }}
 
 a=0;
 
 
 
 k[sira]=(t+160);
 
 
 sira++;
 
 
  if(sira==5)
 
 {
 
 printf("%d*%d*%d*%d"k[1]*(-1),k[2],k[3]+25,k[4]);
 
 
 sira=1;
 
// delay_ms(100);
 
 }
 
 
 t=0;
 
 
}
 
}
 
 | 	 
  | 
			 
		  |