CCS C'de RF iletişim

Başlatan meganeura, 23 Aralık 2013, 23:01:56

meganeura

Proje ödevim için uzaktan kumandalı araba yapmaya çalışıyorum. 16f877'ye bağlı L293D ile iki dc motor kontrol edilecek. En büyük sorunum RF ile iletişim nasıl programlanabilir 6 bitlik veriyi tek bitle nasıl gönderebilirim? Kaynak araştırdım ama bulamadım yardımcı olursanız sevinirim.

Yapmaya çalıştığım devre böyle birşey:

polleme

6 bitlik veriyi 8 bitlik tek bir sayı ile gönderebilirsiniz. İşlemci 8 bit olduğundan tek seferde 8 bit gönderebilir, seri port bunu bir seferde iletir.

meganeura

Pek bilgili olmadığımdan doğru anlatamadım sanırım. Verici devrede 6 farklı buton var 6 farklı durumu tek pinde nasıl belirtebilirm. Sanırım çizdiğim devre yanlış alıcının RC7/RX girişine bağlı olması gerek.

serhat1990

#3
Merhabalar 6 farklı buton olması sorun değil 8 bit = 1 byte'lık bir bilgi ile gönderebilirsiniz .
Bununda çok basit yolları var.B portunun durumunu herhangi bir değişkene atayın. Bu değişkeni karşı tarafa iletin. Karşı tarafın aldığı byte üzerinde işlemlerinizi tanımlayın.

Ayrıca zamanında paylaştığım örnekler bu konuda işinize yarayabilir .

https://www.picproje.org/index.php/topic,38490.0.html

iyi çalışmalar saygılarımla ...

meganeura

Çok teşekkürler ama sayfadaki hiçbir linkten faydalanamadım. Ya arşiv hatası diyor ya da dosya kaldırılmış.

serhat1990

Verdiğim linkte indirme linklerine bakın. Linklerin biraz altında RFDENEMESI.rar ve ccscdersleri.rar bölümüne tıklarsanız indirebilirsiniz. ARX - ATX bölümündeki link işinize yarayacaktır. ASK modüller ile haberleşme konusunda. İyi çalışmalar , saygılarımla ...

LukeSkywalker

Bu linkten udea rf modüllerin kullanımını öğrenebilirsiniz.

meganeura

Yardımlarınız için tekrar teşekkürler verdiğiniz örneklerde işin içine adc, uart gibi farklı şeyler girmiş kafam iyice karıştı :-[ Yazdığım kodlar bu şekilde. Vericinin tx çıkışından kare dalga elde ediyorum ama alıcıda rda kesmesi oluşmuyor. Gönderdiğim şeyleri doğru okumasa anlarım preamble, öncü veri gibi birşeyler yapmam lazım. Anlamadığım şey alıcının rx girişinde değişiklik olduğunda hiç kesme oluşmaması.
verici:
#include <16F877A.h>
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#use delay(clock=4M)
#use rs232(baud=600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_b(0x00);
   set_tris_a(0xFF);
   enable_interrupts(INT_RDA);
   enable_interrupts(GLOBAL);
   while (1)
   {
   if(input(pin_a0)==0)
      {
      putc('q');
      delay_ms(1);
      }
   if(input(pin_a1)==0)
      {
      putc('a');
      delay_ms(1);
      }
   if(input(pin_a2)==0)
      {
      putc('w');
      delay_ms(1);
      }
   if(input(pin_a3)==0)
      { 
      putc('s');
      delay_ms(1);
      }
   if(input(pin_a4)==0)
      {
      putc('e');
      delay_ms(1);
      }
   if(input(pin_a5)==0)
      {   
      putc('d');
      delay_ms(1);
      }
   }
}

alıcı:
#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES WRT_50%                  //Lower half of Program Memory is Write Protected

#use delay(clock=4000000)
#use rs232(baud=600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

char veri;

#int_rda
void RDA_kesme()
{
   disable_interrupts(int_rda);
   output_b(0x0F);
   getc(veri);
   
   
}
void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   enable_interrupts(int_RDA);
   enable_interrupts(GLOBAL);
   set_tris_c(0xFF);
   set_tris_A(0x00);
   set_tris_b(0x00);

   while(1)
   {
      enable_interrupts(int_rda);
      
      
         if (veri=="q")
         output_a(0x02);
         if (veri=="a")
         output_a(0x01);
         if (veri=="w")
         output_a(0x0A);
         if (veri=="s")
         output_a(0x06);
         if (veri=="e")
         output_a(0x08);
         if (veri=="d")
         output_a(0x04);
   }
   
}

yarenler42

iyi günler arkadaşlar 2 yıl önce uğraştığınız çalışmalara ben de şu an dahil olayım istedim, tek başıma aylardır kurcalıyorum fakat beceremedim. yardım etmeniz mümkünmü, aşağıda kullandığım kodları paylaşıyorum.
verici:
#include <16F628A.h>
#device adc=16
#fuses INTRC_IO, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD

#use delay(clock=4M)
#use fast_io(a)
#use fast_io(b)

int m;
#use rs232(baud=900,parity=N,xmit=pin_B2,rcv=pin_B1,bits=8)

void main()
{
   set_tris_a(0x03);
   set_tris_b(0x00);
   output_a(0x00);
   output_b(0x00);
   
   delay_ms(100);
   
while(TRUE){           
            if(input (pin_a0)==1){
                                  delay_ms(39);while(input(pin_a0));
                                  putc(0b01010101);//   putc(0b00000000);   putc(0b11111111);
                                 
                                  putc('X');
                                  delay_ms(39);
                                  putc('A');                             
                                  delay_ms(10);output_toggle(pin_a2);delay_ms(239);
                              }
      if(input(pin_a1)==1){                     
                              delay_ms(39); while(input(pin_a1));
                              putc(0b01010101);//  putc(0b00000000);    putc(0b11111111);
                             
                                putc('X');
                                delay_ms(39);
                                putc('B');
                                delay_ms(10);output_toggle(pin_a3);delay_ms(239);
                              }
   }
}
alıcı:
#include <16F628A.h>
#device adc=16
#fuses INTRC_IO, NOWDT, NOPUT, NOPROTECT, NOBROWNOUT, NOMCLR, NOLVP, NOCPD

#use delay(clock=4M)
#use rs232(baud=900,parity=N,xmit=pin_B2,rcv=pin_B1,bits=8) 

#int_rda

int i;
char e;
char x;

void kesgel(){
              disable_interrupts(int_rda);return;
             }
                   
void main()
{                                             
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_a(0x00);
   output_a(0x00);
   
   enable_interrupts(int_rda);
   enable_interrupts(global);
   
   while(TRUE)           
   {enable_interrupts(int_rda);
    enable_interrupts(global);
                             
      if(getch()=='X') {  e = getch();
                        if(e=='A'){  kesgel();
                       
                                output_toggle(pin_a0);delay_ms(500);
                                output_toggle(pin_a0);delay_ms(500);
                                output_toggle(pin_a0);delay_ms(500);
                                output_toggle(pin_a0);delay_ms(500);
                                output_toggle(pin_a0);delay_ms(500);
                                    }
                        if(e=='B'){  kesgel();
                       
                                     output_toggle(pin_a1);delay_ms(239);
                                     output_toggle(pin_a2);delay_ms(239);
                                     output_toggle(pin_a3);delay_ms(239);
                                     }
                          }
     }
}

tunayk

RF iletişim konusunda eğer konu başındaki şema ile çalışıyorsanız, hiç bir rf sinyali picin bacağına doğrudan gönderildiği gibi ulaşmazki picin bacağında doğrudan bir Rx kesmesi oluşsun.  RF sinyaller milivolt veya mikrovolt seviyelerinde oluşuyor. Anten ve yükseltici devre sayesinde anlaşılır bir hale gelir. Picin Rx bacağına bu değerde bir sinyal geldiğinde doğal olarak 0 olarak algılanır ve kesme oluşmaz. Bu işlem için hem verici hem de alıcı tarafından modüllerin kullanılması gerekli. (Sizin için RF katını tasarlamanın daha zor olduğunu varsayarak).

Modül kullandığınızda kullandığınız modülün yapısına göre bir  haberleşme yapısı kullanacaksınız.  Çoğunlukla modül kullandıktan sonra doğrudan rx - Tx bağlı imiş  gibi haberleşirsiniz.