CCS C RF Veri İletimi

suleyman89

Üye
Katılım
18 Kas 2006
Mesajlar
280
Puanları
1
Arkadaşlar, daha önceden RF haberleşmeyle LED yakma devresi yapmıştım fakat bu sefer yapmak istediğim PIC'in ADC modülünden aldığım veriyi RF ile diğer PIC'e aktarıp LCD'de göstermek.LED yakma devresinde karakter gönderip karşı tarafta bunu kontrol ettirerek led yakıyorduk fakat bu sefer değişken bir deger ve daha da önemlisi karakter değil float değer göndereceğim için bunun nasıl olacağını bulamadım birkaç denemem oldu fakat olumlu sonuç alamadım.Bu konuda yardımcı olacak arkadaşlar var mı ?Yapmaya çalıştığım devrenin resmini ekledim.
Site içerinide arama yaptıktan sonra bu konuyu açtım fakat belirttiğim konuda yazı bulamadım umarım gözden kaçırdığım olmamıştır.
l5npg.png
 
Float değeri 3 ya da 4 basamaklı sayıya dönüştürün (tam kısmı), bu sayının her basamağını diziye atıp gönderin.Aşağıda 3 basamaklı sayının (sıcaklık) gönderimi var. Aynı program içerisinden alınmış farklı kısımlar.


unsigned long int bilgi;
float sicaklik;
byte data[3];
int i;
int16 a;


******************************************
bilgi=read_adc();
sicaklik=(0.00488281125*bilgi)*100;
a=sicaklik*10;
delay_ms(20);


data[0]=(a/100)%10; //Sıcaklık rakamları teker teker diziye aktarılıyor.
data[1]=(a/10)%10;
data[2]=a%10;

***************************************************
for(i=0;i<3;i++) putc(data); //Sıcaklık değeri gönderiliyor.
 
Son düzenleme:
Float değeri 3 ya da 4 basamaklı sayıya dönüştürün (tam kısmı), bu sayının her basamağını diziye atıp gönderin.Aşağıda 3 basamaklı sayının (sıcaklık) gönderimi var. Aynı program içerisinden alınmış farklı kısımlar.


unsigned long int bilgi;
float sicaklik;
byte data[3];
int i;
int16 a;


******************************************
bilgi=read_adc();
sicaklik=(0.00488281125*bilgi)*100;
a=sicaklik*10;
delay_ms(20);


data[0]=(a/100)%10; //Sıcaklık rakamları teker teker diziye aktarılıyor.
data[1]=(a/10)%10;
data[2]=a%10;

***************************************************
for(i=0;i<3;i++) putc(data); //Sıcaklık değeri gönderiliyor.



bende de buna benzer bi sorun var sizin yazdiğiniz kod sadece verici devresine ait değil mi ??
 
Evet, alıcıyı da yazayım madem:

int16 data[3];
int i;
int16 a;
*******************
for(i=0;i<3;i++) data=getch();
a=100*data[0]+10*data[1]+data[2]; //LCD'ye yazdırabilmek
printf(lcd_putc,"\f Sicaklik %3.1w ",a);
 
Evet, alıcıyı da yazayım madem:

int16 data[3];
int i;
int16 a;
*******************
for(i=0;i<3;i++) data=getch();
a=100*data[0]+10*data[1]+data[2]; //LCD'ye yazdırabilmek
printf(lcd_putc,"\f Sicaklik %3.1w ",a);



sağolun deneyeyim inşalllah olur.
 
yazdığım program kodları aşagıdaki gibi devreyi de 2 analog giriş olacak şekilde değiştirdim fakat düzgün bir şekilde çalışmadı.Özellikle de alıcı tarafta enerji verildiği zaman rastgele değerler cıkıyor lcd ekranda bunun nedenini bilen var mı?

https://www.kontrolkalemi.com/forum/attachments/m4tyj-jpg.11541/

Verici:
#include <18f452.h>


#device ADC=10


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları


#use delay (clock=4000000)


#use fast_io(c)
#use fast_io(a)


#use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,stop=1, parity=N)


#INT_AD // ADC çevrimi kesmesi
void ADC_Kesmesi ( )
{
output_high(pin_c5);
delay_ms(200);
output_low(pin_c5);
}


unsigned long int xbilgi,ybilgi;
float xvoltaj,yvoltaj;
int i;
int16 a,b;
int8 data1[3],data2[3];
/********* ANA PROGRAM FONKSİYONU********/


void main ( )
{

setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);

set_tris_c(0x00);
set_tris_a(0x03);


output_c(0x00);


setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);

output_high(pin_c0);

for(i=0;i<10;i++)
putc(0b01010101);

while(1)

{
set_adc_channel(0);
delay_us(20);
xbilgi=read_adc();


xvoltaj=(0.0048828125*xbilgi)*10; // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
a=xvoltaj*10; // ve virgülden kurtarmak için 100 ile çarpılıyor
delay_ms(20);


data1[0]=a/100; //Deger rakamlarına ayrılıyor ve teker teker diziye aktarılıyor.
data1[1]=(a/10)%10;
data1[2]=a%10;


putc('X');
delay_ms(50);
for(i=0;i<3;i++)
putc(data1);

delay_ms(500);


set_adc_channel(1);
delay_us(20);
ybilgi=read_adc();


yvoltaj=(0.0029296875*ybilgi)*10;
b=yvoltaj*10;
delay_ms(20);


data2[0]=b/100; //Deger rakamlarına ayrılıyor ve teker teker diziye aktarılıyor.
data2[1]=(b/10)%10;
data2[2]=b%10;


putc('Y');
for(i=0;i<3;i++)
putc(data2);

delay_ms(500);

}
}


Alıcı :

#include <18f452.h>


#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD


#use delay (clock=4000000)


#use fast_io(b)
#use fast_io(c)


#define use_portb_lcd TRUE // LCD B portuna bağlı


#include <lcd.c>


#use rs232(baud=1200, xmit=PIN_C6, rcv=PIN_C7,stop=1, parity=N)




int16 xdata[3],ydata[3];
int i;
int16 xveri,yveri;
float x=0,y=0;
char gelen;
#INT_RDA
void haberlesmekesmesi()
{
disable_interrupts(int_rda);
gelen=getch();
if(gelen=='X')
{for(i=0;i<3;i++)
xdata=getch();}

else if(gelen=='Y')
{for(i=0;i<3;i++)
ydata=getch();}

else
{x=0;
y=0;}

output_high(pin_c1);
delay_ms(200);
output_low(pin_c1);
}
/********* ANA PROGRAM FONKSİYONU********/


void main()
{

setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);

enable_interrupts(GLOBAL);
enable_interrupts(int_rda);

set_tris_c(0x80);
set_tris_b(0x00);

output_c(0x00);


output_high(pin_C0);


lcd_init(); // LCD hazırlanıyor

while(1)
{
enable_interrupts(int_rda);

xveri=100*xdata[0]+10*xdata[1]+xdata[2]; //LCD'ye yazdırmak için
x=xveri/100;
yveri=100*ydata[0]+10*ydata[1]+ydata[2];
y=yveri/100;
printf(lcd_putc,"\f X=%f",x);
printf(lcd_putc,"\n Y=%f",y);
delay_ms(500);
}
}
 

Ekli dosyalar

  • m4tyj.jpg
    m4tyj.jpg
    17.9 KB · Görüntüleme: 36
Kristal kondansatörlerinin pF olmasına dikkat ediniz. Devreyi gerçekte kurmuşsanız vericiye uyandırma kodlarını da ekleyin. Vericideki for(i=0;i<10;i++) putc(0b01010101); komutu ne işe yarıyor? Alıcıda RDA kesmesinde delay_ms(200) fonksiyonunu kullanmayın. Bunların dışında gözden kaçırdığım birşey yoksa programın çalışması lazım.
 
Kristal kondansatörlerinin pF olmasına dikkat ediniz. Devreyi gerçekte kurmuşsanız vericiye uyandırma kodlarını da ekleyin. Vericideki for(i=0;i<10;i++) putc(0b01010101); komutu ne işe yarıyor? Alıcıda RDA kesmesinde delay_ms(200) fonksiyonunu kullanmayın. Bunların dışında gözden kaçırdığım birşey yoksa programın çalışması lazım.

for(i=0;i<10;i++) putc(0b01010101); komutunu uyandırma kodu olarak eklemiştim 0x55 ile aynı görevi görüyorlar,RDA kesmesindeki gecikmeyi kaldırdım fakat uygulamada yine çalışmadı hatta daha da garibi alıcı taraftaki lcd'de rastgele değerler cıkıyor.Bir türlü çözemedim şu devreyi
 

Forum istatistikleri

Konular
128,129
Mesajlar
915,277
Kullanıcılar
449,846
Son üye
g-silver

Yeni konular

Geri
Üst