rs232 problemim

Başlatan koordinat, 11 Şubat 2009, 08:40:57

koordinat

sabaha kadar uğraştım bi sonuç yok.
arkadaşlar rs232 ile aşağıdaki kodu yazdım.güzel bi vc# programı çalışmadı bende hyperterminal de bağlantı kurdum.güzel 9600,8,flowcontrol:none falan yaptım
zınk diye karşılama ekranı geldi fakat c5 pinin yaktıktan sonra  "gets(klavye);" komutunda takılı kalıyor galiba.hyperterminalde yazdığım karakter anlaşılınca hemen kesme atıyor ve c5 pinini yakıyor daha sonra input bekliyor.naparım nasıl ederim yardım?hata bende mi?
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

char klavye[80];

#int_rda   //RX ucuna data gelince oluşan kesme
void serihaberlesme_kesmesi ()
{
disable_interrupts(int_rda);  //int_rda kesmesini pasif yap
output_high(pin_c5);
//delay_ms(500);
gets(klavye);                    //metni al ve "klavye"adlı dizi değişkenine aktar
printf("\n\rYazdiginiz Metin>  %s\n",klavye);//satir atla yeni satir,rs232 üzerinden klavye string yolla satir atla
output_low(pin_c5);
//delay_ms(500);
printf("\n\rKlavyeden bir metin girin ve entera basin>");
}
void main()
{
   setup_psp(PSP_DISABLED);
   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);
   output_low(pin_c5);
   
   printf("\r********Merhaba********");
   printf("\n\rKlavyeden bir metin girin ve entera basin>");
   enable_interrupts(GLOBAL);
   
   while(1)
   {
      enable_interrupts(int_rda);
   }
   }


mucit07

alma pinini yanir rcv yi 1k ile +5 volta cek

ferdem

Merhaba. Öncelikle şunu belirteyim while içinde enable_interrupts(int_rda);  yazmaya ve kesme alt programının ilk satırındaki disable_interrupts(int_rda); komutlarına gerek yok. Siz kesmeyi kurun, kesme geldiği zaman RCIF 1 olur kesme alt programına gidilir. getc() ile datayı aldığınızda RCIF donanım tarafından temizlenir ve kesme alt programı icra edilir. Yani sizin ne RCIE ne de RCIF i düşünmenize gerek var.

Alıntı Yap//RX ucuna data gelince oluşan kesme
Yorum olarak da yazmışsınız. Bu alt program her data geldiğinde çalışır, siz ise bir metin göndermek istiyorsunuz. Bana burda gets() komutu uygunsuz geliyor, getc() ile gelen verileri teker teker alıp klavye[] dizisine kendiniz yerleştirin. Enter a basıldığında da son olarak string sonlandirma karakteri 0 ı ekler metni almış olursunuz. Daha sonra
printf("\n\rYazdiginiz Metin>  %s\n",klavye);

ile stringi ekrana basabilirsiniz. İyi çalışmalar.

iyonosfer

gets() kullanılabilir, gets() fonksiyonu da getc ile 13 (ENTER) karakterini görene kadar okuma yapıyor. Böyle bir uygulama yapmak için kesme kullanmana gerek yok
while(true)
{
    printf("\n\rKlavyeden bir metin girin ve entera basin>"); 
    gets(klavye);
    printf("\n\rYazdiginiz Metin>  %s\n",klavye)
 

}


illa da kesme ile yapmak istiyorsan, ferdemin dediklerini dikkate al. (enable disable konusu). RDA kesmesi içerisinde karakterleri getc ile tek tek okutup (13 karakteri gelene kadar) ekrana bastırabilirsin.

kolay gelsin
Blog Sayfam: www.teknobakis.com

koordinat

çok teşekkürler ilgilendiğiniz için ama ccs de yeni olduğumdan tam anlayamadım.şöyle yaptım

klavye1=getc();                    //metni al ve "klavye"adlı dizi değişkenine aktar
printf("\n\rYazdiginiz Metin>  %s\n",klavye1);

Yazdiginiz Metin>  
yani herhangi bir tuşa basar basmaz girdi kabul ediyor(enter a basmadan) ve çıktı olarak gösteremiyor.nedir olay anlamadım.

koordinat


ferdem

Ben kodunuzu birkaç küçük değişiklik yaparak denedim, proteusta gayet güzel çalıştı:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

char klavye[80];

#int_rda   //RX ucuna data gelince oluşan kesme
void serihaberlesme_kesmesi ()
{
output_toggle(pin_c5);
//delay_ms(500);
getc(klavye);                    //metni al ve "klavye"adlı dizi değişkenine aktar
printf("\n\rYazdiginiz Metin>  %s\n",klavye);//satir atla yeni satir,rs232 üzerinden klavye string yolla satir atla
output_low(pin_c5);
//delay_ms(500);
printf("\n\rKlavyeden bir metin girin ve entera basin>");
}
void main()
{
   setup_psp(PSP_DISABLED);
   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);
   output_low(pin_c5);

   printf("\r********Merhaba********");
   printf("\n\rKlavyeden bir metin girin ve entera basin>");
   enable_interrupts(GLOBAL);
   enable_interrupts(int_rda);
   
   while(1)
   {}
  }


İyi çalışmalar.

berkay_yalan

yukarıdaki kodda portc'nin 5. biti boş neden 0 yapma gereği duydunuz?

output_low(pin_c5);


ve bu kodu kullanmak için özel bir tanımlamamı yapmak gerek ben kendi kodumda kullanamıyorum hata veriyor

gallavi

PIC bilgisayardan seri karakterler alırken bazen PC nin hızına yetşemeyebiliyo ve karakter taşması ve frame hatası oluşa biliyo onun için her karakter okumadan önce şu 2 hata bitini kontrol ettirip eğer hata oluşmuşsa bunu temizlemek gerekiyor yoksa yeni karakterler okunamıyo bunun için rx interrup rutininin içine şunu eklemeniz gerekir
if(FERR || OERR){CREN=0;c=RCREG1;FERR=0;OERR=0;CREN=1;return;}


Not : Ben CCS nin hazır uart komutlarını kullanmıyorum genelde hata oluştuğunda mudahale imkanı pek olmuyo getc fonksyonu belki frame ve taşma hatası kontrolü yapıyodur header dosyalarına bakmak lazım
DemirHan=gallavi;

koordinat

hocam bunlar nedir yahu programa ekleyince haliyle bi sürü hata verdi.ccs karşılığı yokmu bu kodların.evet pic bilgisayardan gelen verileri yakalayamıyor gibi.sürekli tuşa basıyorum bu seferde abuk subuk karakterler çıkıyor ve kitleniyor pic.
Alıntı yapılan: "gallavi"PIC bilgisayardan seri karakterler alırken bazen PC nin hızına yetşemeyebiliyo ve karakter taşması ve frame hatası oluşa biliyo onun için her karakter okumadan önce şu 2 hata bitini kontrol ettirip eğer hata oluşmuşsa bunu temizlemek gerekiyor yoksa yeni karakterler okunamıyo bunun için rx interrup rutininin içine şunu eklemeniz gerekir
if(FERR || OERR){CREN=0;c=RCREG1;FERR=0;OERR=0;CREN=1;return;}


Not : Ben CCS nin hazır uart komutlarını kullanmıyorum genelde hata oluştuğunda mudahale imkanı pek olmuyo getc fonksyonu belki frame ve taşma hatası kontrolü yapıyodur header dosyalarına bakmak lazım

kostebek

koordinat arkadaşım. Tam olarak yapmak istediğiniz nedir onu söyleyin de ona çalışalım.

Durum şu siz klavyeden bir tuşa basınca kesmeye gidip input bekliyoru ve siz klavyeden ENTER a basınca seçili değişken yazıdılıyor ve kesmeden çıkıyor olay bu ?.

Siz ne istiyorsunuz. Bu programı yapmıştım oradan biilyorum.

koordinat

çalışmıyorki arkadaşım.çalışsa okey zaten niye burda kıvranayım.sürekl bir tuşa basıyorum algılasın diye oda belli zaman sonra saçma sapan iki tane karakter gösteriyor.
hem ben bunu geliştirip bilgisayardan girdiğim komutlara göre bazı fonksiyonları açıp kapamasını isteyeceğim daha bu aşamada sorun yaşıyorum ki gerisini siz düşünün.

gallavi

Yukardaki kodda CCS kodu ama FERR ve OERR tanımlı değildir. Onlarıda kendim tanımlamışım :)

Aşşağıdaki satırları main den önce header dosyalarından hemen sonra bi yere ekle  


16f877 için

#bit   FERR     = 0x18.2
#bit   OERR    = 0x18.1
#byte  RCREG1   = 0x1A



şeklinde tanımlanacak c uart dan alınan datanın okunduğu herhangi bi değişken ismi eğer onu okutmaz isen bazı bitleri değiştiremeyebilirsin kendin hangi değişkeni kullanıyorsan onu adıyla değiştir veya yeni bitane tanımla
DemirHan=gallavi;

kostebek

O zaman şöyle diyeyim ki sorun  donanımında ya da hyperterminal ayalarında çünkü bundan 2 hafta önce ben denemiştim ve tıkır tıkır çalışmıştı bu da video:

http://www.youtube.com/watch?v=e903_6xz-kM

koordinat

yok yaw sorun yazılımda eminim

@gallavi
verdiğin kod hala hatalı bi daha bakabilirmisin