RF UYGULAMASI TEK KARAKTER GİDİYOR AMA İNT FLOAT GİTMİYOR. HALA ÇÖZÜLMEDİ

Başlatan husam685, 02 Ocak 2012, 05:52:43

husam685

arkadaşlar rf uygulaması yapıyorum ama bir sorunum var şimdi proteusta rf modulu olmadıgı için iki pici rx ve tx den birleştirdim. tek karakter gönderebiliyorum ama birden fazla karakter gönderemiyorum göndersem bile sırf birinci karakter cıkıyor bunu nasıl yapabilirim. ayrıca float degerinde ki sayıyı rf ile nasıl aktarabilirim lütfen yardım edin teşekkürler.

husam685


skara1214

stringin sonuna \r ekle çözülür mesele bende çok kafayı sıyırmıştım sırf bu olay için:D
Herkes ölür ama herkes gerçekten yaşamaz

husam685

sizde örnek olarak çok basit bir şekilde uygulama varmı karşılaştırma yapmak  için nasıl olmuş nasıl yol izlenmiş diye yeni olduğum için kendimi geliştirmeye çalışıyorum.

skara1214

verici
#include <16F886.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses HS,NOWDT,NOMCLR
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use rs232 (baud=115200,xmit=PIN_C6, rcv=PIN_C7, parity=N, stop=1)
char klavye[80];
void main ( )
{
    delay_ms(1000);
printf("x say\r");
gets(klavye);

}   

alıcı
#include <16F886.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#fuses HS,NOWDT,NOMCLR
#use delay (clock=20000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use rs232 (baud=115200,xmit=PIN_C6, rcv=PIN_C7, parity=N, stop=1)
char klavye[80];
#int_rda   // RX ucuna veri gelince meydane gelen kesme
void serihaberlesme_kesmesi ()
{
   disable_interrupts(int_rda); // int_rda kesmesini pasif yap
   gets(klavye); // String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.
   if(klavye[0]=='x')
   printf("2. pic cevap veriyot\r",klavye); 
   enable_interrupts(int_rda);
   
}

void main ( )
{
   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   enable_interrupts(int_rda); 
    while(1);
}   


basitce bir verici ve bir alıcılı kod yazdım.verici x ile başlayan bir string yollayınca alıcı cevap veriyor.Vericideki gets ile alınan klavye yi lcd de göstererek test yapabilirsin
Herkes ölür ama herkes gerçekten yaşamaz

husam685

örneğin verdiğiniz örnekte vericiye float degeri verip onu nasıl alıcıya iletebilirim. mesela suan 0-100 sayan sekilde bir tane alıcı verici yaptım denemek amaçlı 100 olunca tekrar sıfır dan baslıyor ama float basmaya gelince hiç yapamıyorum birde kafam şu şekilde karıştı tamam karakter veya stringleri char dizisine atıyoruz eger float olursa o degerleri nasıl atacam :(

skara1214

Herkes ölür ama herkes gerçekten yaşamaz

husam685

olmuyor float gönderdiğim sıra ekranda alıcı devresinde gösterme seklini float olarakta ayarlıyorum durmadan ya 0.00 yada 123.0 gözüküyor sıyırdım iyiceee birazda acemi olunca işler iyice sarpa sarıyor. bende serdar cicegin kitabı var sizin verdiğiniz örneğin biraz değişiği ordada var ama o sadece pic den pc ye verio ama hyper terminalinden gözüküyor pc olayını denemedim onda ben ise pic den pice atacagım için sorun oluyor karakter di string ifadeler char dizisine atıyoruz ona görede gönderiyoruz putc ile bunu int içinde yapıyoz alırkende alıcıda int diyoruz

degisken=getc();

hersey tamam ama float olayı cok sıkıntılı. onu yoksa char gibi diziye mi atacaz ki yada float deger[80] gibimi yapacaz hiç fikrim yok

husam685

ayrıca abi seni msnden ekledim haberin olsun mesela örnek olarak söyle birsey yaptım. 0-100 kadar sayıyor sonra 100 olunca sıfırlıyor tekrar sayıyor bunları yapıom ama float hiç yapamıom kodları gönderiyorum inceleye bilirsin abi.

verici kodları

#include <16F877a.H>
#fuses XT, NOWDT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8)
//=========================================
int a=0;
void main()
{

while(true)
  {
  if(a=0,a<100,a++)
  {
putc(a);
delay_ms(250);
  }
  if(a>100)
  {
  a=0;
  }

  }
  }


alıcı kodları :

#include <16F877a.H>
#fuses XT, NOWDT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,bits=8)
#include <lcd420.c>
//=========================================
int str;
#int_rda
void kesme()
{
disable_interrupts(int_rda);
str=getc();
printf (lcd_putc,"\r\f %d",str);
if(str==100)
{
printf (lcd_putc,"\r\fsayım bitti");
delay_ms(250);
disable_interrupts(int_rda);
}
}
void main()
{
lcd_init();
enable_interrupts(global);
while(1)
{
enable_interrupts(int_rda);
  }
  }


aykerme

yukarıdaki örnek kodda printf kullanımı hatalı olmuş, sizde böyle bir hata yapıyor olabilirsiniz. float göndermek için seri gönderme fonksiyonununuz karakter karakter çalışıyorsa (ki genelde böyledir) sayıyı karakter taşıyıcısına aktarıp teker teker gönderebilirsiniz. tabi karşı tarafta aynı şekilde karakter karakter alıp float değişkene aktarmanız gerekir. burada union değişkenler kullanışlı olmaktadır. Örnek; typedef union {
   float   f;   
   int8_t   ch[4];
   uint8_t   uch[4];
}float_to_char;

papsukkal

verici kodlarında


while(true)
  {
  if(a=0,a<100,a++)
  {

diye bir ifade var. burayı da kontrol et istersen.

for(a=0;a<100;a++)   olabilir mi?


husam685

abi bun örnekte sorun yok sadece denemek için 0-100 arası bi sayıcı yaptım oluyor ama ds18b20 den okunan degeri aktaramadım sonra ds18b20 nin data pinine 2.2k lık bir direnç vardı o direncin ayarı ile oynadım analog tu onu dijital yaptım otomatikmen oldu ama - degere gelince direk 255 den baslıo bunu nasıl çözebilirim ayrıca böle bi sorun olabilir mi proteusta direnc ayarı anologtu dijital yaptım düzeldi kafam karıstı. şimdi sadece sorun olarak - deger olunca 0 dan sonra 255 ten baslıyor - degeri göstermiyor.

Murat Mert

S.A.
rf de de seri dede yollayacağın veriler 8 bitlik yollarsın, misal :

ds_isi=36,7 ise

int16 veri;
yolla[4];

veri=ds_isi*10;
yolla[1]=make8(veri,1);
yolla[2]=make8(veri,2);
mert07

husam685

yaptım arkadaşlar çok sagalun eksi degeri göstermiyordu bi döngu actım gelen deger sıfırdan kucukse 256 dan cıkart dedim :D ve eksiliği değeride görebiliyorum:)