pic in rx bacağındaki gürültü

Başlatan isoment01, 29 Haziran 2017, 13:13:55

isoment01

Arkadaşlar herkese merhaba, elimdeki 16f877a pic var kodlarımı ccs c de yazıyorum serial den aldığım karekterlere göre timeri belirli değerlerde çalıştırmaya çalışıyorum kodlarımı ve ekran görüntüleri ekte atacagım. Sorunum ise su getchar ile karekter almayı olayını mainde ya da rda ile de yapsam kodu yüklediğimde getchar işlem satırına geldiğinde pic kendiliğinden bozuk karekterler atıyor diger rs232 data cable ve max entegresını ayrı ayrı denedim haberlesmelerinde sıkıntı yok fakat picin tx bacagında bir problem var kendiliğinden 2 kere bozuk karekter atıyor ve ben harf giremiyorum. Bunu bir türlü çözemedim. Bana nolur yardımcı olun .
#device PIC16F877A

#include <16f877a.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(c)
#use rs232 (baud=9600,xmit=pin_C6, rcv=pin_C7, parity=N, stop=1, Bits=8)
unsigned int16 sayac = 0;// hedef_ileri = 0, hedef_geri=0
char islem;

//#priority rda, timer1

/*#int_rda
void serihaberlesme_kesmesi ()
{


 islem=getch();
 putc(islem);
output_high(pin_b0);
  disable_interrupts(int_rda); // int_rda kesmesini pasif yap
}
*/
#int_timer1
void timer1_interrupts()
{

set_timer1(64923);
while(sayac>0)
{ output_high(pin_c2);
delay_us(20);
output_low(pin_c2);
sayac--;
}

}

void main()
{
delay_ms(300);
setup_psp(PSP_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);      //262 ms overflow      //65,5 ms overflow
setup_timer_2 (T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_b(0x00);
output_b(0x00);
set_tris_c(0x00);
output_c(0x00);
enable_interrupts(GLOBAL);
//enable_interrupts(INT_rda);
enable_interrupts(INT_timer1);
printf("\n\r System initializing....\n\r");
printf("\n\r bir islem seciniz...\n\r");
//hedef_ileri=3200;//400*8
//hedef_geri=7200;
set_timer1(64923);

   while(TRUE)
   {
 islem=0;
if(kbhit())
{

islem=getchar();
putc(islem);
 if(islem=='r')
 { output_high(pin_c3);// motor aktif,motor enable pin
delay_ms(100);
output_high(pin_c1);// motor yönü belirlendi, motor direction pin
sayac=3200;
printf("right start\r\n");
 }
 if(islem=='l')
 {
 output_high(pin_c3);
 delay_ms(100);
 output_low(pin_c1);
 sayac=3200;
 printf("left start \n\r");
 if(islem=='s')
 {
 output_low(pin_c3);
 sayac=0;
 printf("motor stop \n\r");
 }
 }
}
   }


}



durumum bu şekilde nerde hata yapıyorum rx bacagındaki noise problemini nasıl çözerim ?

ÜC

İşlemci beslemesine çok yakın 100nf deneyin

isoment01

#2
Alıntı yapılan: umitco - 29 Haziran 2017, 13:52:28
İşlemci beslemesine çok yakın 100nf deneyin
100 nf kullanıyorum hocam su anda . max232 nin baglantıları ıcın referans olarak şu görseli kullanıyorum acaba bunda mı bir sıkıntı var ? Breadboar da acaba kablo fazlalıgı bir noise yaratır mı ? Basitte bir devre yani


ferdem

1) PIC in RX pinini girişe şartladınız mı? Tris ayarlarında çıkış olarak görünüyor, bunu bir düzeltin. Veriyi her zaman rda kesmesi kullanarak alın, forumda örnek kullanım bolca var.

2) Haberleşme denemelerini motor vs. bağlantılarını yapmadan yapın, haberleşmenin çalıştığından emin olun sonra motoru dahil edersiniz.

Kolay gelsin.

isoment01

#4
Alıntı yapılan: ferdem - 29 Haziran 2017, 15:23:22
1) PIC in RX pinini girişe şartladınız mı? Tris ayarlarında çıkış olarak görünüyor, bunu bir düzeltin. Veriyi her zaman rda kesmesi kullanarak alın, forumda örnek kullanım bolca var.

2) Haberleşme denemelerini motor vs. bağlantılarını yapmadan yapın, haberleşmenin çalıştığından emin olun sonra motoru dahil edersiniz.

Kolay gelsin.
hocam sondan başlayayım step by step gidiyorum zaten şu an ledleri bagladım timer cıkısına ve motor pinleri yerine eger basarılı olursan ona gececem. tris ayarlarına hıc dıkkat etmedım olmadı c portunu ıptal edım cıkısları baska bır porttan vereyım. bunu gozden kacırmısım. Birde rx tx i input olarak tanımlamak lazım mı ? ben hıc gormedım sadece rs232 ayarlarında kullandıgım rx tx pınlerı belırtsem yeter galiba ? son olarak hocam kodlarımda rda kesme ıcın de yazdıgım kodlar var aslında orda bı bakar mısınız o kod kısmını dısable etmiştim. Şimdi orda tekrar rda kesme fonksiyonunu enable edip main kısımda getchar ve putcharları silersem, yeterlı olur mu ? yoksa baska bir ekşiğim var mı ?

isoment01

#5
Alıntı yapılan: ferdem - 29 Haziran 2017, 15:23:22
1) PIC in RX pinini girişe şartladınız mı? Tris ayarlarında çıkış olarak görünüyor, bunu bir düzeltin. Veriyi her zaman rda kesmesi kullanarak alın, forumda örnek kullanım bolca var.

2) Haberleşme denemelerini motor vs. bağlantılarını yapmadan yapın, haberleşmenin çalıştığından emin olun sonra motoru dahil edersiniz.

Kolay gelsin.
#device PIC16F877A

#include <16f877a.h>
#fuses xt,nowdt,noprotect, nobrownout, nolvp, noput, nowrt, nocpd
#use delay (clock=4000000)
#use fast_io(b)
#use rs232 (baud=9600,xmit=pin_C6, rcv=pin_C7, parity=N, stop=1, Bits=8)
unsigned int16 sayac = 0;// hedef_ileri = 0, hedef_geri=0
char islem;

//#priority rda, timer1

/*#int_rda
void serihaberlesme_kesmesi ()
{


 islem=getch();
 putc(islem);
output_high(pin_b0);
  disable_interrupts(int_rda); // int_rda kesmesini pasif yap
}
*/
#int_timer1
void timer1_interrupts()
{

set_timer1(64923);
while(sayac>0)
{ output_high(pin_b2);
delay_us(20);
output_low(pin_b2);
sayac--;
}

}

void main()
{
delay_ms(300);
setup_psp(PSP_DISABLED);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);      //262 ms overflow      //65,5 ms overflow
setup_timer_2 (T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);
set_tris_b(0x00);
output_b(0x00);

enable_interrupts(GLOBAL);
//enable_interrupts(INT_rda);
enable_interrupts(INT_timer1);
printf("\n\r System initializing....\n\r");
printf("\n\r bir islem seciniz...\n\r");
//hedef_ileri=3200;//400*8
//hedef_geri=7200;
set_timer1(64923);

   while(TRUE)
   {
 islem=0;
if(kbhit())
{

islem=getchar();
putc(islem);
 if(islem=='r')
 { output_high(pin_b3);// motor aktif,motor enable pin
delay_ms(100);
output_high(pin_b1);// motor yönü belirlendi, motor direction pin
sayac=3200;
printf("\r\n right start\r\n");
 }
 if(islem=='l')
 {
 output_high(pin_b3);
 delay_ms(100);
 output_low(pin_b1);
 sayac=3200;
 printf("left start \n\r");
 }
 if(islem=='s')
 {
 output_low(pin_b3);
 sayac=0;
 printf("motor stop \n\r");
 }
 }
}
   }
hocam kodu böyle degıstırdım motor cıkıslarını tımerlerı b portuna attım cok sagol nasıl gozumden kacmıs ya. su an serial duzgun calısıyor ama timer düzgün çalışmıyor timer ledi bir kere yanıp sönüyor neden olabilir ? bunu halledeyım sonra rda ile yapıp bu kalabalıktan kurtulacam