rf alıcı verici ile 3 basamakli sayi gönderme (ilk mesaj güncellendi)

Başlatan elmariacci, 05 Nisan 2013, 18:11:12

elmariacci

arkadaşlar nabiz değeri bazen iki basamakli bazen 3 basamakli oluyor.rs232 ile bir defa da 8 bit gönderebiliyoruz ama bende 16 ya da 32 olmasi gerekiyor programin dizi kısmında hata var gibi 2 ya 3 basamakli sayiyi diğer pice nasil gönderebilirim ??



verici

#include "verici.h"



#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use rs232(baud=2400,xmit=PIN_C6,parity=N,stop=1)

#define use_portb_lcd TRUE

#include <lcd.c>   // lcd.c dosyası tanıtılıyor



int nabiz;
byte data[3];
int i;
int8 a;

void uyan(){      // RF cihzını uyandırmak için
    putc(0x55);
    putc(0x00);
    putc(0xff);
    return;
}

void main()
{
   setup_timer_1(T1_DISABLED);
   
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);
   
   set_tris_a(0x11);
   
   lcd_init();
   
   
   printf(lcd_putc,"\f     HAZIR!   ");
   
    
   
  
   while(input(pin_a0))
   {;}
      // butona basılmamıssa 1 dir.
     
       while (true)
   {

      printf(lcd_putc,"\f  HESAPLANIYOR ");
      set_timer0(0);
            
      delay_ms(10000); 
         
      nabiz=get_timer0();
         
      a = nabiz*6;
      delay_ms(20);
      
      data[0]=(a/100)%10; //Nabız rakamları teker teker diziye aktarılıyor.
      data[1]=(a/10)%10;
      data[2]=a%10;
         
      printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
   
   delay_ms(2000);
   
  
   
 uyan();
   if(input(pin_a0)){
   
   for(i=0;i<3;i++) 
   
   putc(data[i]);//Nabız değeri gönderiliyor.
   }
   }
}


alıcı

#include "alici.h"

#use rs232(baud=2400,rcv=PIN_C7,parity=N,stop=1)


#define use_portb_lcd TRUE

#include <lcd.c>

int16 data[3];
int i;
int8 a;

void main()
{



lcd_init();
printf(lcd_putc,"\f    merhaba    ");
delay_ms(2000);

while(true){




for(i=0;i<3;i++) 

data[i]=getch();



a=100*data[0]+10*data[1]+data[2];



printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
delay_ms(500);
}
}


}

toyo

Cevabı kendin vermişsin zaten.. aynı anda 2 işi nasıl yapabilir  :o
Mikrodenetleyicinin RC ve TX pinlerini kullanarak seri iletişim yaparsan donanımsal olarak iletişim kurmuş olursun.
Birde yazılımsal olarak başka pinleri kullanarak iletişim kurmak var.
Verici için A1 pininden iletişim1 isimli adresden( yada yoldan deyim) göndereceğimi belirtiyorum.
#use rs232(baud=2400, xmit=PIN_A1,parity=N,stop=1,stream=iletisim_1)

0x6C değerini iletişim1 ayarlarına göre gönderiyorum.
fputc(0x6C,iletisim_1);

Alıcı için B3 pininden iletişim1 adresinden yolundan artık ne denirse alacağımı belirtiyorum.
#use rs232(baud=2400,rcv=PIN_B3,parity=N,stop=1,stream=iletisim_1)

İletilşim1 ayarlarına göre gelen veri 0x6C ye eşitse gibisinden de alıyorum.
if(fgetc(iletisim_1)==0x6C)

Başka pinleride kullanabilirsin..
Gelirken ne getirilir ki giderken ne götürülür.

elmariacci

lcd için ayri pic veri gonderimi için ayri pic kullandim ama dediğinizi deneyecem sağolun.

elmariacci

arkadaşlar verici ile alici kodlari aşağiya ekledim verici devresinde hesaplama işlemi yapiliyor fakat alici kisimda lcd de sadece merhaba yaziyor herhangi bir veri gelmiyor programda sıkıntı nerede bi bakar misiniz?

verici

#include <16F628A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use rs232(baud=600,xmit=PIN_A1,parity=N,stop=1,stream=iletisim_1)

#define use_portb_lcd TRUE

#include <lcd.c>   // lcd.c dosyası tanıtılıyor



int8 i=0;   //int deger=0;
int b;
byte data[3];
int8 a;

void uyan(){      // RF cihzını uyandırmak için
    putc(0x55);
    putc(0x00);
    putc(0xff);
    return;
}

void main()
{
   setup_timer_1(T1_DISABLED);
   
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);
   
   set_tris_a(0x11);
   
   lcd_init();
   
   printf(lcd_putc,"\f  NABIZ OLCER  ");
   printf(lcd_putc,"\n   21/03/2011  ");
   delay_ms(2000);
   printf(lcd_putc,"\f     EDITOR    ");
   printf(lcd_putc,"\n  CETIN YESIL  ");
   delay_ms(2000);
   printf(lcd_putc,"\f    DANISMAN    ");
   printf(lcd_putc,"\n O.G. SARACOGLU");
   delay_ms(2000);
   printf(lcd_putc,"\f     HAZIR!   ");
   
    
   
  
   while(input(pin_a0))
   {;}
      // butona basılmamıssa 1 dir. butonu tekrar kontrol etmek için x 'e git
     
       while (true)
   {

      printf(lcd_putc,"\f  HESAPLANIYOR ");
      set_timer0(0);
            
      delay_ms(10000); 
         
      i = get_timer0();
         
      a = i * 6;
         
      printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
   
   delay_ms(5000);
   
  
   
 uyan();
   if(input(pin_a0))
   
   for(b=0;b<3;b++) 
   
   data[0]=(a/100)%10; //Nabız rakamları teker teker diziye aktarılıyor.
   data[1]=(a/10)%10;
   data[2]=a%10;
   
   fputc(data[b],iletisim_1); //Nabız değeri gönderiliyor.
  
   }
}



alici

#include "alici.h"

#use rs232(baud=600,xmit=PIN_B3,parity=N,stop=1,stream=iletisim_1)


#define use_portb_lcd TRUE

#include <lcd.c>

int8 data[3];
int b;
int8 a;

void main()
{



lcd_init();
printf(lcd_putc,"\f    merhaba    ");
delay_ms(2000);

while(true){

if(fgetc(iletisim_1)==data[b])

for(b=0;b<3;b++) 


a=100*data[0]+10*data[1]+data[2];



printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
delay_ms(500);
}

}

toyo

Kardeş  basit hatalar yapıyosun.
şu kısım doğru xmit göndereceğin pini belli ediyor.
#use rs232(baud=600,xmit=PIN_A1,parity=N,stop=1,stream=iletisim_1)

şu kısım alıcıancak yine xmit yazmışın .
#use rs232(baud=600,xmit=PIN_B3,parity=N,stop=1,stream=iletisim_1)

Doğrusu
#use rs232(baud=600,rcv=PIN_B3,parity=N,stop=1,stream=iletisim_1)


Ayrıcı B portunu 2 devredede lcd için ayırdığın için B3 pinini lcd de kullanmasan bile o pini başka işler için kullanamıyosun.(Benim bildiğim )

Bence gönderirken sıkıntı yaşıyorsun yada alırken.Ben başka bir değer gönderip aldım nabız 69 felan yazdı .

Verici
#include <16F628A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use rs232(baud=600,xmit=PIN_A1,parity=N,stop=1,stream=iletisim_1)

#define use_portb_lcd TRUE

#include <lcd.c>   // lcd.c dosyası tanıtılıyor



int8 i=0;   //int deger=0;
int b;
byte data[3];
int8 a;



void main()
{
   setup_timer_1(T1_DISABLED);
   
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);
   


   
   lcd_init();
   
   printf(lcd_putc,"\f  NABIZ OLCER  ");
   printf(lcd_putc,"\n   21/03/2011  ");
   delay_ms(200);
   printf(lcd_putc,"\f     EDITOR    ");
   printf(lcd_putc,"\n  CETIN YESIL  ");
   delay_ms(200);
   printf(lcd_putc,"\f    DANISMAN    ");
   printf(lcd_putc,"\n O.G. SARACOGLU");
   delay_ms(200);
   printf(lcd_putc,"\f     HAZIR!   ");
   
    
   
  
   while(input(pin_a0))
   {;}
      // butona basılmamıssa 1 dir. butonu tekrar kontrol etmek için x 'e git

       while (true)
   {

      printf(lcd_putc,"\f  HESAPLANIYOR ");
      set_timer0(0);
            
      delay_ms(100);
         
      i = get_timer0();
         
      a = i * 6;
         
      printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
   
   delay_ms(500);
   
  
   
 
   if(input(pin_a0))

 fputc(0x6C,iletisim_1);
  
   }
}

Alıcı
#include <16F628A.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT

#use delay (clock=4000000) 
#use rs232(baud=600,rcv=PIN_a1,parity=N,stop=1,stream=iletisim_1)

#use delay (clock=4000000) 
#define use_portb_lcd TRUE

#include <lcd.c>

int8 data[3];
int b;
int8 a;

void main()
{



lcd_init();
printf(lcd_putc,"\f    merhaba    ");
delay_ms(200);

while(true){

if(fgetc(iletisim_1)==0x6C)
{


printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
delay_ms(500);
}

}}



Alıcı ve verici için iletişim pinini a1 olarak yaptım.
incele ve gönderdiğin değerler hakkında bilgi topla derim.Mesela ben 0x6c gönderip aldım sen dizi şeklinde alıyorsun gibi gbi.Bence orda sıkıntı var .Tabi iyi bilen birisi daha iyi yardımcı olacaktır.
pratikte devreyi kurcaksan 2400 baud hızı normaldir.
Not  : Osilaskop aldığın yerden Virtual Terminali alıp iletişim yoluna bağla ve ayarlarından baud hızını ayarla böylelikle verinin gidip gitmediğini görebilirsin. Gözümden kaçan brşeylerde olabilir  :)

Gelirken ne getirilir ki giderken ne götürülür.

elmariacci

Alıntı yapılan: toyo - 06 Nisan 2013, 18:35:01
Kardeş  basit hatalar yapıyosun.
şu kısım doğru xmit göndereceğin pini belli ediyor.
#use rs232(baud=600,xmit=PIN_A1,parity=N,stop=1,stream=iletisim_1)

şu kısım alıcıancak yine xmit yazmışın .
#use rs232(baud=600,xmit=PIN_B3,parity=N,stop=1,stream=iletisim_1)

Doğrusu
#use rs232(baud=600,rcv=PIN_B3,parity=N,stop=1,stream=iletisim_1)


Ayrıcı B portunu 2 devredede lcd için ayırdığın için B3 pinini lcd de kullanmasan bile o pini başka işler için kullanamıyosun.(Benim bildiğim )

Bence gönderirken sıkıntı yaşıyorsun yada alırken.Ben başka bir değer gönderip aldım nabız 69 felan yazdı .

Verici
#include <16F628A.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use rs232(baud=600,xmit=PIN_A1,parity=N,stop=1,stream=iletisim_1)

#define use_portb_lcd TRUE

#include <lcd.c>   // lcd.c dosyası tanıtılıyor



int8 i=0;   //int deger=0;
int b;
byte data[3];
int8 a;



void main()
{
   setup_timer_1(T1_DISABLED);
   
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   setup_timer_0(RTCC_EXT_H_TO_L | RTCC_DIV_1);
   


   
   lcd_init();
   
   printf(lcd_putc,"\f  NABIZ OLCER  ");
   printf(lcd_putc,"\n   21/03/2011  ");
   delay_ms(200);
   printf(lcd_putc,"\f     EDITOR    ");
   printf(lcd_putc,"\n  CETIN YESIL  ");
   delay_ms(200);
   printf(lcd_putc,"\f    DANISMAN    ");
   printf(lcd_putc,"\n O.G. SARACOGLU");
   delay_ms(200);
   printf(lcd_putc,"\f     HAZIR!   ");
   
    
   
  
   while(input(pin_a0))
   {;}
      // butona basılmamıssa 1 dir. butonu tekrar kontrol etmek için x 'e git

       while (true)
   {

      printf(lcd_putc,"\f  HESAPLANIYOR ");
      set_timer0(0);
            
      delay_ms(100);
         
      i = get_timer0();
         
      a = i * 6;
         
      printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
   
   delay_ms(500);
   
  
   
 
   if(input(pin_a0))

 fputc(0x6C,iletisim_1);
  
   }
}

Alıcı
#include <16F628A.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT

#use delay (clock=4000000) 
#use rs232(baud=600,rcv=PIN_a1,parity=N,stop=1,stream=iletisim_1)

#use delay (clock=4000000) 
#define use_portb_lcd TRUE

#include <lcd.c>

int8 data[3];
int b;
int8 a;

void main()
{



lcd_init();
printf(lcd_putc,"\f    merhaba    ");
delay_ms(200);

while(true){

if(fgetc(iletisim_1)==0x6C)
{


printf(lcd_putc,"\f NABIZ=%d nn/dk",a);
delay_ms(500);
}

}}



Alıcı ve verici için iletişim pinini a1 olarak yaptım.
incele ve gönderdiğin değerler hakkında bilgi topla derim.Mesela ben 0x6c gönderip aldım sen dizi şeklinde alıyorsun gibi gbi.Bence orda sıkıntı var .Tabi iyi bilen birisi daha iyi yardımcı olacaktır.
pratikte devreyi kurcaksan 2400 baud hızı normaldir.
Not  : Osilaskop aldığın yerden Virtual Terminali alıp iletişim yoluna bağla ve ayarlarından baud hızını ayarla böylelikle verinin gidip gitmediğini görebilirsin. Gözümden kaçan brşeylerde olabilir  :)
(Resim gizlendi görmek için tıklayın.)

alici daki Xmit kismi buraya kopyalarken yanliş yapmişim verici ve alicidaki lcd bağlantilarinda B3 pinini kullanmiyorum o pin boş o pini kullanmaya devam mi edeyim yoksa rcv için başka pin mi atayayim. dediklerinizi deneyecem sağolun.

toyo

Başka pin dene mesela a1 yapmışım ben.
Gelirken ne getirilir ki giderken ne götürülür.