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);
}
}