CCS RF alıcı-verici basit uygulama sorunları

Başlatan eemuratozan, 11 Mart 2012, 13:17:55

eemuratozan

arkadaşlar ccs ile alıcı verici yapmaya çalışıorum şimdilik vericiden gönderdiğim veriye göre karşıda led yanmasını istiyorum örneğin pin_b0 yüksek değerde ise karşıya birtakım uyandırma kodlarından sonra verimi yolluyorum karşı tarafta bu verileri bir diziye kaydedip gerekli karşılaştırmayı yaparak doğrulanması sonucu ledin yanmasını istiorum ancak şöyle bir sorun yaşıyorum proteusta pin_b0 a anahtar bağladım ilk bastığımda led yanmıor ancak anahtarı kapatıp tekrar açtığımda yanıyor neden ilk seferinde yanmıyor anlayamadım bir türlü fikirlerinizi almak istiyorum
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

mcan

Veriyi alıcı vericiye usart ile verip alıyorsan aradan rf kısmı çıkart direk çaprazlayıp tx-rx rx-tx olarak 2 mcu yu birbirine bağla program aynı şekildemi çalışıyor bak.Aynıysa programlama ile akalıdır rf kısmı ile değilö aynı değil ve istediğin gibi çalışıyorsa rf kısmı ile haberleşme yaptığın bölümleri gözden geçir .. uyandırma vs belki kısadır

eemuratozan

#include <rfverici.h>
#use fast_io(a)
#use fast_io(b)
#use delay(clock=4000000)
#use rs232(baud=6000, xmit=PIN_A1)



void main()
{

set_tris_b(0xff);
set_tris_a(0xfd);
port_b_pullups(true);
output_a(0x00);


basla:


if(input(pin_b0))
{
delay_ms(100);

goto gonder ;
}

gonder:
putc(0b01010101);
putc(0b01010101);
putc(0b01010101);

putc('x');
putc('x');
putc('x');
putc('x');
putc('x');
putc('x');
putc('x');


goto basla;
}

bu vericimin komutları pic16f628a kullanıyorum ve rx tx olarak pin_a1 i seçtim b portuna bağlı anahtarım var usart hakkında bi bilgim yok
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

eemuratozan

#include <rfalıcı.h>
#use fast_io(a)
#use fast_io(b)
#use delay(clock=4000000)
#use rs232(baud=6000, rcv=PIN_a1)

int i=0,gelen[];

void main()
{

set_tris_a(0x02);
set_tris_b(0x00);
port_b_pullups(true);
output_b(0x00);

basla:

for(i=0;i<=55;i++)
{
gelen[i]=getch();

if(gelen[49]=='x'||gelen[50]=='x'||gelen[51]=='x')

output_b(0b00001111);

}
goto basla;
}
bu da alıcı komutları
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

mcan

İki picin a1 portunu birbirine bağla gnd leride birleştir .aradaki rf kartlarını çıkart. Bu şekilde çalışıyormu bak.

eemuratozan

iki pic in a1 leri bağlı zaten henüz simülasyonda deniorum ama bağladığım a1 pinleri rx ve tx değil acaba ondan mı oluyor?
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

eemuratozan

bu arada ilk yazdığım durum pic16f62a içindi ama verdiğim kodlar da ancak pic16f877a için yani tekrar yazıp başka bir devre kurdum bu kez hiç yanmıyor baudrate i 6000 yapınca otomatik yanıyor ama diğer değerlerde butona bassam da yanmıyor bu sorunun sebebi ne olabilir sonsuz döngüden mi kaynaklanıyor kesme kullansam düzelir mi ?
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

kudretuzuner

Merhaba
CCS C bilmiyorum bu sebepten yazılımınıza bir yorum yapamayacağım.Fakat prensip olarak seri iletişim yaparken "lego"taşlarının yerine oturması lazım.Yazılımınızda (4 mhz kristal için söylüyorum)BRGH değerini göremedim(veya ben CCS C bilmediğim için nerede olduğunu farkedemedim)Bu değer 0(sıfır ise)9600 baudrate için SPBRG desimal "6"(altı) olmalı.BRGH değerini 1(bir) yaparsanız SPBRG değerine desimal 25 vermeniz gerekir.Özetle seri iletişimde kristal frekansı,baudrate hızı,BRGH değeri,SPBRG değerlerinin uyumlu olması gerekir.Ayrıca PC ve PIC haberleşmesinde de Araya max232 gerekir.


MOVLW D'25';  4 MHZ  9600 BAUD RATE İÇİN GİRİLEN DEĞER
MOVWF SPBRG
MOVLW B'00000100';   SYNC=0 (4.BİT),BRGH=1 (2.BİT)
MOVWF TXSTA
MOVLW B'10010000';SPEN=1 (7.BİT),CREN=1 (4.BİT)
MOVWF RCSTA

Yukarıda asm olarak yazdığım şablon yazılımı vereyim.CCS C ye ileve edebilirseniz ayarlar yapılmış olur.Kolay gelsin.
Amatör

eemuratozan

SPBRG ve BRGH tanımlarını açıklar mısınız :)
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

kudretuzuner

Merhaba
Amatör olduğum ve de mesleğim elektronik olmadığı için daha kapsamlı bilgileri profesyonel arkadaşlardan alırsanız daha yararlı olur.Yanlış veya eksik bilgi vermek istemem.Benim de elimin altında olan "ALTAŞ YAYINLARINDAN Orhan Altınbaşak beyin mikrodenetleyiciler ve PIC programlama" adlı kitabı temin etmenizi tavsiye edeceğim.
Amatör

eemuratozan

dediğiniz şeyleri araştırdım ancak sanırım ccs c de pic otomatik olarak algılıyormuş bi de iki pic arası haberleşmek istiyorum pc ile değil.yine de teşekkürler
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.

serhat1990

Merhaba arkadaşım ccs c 'de kendi belirlediğin pinler üzerinden veri gönderme alma işlemi yapabilirsin yani yazılımsal usart kütüphanesi mevcuttur. İyi çalışmalar.

eistain_54

Yeni konu açmak istemedim.Neredeyse mevzu aynı.
Yapmak istediğim şey şu
kumanda dan led,oto-manuel mod,perde açık,perde kapalı butonlarından hangisine basıldıysa onları programda uygun formatta seri kablosuz rf modül ile göndersin.
alıcı kısmında gelen veri eğer oto mod istiyorsa ldr yi okuyup ışık şiddetine göre perde açıp-kapatsın.manuel mod isteği varsa perde butonlarından (açık-kapalı) hangisine basıldıysa ona göre perde açsın yada kapatsın istiyorum.Birde led butone var bu herhangi modda led isteği varsa ledleri yaksın.Anlaşılır ifade edebildimmi bilmiyorum.Şema ve programı ekledim.Görünüyormu bilmiyorum.Yaşadığım sorun ise hiç tepki alamıyorum.İsis ile sanal terminalde verici kısmında karakter gönderirsem sorun yaşamıyorum görüntüleniyor ama sayısal değer yollarsam görüntülenmiyor.





#include "C:\Documents and Settings\*******\Desktop\***\D**\*\Programlar\Alıcı\main.h"
#int_RDA
int led,led_durum,mod_durum,perde_durum;


   #define mtr1 pin_a3
   #define mtr2 pin_a4
   #define serit_led pin_b1


#int_RDA
void  RDA_isr(void) 
{
int veri;
disable_interrupts(int_RDA);
   
   veri=getc();
     if (veri==10)
     
     led_durum=0;
     
     if (veri==11)
     
     led_durum=1;
     
     if (veri==20)
     
     mod_durum=0;
     
     if (veri==21)
     
     mod_durum=1;
     
     if (veri==30)
     
     perde_durum=0;
     
     if (veri==31)
     
     perde_durum=1;
   
}

void oto_mod(int led)
  { 
      while (mod_durum==1)
   {
      int ldr;
      set_adc_channel(0);
      ldr=read_adc();
     if (ldr<=125)
         {
         output_high(pin_a3);
         output_low(pin_a4);
         }
      else 
            {
               output_low(pin_a3);
               delay_ms(200);
               output_high(pin_a4);
            }
      led=serit_led;
    }
  }
  


 void manuel_mod(int led)
 
 {
  
      while (mod_durum==0)
     {
          led=serit_led;
  if (perde_durum=0)
 
         {
            output_low(mtr2);
            output_low(mtr1);
            delay_ms(200);
            output_high(mtr2);
         
         }
   if (perde_durum==1)
         {
         output_low(mtr2);
         output_low(mtr1);
         delay_ms(200);
         output_high(mtr1);
         
         }
     
     
     }
 }
 
 
void main()
{

   setup_adc_ports(sAN0|VSS_VDD);
   setup_adc(ADC_CLOCK_DIV_32);
   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);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

   // TODO: USER CODE!!
 switch (mod_durum)
   
      {
      case 0: oto_mod(led_durum);
      
      break;
      
      case 1: manuel_mod(led_durum);
      
      break;
      
      
      }
   
    
   }

alıcıydı

#include "C:\Documents and Settings\******\Desktop\***\**\*\Programlar\Verici\main.h"
int led_durum=0,mod_durum=0;

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);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab

   // TODO: USER CODE!!
   while(1)
   {
      if (!input(pin_b4))
      {
         delay_ms(140);
         if (led_durum==0)
      {
      led_durum=1;
      puts("x");
      puts("x");
      puts("x");
      puts("x");
      puts("x");
      putc(10);
      output_high (pin_a3);  
      }
      else
        {
        delay_ms(70);
       led_durum=0;
        puts("x");
        puts("x");
        puts("x");
        puts("x");
        puts("x");
        putc(11);
        output_high (pin_a3);
        }
      }
   

   if (!input(PIN_B5))
    {  
         delay_ms(150);
         if (mod_durum==0)
            {
            
             mod_durum=1;
            puts("x");
            puts("x");
            puts("x");
            puts("x");
            puts("x");
            putc(20);
           output_high (pin_a3);
            }
          else
            {
         
          delay_ms(140);
          putc(11);
          putc(12);
          putc(11);
          putc(10);
          putc(21);
             mod_durum=0;
           output_high (pin_a3); 
            }
   }
    if (!input(PIN_B6))  
         
         
           {
           delay_ms(140);
            puts("x");
            puts("x");
            puts("x");
            puts("x");
            puts("x");
            putc(30);
             output_high (pin_a3);
             }
     if (!input(PIN_B7))
            {
            delay_ms(140);
            puts("x");
            puts("x");
            puts("x");
            puts("x");
            puts("x");
            putc(31);
            output_high (pin_a3);
            }
       
   }
}


Bu arada alıcı kısmında gelen veriyi karakter olarak sorgulatınca derleyici hata veriyor.Bu yüzden sayısal değer yollamaya çalışıyorum.Nedendir acaba.Gerçi hata aldığım şey şu şekilde= if (veri==L0) gibi...


Yardım bekliyorum ve yarına yetiştirmek zorundayım....Teşekkürler
Her gün 24 altın verilirken bunun için kime şükredersin ey ademoğlu!?!

eemuratozan

arkadaşım bende cevap alamıyorum ama bildiğim şey alıcıda direk olarak veriyi algılayamazsın önce preamble yollasan iyi olur alcıyı uyandırmak için ve daha sonra şifre yani 'x' en son veri alıcı tarafta bunları bir diziye kaydedip içinde aratman gerek buna göre işlem yapmalısın.karşı tafara 'x' yollamışsın ama hiç sorgulatmamışsın gelenler arasında en azından 3 kere x gelmiş mi diye alıcı nadir de olsa başka şeyler algıladığında bu değer 10 a eşit olursa istemediğin bi anda başka şeyler yapabilir program bu yüzden önce putc(0b01010101); gibi uyandırma kodu yollamalısın
I&C Engineer in Bereket Enerji Çates Elektrik Üretim A.Ş.