kafayı yemek üzereyim rs232 delirtti beni

Başlatan huskapukaya, 24 Şubat 2009, 13:50:10

huskapukaya

herkese selamlar.
arkadaşlar ben rs232 üzerinden pic16f877a yı pc ile haberleştirmeye çalışıyorum. ama öyle bir sorunla karşı karşıyayımki kafayı yemek üzereyim. pic den pc ye (hyper terminal e) data gidiyor ama pc den pic e hiç birşey gitmiyor.
haberleşme için maxim in max232epe entegresini kullanıyorum. entegrenin datasheetinde yazdığı gibi 1ve 3 pinleri ile 4 ve 5 pinlerini 1uf lık kapasitörlerle birleştirdim. ayrıca 2.pinle +5v arasına ve 6. pinle GND arasına 1uf lık kondansatörler koydum. ayrıca birde 15. ve 16. pinler arasına bir adet 1uf. tx ve rx bağlantıları doğru(hem pic tarafında hem pc tarafında) elimde 5 adet max232epe var hepsindede aynı sorunu yapıyor. ayrıca 3 farklı piclede denedim. 1uf lık kapasitörler yerine 10uf da kullandım hatta 0.1uf bile kullandım.
css de yazdığım test kodu şöyle:

#include <16f873A.h>     

#fuses hs,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
#use delay (clock=20000000) 
#use rs232 (baud=2400, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,ERRORS )
#include <stdlib.h>
#include <string.h>

char test[]="seriport testi";

char bilgial[5];
#int_RDA
void serialim()
{
restart_wdt();
fgets(bilgial);
fputs(bilgial);
disable_interrupts(int_RDA); 

}



void main ()
{
   
   setup_spi(SPI_SS_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);         

enable_interrupts(int_RDA); 
   enable_interrupts(global); 

  
   

   output_b(0x00); 
   
   printf("\n\r***********************************");
printf("\n\r     seriport testi baslangici  ");


output_high(pin_b7);

   while(1) 
   {
 enable_interrupts(int_RDA); 
fputs(test);

delay_ms(1000);
   }
}


bu kod proteus da normal çalışıyor. ama devreyi breadboard da kurunca sağlıklı çalıştıramadım bir türlü. hyper terminalde "seri port testi" yazısını her saniyede bir okuyorum klavyeye basınca pic kesmeye gidiyor gibi görünüyor  ama yazdığım şey bana geri dönmüyor. bu arada kesmeyi kaldırıp denedim gene fayda etmedi. hyper terminalden pic e hiç birşley gitmiyor. işin komik tarafı bir hafta önce aynı devre elemanları ile vede aynı devre şeması ile deneme yaptığımda bu sorunu yaşamamıştım. zaten beni çıldırtanda bu. yani 1 hafta önce çalışan şey niye şimdi çalışmaz? yani çalışmıyorda değil aslında. sadece tek yönlü çalışıyor. bir bilen varsa lütfen bir cevap...

Salih

#include <16f873A.h> olarak yazmışsın ama 16F877 kullanıyorum diyorsun.

Pin_C7 yi giriş olarak ayarla.

Kesme yordamı içinde en son satır olarak
clear_interrupt(int_RDA); yaz


Elinde osilaskop varsa PC veri gönderirken sinyali takip et. Max232 nin ilgili ucuna geliyormu. Orası tamamsa pic in ilgili ucuna geliyormu diye bakarsın. Belki donanımsal problemde vardır.

aliveli

kesmenin içinde kesmeyi enable disable etmemelisin birde programını daha basitleştirerek dene mesela aşağıdaki gibi

#include <16F877A.H>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

#int_rda
void rda_isr(void)
{

putc(getc());

}   

//========================
void main()
{

enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(1);
}

huskapukaya

16f877a yazmışım yani A küçük. pin_c7 de zaten giriş olarak ayarlı.Aslında sorun kesmeyle ilgili değil(en azından ben öyle düşünüyorum) çünkü kesmeyi kaldırdığımdada aynı sorunla karşılaşıyorum. sorun bana donanımsal gibi geliyor zaten o yüzden forumun css c kısmına değilde buraya yazdım bu konuyu. (umarım yanlış olmamıştır)
ayrıca hem max232 ye pc den gelen ve giden hemde pic e gelen ve giden bacaklarda voltaj değerlerini okuyorum.(osiloskobum yok sadece volt metrem var) pic tarafında hem tx de men rx de yaklaşık 5 er V okuyorum max232 nin öbür tarafındaysa(pc ye bağlıyken) yaklaşık 9-10V gibi değerler görüyorum. oralarda bir problem yok gibi.

aliveli arkadaşımızın kodunuda denedim olmadı. yani aslında problemin ne olabileceğine dair küçük bir ip ucu bile belkide sorunu çözebilir. farkındayım herşey olabilir ama belki daha önceden böyle bir şeyi tecrübe etmiş birisi bir örnekleme yapabilir lütfen yardım...

ttronik

#include <16f873A.h>      

#fuses hs,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=20000000)
#use rs232 (baud=2400, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1,ERRORS )
#include <stdlib.h>
#include <string.h>

char test[]="seriport testi";

char bilgial[5];
#int_RDA
void serialim()
{
restart_wdt();
fgets(bilgial);
fputs(bilgial);
disable_interrupts(int_RDA);
}



void main ()
{
   
  setup_spi(SPI_SS_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);          

enable_interrupts(int_RDA);
  enable_interrupts(global);

 
   

  output_b(0x00);
   
  printf("\n\r***********************************");
printf("\n\r     seriport testi baslangici  ");


output_high(pin_b7);

  while(1)
  {
enable_interrupts(int_RDA);
fputs(test);

delay_ms(1000); //  Bu satır seri data geldiğinde kesme oluşmasını engeller. Bunun yerine farklı bir gecikme döngüsü hazırlarsan sorunun çözülebilir.
  }
}

aliveli

hyper terminal yerine birde serial port terminal programıyla dene genede çalşmazsa devrende hata var demektir
program: http://www.bcweb.hu/terminal.zip

ahmet2004


Tagli

Zamanında C# ile PIC'e veri yollama denemesi yazmıştım. Bu başlıktan ulaşabilirsin. Belki işine yarar.
Gökçe Tağlıoğlu

ipek

rx ve tx pinlerini pic'ten ayır yada soketli ise pic'i sök soketin ilgili rx tx ayaklarına mini bir jumper tak hyper terminalde hand shake ayarlarını kontrol et close up pozisyonunda yazdığını alman lazım .donanımı böyle kontrol edebilirsin ikinci şık ise nadiren başa bela olur yollanan bilgi max232 buffer'i tarafından evrilir (invert) yazılımda düzeltilmesi gerekebilir..

huskapukaya

selamlar;
ipek arkadaşımızın dediği gibi pic in takılı olduğu soketde rx ve tx uclarını bir jumper la birleştirdim. ve hyper terminalden yazdığımı aldım sanırım bu hardware olarak bi sorunum olmadığını açıklıyor.(öylemi? ) öyleyse yazılımda problem var demektir ama çok faklı yazılımlar denedim genede olmadı. complier ı değiştirdim gene olmadı. hakkaten yakında kafayı çizecem o olacak.

mesaj atan tüm arkadaşlara teşekürler buarada...

ORC

Alıntı yapılan: "ttronik"#include <16f873A.h>      

rrupts(int_RDA);
fputs(test);

delay_ms(1000); //  Bu satır seri data geldiğinde kesme oluşmasını engeller. Bunun yerine farklı bir gecikme döngüsü hazırlarsan sorunun çözülebilir.
  }
}

gecikme koyma ile interruptın gelmesinin engellenmesi picbasic de olan bişey diye biliyorum(hatta onu da gerekli asm kodlarını gomerseniz asabiliyorsunuz) ccs den pek anlamam  ama hitech de gecikme olsada interrupt zamanı geldiğinde yada gerceklestiği anda olusur :roll:

huskapukaya

problemim gecikme ile ilgili değil.
yani sanırım benim bu max232 ile ilgili olan invert sorununu aşmam lazım çünkü sorun bu gibi görünüyor  ama buna dair hiç bir şey bilmiyorum.

ahmet2004

Alıntı Yap
faklı yazılımlar denedim genede olmadı.


Şunu dene bakalım.
Birde enerji verdikten sonra işlemciye reset at unutma.
İşlemci bazen doğru başlayamıyor o yüzden.

#include <16f876A.h>      

#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 
#use delay (clock=20000000,oscillator=20M) 
#use rs232 (baud=2400, xmit=PIN_C6, rcv=PIN_C7, BITS=8, PARITY=N, STOP=1,ERRORS ) 
#include <stdlib.h> 
#include <string.h> 

char bilgial[10];

#int_RDA 
void serialim() 
{
   fgets(bilgial); 
   fputs("INT'ten CIKIS");
   output_low(pin_b7);
} 

void main () 
{
   char c;
   char test[]="seriport testi";
   

   setup_spi(SPI_SS_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);
   
   enable_interrupts(int_RDA); 
   enable_interrupts(global); 

   output_b(0x7F); 
    
   printf("\n************************************\n\r"); 
   printf("\n*    seriport testi baslangici     *\n\r"); 
   printf("\n************************************\n\r");

   output_high(pin_b7); 

   while(1) 
   {
      output_high(pin_b7);
      delay_ms(500);
      fputs("Pic'ten CIKIS");
   } 
}

transistor

kardeşim benim,

ccs bilmiyorum yazılımında bi sorun yok diye kabul edersek donanımsal olarak ;

ipek'in dediğini yapıp hyper terminalde yazdıklarını geri aldıysan pc tarafında problem yok demektir.

max 232 nin hangi bufferını kullanılıyorsun bilmiyorum fakat
ahmetin verdiği şemadaki gibi 12 nolu pinden çıkış alıyorsan

ve pc den bişey göndermediğin zaman 877 nin 26 nolu pininde 5 v görüyorsan max'da da sorun yok ve senin pic interrupta girmiyor demektir bundan sonra 877 nin 26 nolu pinini voltmetreyle ölç. pc den gönderme yaptığın zaman 26 nolu pinde 0 ile 5 v arası bi değer okuyorsan buraya kadarda problem yok demektir

bide invert olayını açıklamış arkadaşlar ben katılmıyorum bu konuya
invert olmazsa zaten max ın bi anlamı olmaz

bundan sonra tekrar yazılıma dönüp onda da ki proteusta çalışıyor diyorsun o zaman geriye board da bi temasssızlık vardır ki böyle bişey var gibi görünüyor

bide unutmadan senin şuanki şemanı koyarmısın afaki konuşmayalım
Herşey Vatan İçin.

huskapukaya

sorun çözüldü;

arkadaşlar öncelikli olarak hepinize teşekür ederim. Vermiş olduğunuz cevaplar benim için oldukca yol gösterici oldu. sizlerin önermiş olduğunuz herşeyi tek tek denedim. tekrar tekrar teşekür ederim.

sorunumu ben mi çözdüm yoksa kendiliğindenmi çözüldü bilemiyorum. en son yazdığım programı şu hale getirdim:
#include <16F873A.h>
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=20000000)
#use rs232 (baud=9600, xmit=PIN_c6, rcv=PIN_c7, BITS=8, PARITY=N, STOP=1 ) 
#include <stdlib.h>
#include <string.h>
char c ;



void main()
{

 output_high(pin_b7);
printf("%s","deneme");


while(1)
  {

  output_high(pin_b7);
c=getc();
putc(c);

   
  }
  }


ama tabiii bu basit kodda bi işe yaramadı. çalışmadı yani. 3 tam gündür bu sorun üzerinde uğraşıyorum vede sonunda çok ilginç bir şekilde son buldu. benim bilgisayarıma bağlı bir ups vardı onu çıkarttım aradan ve +5V power supply ile bilgisayarı aynı pirize taktım. çataa oldu. yani diyeceksinizki ne alaka? keşke bende anlamış olsam alakayı. yani ya raslantısal olarak denk geldi yada bir alakası var. ama ben çözemedim. bir bilen varsa söylerse güzel olur vala.

sonuç itibari ile sonunda pic ile pc yi konuşturmayı başardım. yani 3 günlük sinir sitres bitti. ama sorun neydi acaba hala merak ediyorum. yorumlarınızı bekliyorum...