rs232 sorunu..

alperyazir

Üye
Katılım
25 May 2011
Mesajlar
3
Puanları
1
Yaş
34
3 pici rs232 ile haberleştirmeye ihtiyacım var yazıdığım kodalar şu şekilde ama nedense yanlış çalışıyor. bi bakarmısınız yanlışlarım nerede ,??

bu arada benim istediğim rs232 terminaldeninden girdiğim harflere göre(a,b,c,d) ile ledleri kontrol etmek. örneğin a girdiğimde 1. picteki ledi yakmak b girdiğimde söndürcek. 2 .alıcı içinde c ve d karakterleri aynı görevi yapacak. 2 haftadır uğraşıyorum lütfen bi yardım..



/************************verici***********************/
Kod:
#include <16f877.h> 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232 (baud=9600, 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
   output_high(pin_c5);  // RC5 çıkışı lojik-1
   gets(klavye); // String ifadeyi al ve "klavye" adlı dizi değişkenine aktar.
   printf("\n\rYazdiginiz Metin>  %s\n",klavye); // Satır atla, yeni satır,RS232 üzerinden klavye string ifadesini gönder,satır atla
   if(klavye[0] == 'a'){output_high(pin_b0); output_low(pin_b1); putc('a');}
   if(klavye[0] == 'b'){output_high(pin_b0); output_low(pin_b1); putc('b');}
   if(klavye[0] == 'c'){output_high(pin_b1); output_low(pin_b0); putc('c');}
   if(klavye[0] == 'd'){output_high(pin_b1); output_low(pin_b0); putc('d');}
   output_low(pin_c5); // RC5 çıkışı lojik-0
   printf("\n\rKlavyeden bir metin giriniz ve enter tusuna basiniz>"); // Satır atla, yeni satır,RS232 üzerinden belirtilen metni gönder
}

/********* ANA PROGRAM FONKSİYONU********/
Kod:
void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı


   output_low(pin_c5); // RC5 çıkışı ilk anda sıfırlanıyor
   set_tris_c(0b10000000);
   set_tris_b(0x00);
   output_b(0x00);


   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver


   while(1) // Sonsuz döngü
   {
      enable_interrupts(int_rda); // int_rda kesmesi aktif
   }
}




/**************************alıcı1******************/
Kod:
#include <16f877.h> 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
char al;
void main()
{


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);


set_tris_c(0b10000000);
set_tris_b(0x00);
set_tris_a(0x01);
output_b(0x00);
while(1){


al=getch();
if(al=='a') output_high(pin_b0);
if(al=='b') output_low(pin_b0);


}


}


/**************************alıcı2******************/
#include <16f877.h> 
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)
char al;
void main()
{


   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);


set_tris_c(0b10000000);
set_tris_b(0x00);
set_tris_a(0x01);
output_b(0x00);
while(1){


al=getch();
if(al=='c') output_high(pin_b0);
if(al=='d') output_low(pin_b0);


}


}
 
Proteus bilmem ama alıcılarda kristal olmaması normal mi?
 
Merhaba
.asm olarak isterseniz yardımcı olabilirim.Kolay gelsin.
 
olabilir hocam çokta makbule geçer ama kodları ilerde değiştirmem gerekecek proje için bu en basit manada denemek için yapıldı. eğer kodları paylaşabilirseniz o benim için daha iyi olur ayrıca isis şemasında yanlışlık felan varsa yorumlarınızı beklerim
 
Son düzenleme:
Merhaba
Avatarımda profesyonel yazdığına bakmayın.Amatörüm.PIC öğrenirken 16f628A ile başladım 16F877 atladım 18f4550 ile devam etmekteyim.Bu bakımdan 877'nin memory ve registerleri hakkında pek bilgim yok data şitine bakmak lazım.Ama asm ile yazdığım için 877'ye uyarlamak kolay olur düşüncesindeyim.Ben size PC'den PIC'e (virtual terminalden)istediğiniz datayı yollayıp PIC'te ilk low bitlerini görebilirsiniz,ayrıca da PIC'ten PIC'e yazılım gereği(klavye 1 bir Hex'31' yollayıp diğer PIC'te görebilirsiniz.Umarım,bu mantık çerçevesinde yazılımları da inceleyerek istediğiniz tasarımı yaparsınız.Kolay gelsin.
 

Yeni mesajlar

Forum istatistikleri

Konular
127,963
Mesajlar
913,931
Kullanıcılar
449,609
Son üye
cherrywine

Yeni konular

Geri
Üst