rs232 sorunu..

Başlatan alperyazir, 26 Nisan 2012, 01:02:42

alperyazir

herkese merhabalar. önce i2c ile denemiş olduğum devremi tavsiye üzerine rs232 ile yapmaya başladım ama nedense bi türlü  çalışmıyor. bi bakrmısınız hatam nerde??
//verici
#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];
  // klavye isminde 80 üyeli bir dizi tanımlanıyor

#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********/

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

}



isis şemasıda şu şekilde :http://g1204.hizliresim.com/w/u/4wyx9.png




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 dekarakterleri aynı görevi yapacak. 2 haftadır uğraşıyorum lütfen bi yardım...

Salih

Kesmenin içindeki
disable_interrupts(int_rda);

satırı iptal ederek deneyin.

skara1214

#2
bilgisayardan gelen verileri diğerlerine yolluyorsunuz değilmi?Örnek bir kod ekliyorum diğer picleri kontrol etmeden bilgisayar ile konusturun ilk olarak....
#include <16f877.h>
#fuses XT,NOWDT
#use delay( clock=4000000)
#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1) 
char   klavye[80];
#int_rda   
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.
   printf("\n\rYazdiginiz Metin>  %s\n\r",klavye);
  enable_interrupts(int_rda); // int_rda kesmesi aktif
}
void main ( )
{
   enable_interrupts(GLOBAL);  // Aktif edilen tüm kesmelere izin ver
   enable_interrupts(int_rda); // int_rda kesmesi aktif
   while(true) ;
}
Herkes ölür ama herkes gerçekten yaşamaz