16f877A ' ya seri porttan data gönderme

Başlatan since1990, 12 Ağustos 2011, 21:12:41

since1990

Arkadaşlar 16f877A ya seri porttan data gönderiyorum yalnız gönderdiğim data düzgün gitmiyor?? MEsela aynı datayı başka bir işlemciden gönderince problem yok. Örneğin Bir pic'in E portuna 3 tane buton koydum.  Seri porttan diğer pice gönderiyorum o picten çıkış alıyorum. YAni bi tanesi input_e(); yi gönderiyor diğeri aldığı datayı output_e(veri); şeklinde gösteriyor. Fakat ne gönderdiği data seriporttan düzgün okunuyor nede göönderdiğim datayı doğru çıkışa aktarıyor. Sizce neden olabilir??
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

kudretuzuner

Amatör

vitruvius

Kodları ve şemanızı eklerseniz daha kolay olur çözümü bulmak.

since1990

#include  <16f877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,bits=8)
int digit=0;
void main(void)
{

set_tris_e(0x00);
  setup_adc(ADC_CLOCK_DIV_2);    
  setup_spi(SPI_SS_DISABLED);    
  setup_timer_0(RTCC_INTERNAL);   
  setup_timer_1(T1_DISABLED);   
  setup_timer_2(T2_DISABLED,0,1);   
  enable_interrupts(INT_RDA);  
  enable_interrupts(global);
while (1)
{

output_e(digit);
}}

#int_rda
void rs232_kesme()
{ digit=getc();}

picin programı bu kadar basit. Seriporttan data gönderirkende şu programı kullanıyorum.
http://slydiman.homeip.net/download/comm/commtest.zip

Şema olarak elimde yok yalnız şöyle söyleyebilirm pic->max232->Pc
yani devrenini o kısmında bir problem yoktur diye düşünüyorum ama çözüm bulmazsa onuda çizer gönderirim.
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

iyildirim

Alıcı aynı kodla bir başka PICden geleni alıyor, PC den geleni almıyorsa, ya baud rate ler tutmuyor, ya PC tarafında flowcontrol kapalı değil, ya PC deki program hatalı yada PC->max232->PIC kısmında hata var.
Bir diğer ihtimalde bağlantının cross olmamasıdır. Veya hem seri kabloda hemde devre üzerinde cross olması olabilir. Ki seri kablo cross ise max232 nin bağlantılarıda kontrol edilmeli.


since1990

Bugün sağlıklı bir biçimde data gönderebildim bir adet LCD bağladım pice gönderdiğimdatayı onun ekrarnında okuyorum. Ama şimdi şöyle bir olay var ben pcden 10 gönderiyorum o 118 anlıyor yani benim gönderdiğim sayı + lcd ekrandaki sayı 128 ediyor. Sanki birbirlerini 128 e tamamlıyorlar. Bu parity ile alakalı bir durum mu?
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

iyildirim

Eğer 10'u  1 ve 0 yani 49-48 değilde bir byte lık gönderiyorsanız,
Parity değilde sinyal polaritesi hatalı ve gelen değer unsigned char değil, char bir değişkene aktarılmış gibi birşey olabilir.

Ayrıca bu gelen değeri LCD ye yazdırırken de hata olabilir. 

Kod olursa sallamak yerine yorum yapmak mümkün olabilir.

since1990

#include  <16f877A.h>
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
#use delay(clock=4000000)
#include<LCD420.C>// lcd fonksiyonlarının bulunduğu dosyayı çağırıyoruz.
#use rs232(baud=9600,PARITY=E, xmit=pin_c6, rcv=pin_c7)


 int sayac=0;
 int get=0;
void main(void)
{
 setup_adc(ADC_CLOCK_DIV_2);    
  setup_spi(SPI_SS_DISABLED);    
  setup_timer_0(RTCC_INTERNAL);   
  setup_timer_1(T1_DISABLED);   
  setup_timer_2(T2_DISABLED,0,1);   
  enable_interrupts(INT_RDA);  
  enable_interrupts(global);

set_tris_e(0x00);
set_tris_a(0xff);
lcd_init();
delay_ms(100);
lcd_putc("\f");

while(1)
{

delay_ms(500);
lcd_gotoxy(1,2);
printf(lcd_putc,"Alinan Data:  %3d",get);
lcd_gotoxy(1,3);
printf(lcd_putc,"%3d Data Alindi.",sayac);
output_low(pin_E0);

if (input(pin_A0))
{while (input(pin_A0))
{}
putc(sayac);
}



}
}
#int_rda
void rs232_kesme()
{output_high(pin_E0);
sayac++;
get=getc();

}

Buradaki kodalrdanda anlaşılacağı gibi pcden gönderdiğim sayıyı LCD de gösteriyor. Kaç data aldığınıda A0 daki butona basınca PC ye gönderiyor. Yani bu programın amacı sayılar doğrumu gidiyor. Sayılar biraz tuhaf gidiyor. COMMTEST programında parity:space yi seçince gönderdiğim data istediğim gibi gidiyor. Sizce hata nedir. Şuanda aralarında MX491 entegreside var 2 max 491 var. Sizce bu max491 ler datanın 300 metre boyunca taşınmasını kesinleştirirmi? Cat5 Kullanacağım arada?? Giden datada 2 kablo ile gidiyor gelen datada 2 kablo ile geliyor.
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

iyildirim

Sayıların tuhaf gitmesi nasıl oluyor. Örneğin 10 gönderince karşıda hep 118 mi görünüyor, yoksa farklı farklı sayılarmı.
Önceki varsayıma göre polarite için max491 in invert-noninvert bağlantılarını kontrol edin diyeceğim ama Parity kodda even denmiş. Siz pc tarafında space dediğinizde hiç sorunsuz, gönderilen tüm datayı doğru olarak alıyorsanız ve 10 gönderip, 118 alma sorunu bu kod ile oluşuyorsa varsayımlarım hatalı.

Mesafe konusunda ise max491'i bilmem ama sanırım sorun çıkarmaz. Sadece kablolamada pair'lere dikkat edin diyebilirim.

since1990

Tuhaf demek yanlış oldu sanırım. A yazıp gönderince hexal olarak 118 oluyor. Ama parityi sapace yapınca A yazınca LCD de 10 görünüyor. MAx491 yokkende böyleydi. Varkende böyle. Birde max487 var mesela o iletimi 2 kablo ile yapıyor. 491 4 kablo ile 2 gidiş 2 geliş. Bunların bi artısı var mı?
"Dinlenmemek üzere yola çıkanlar asla yorulmazlar. Türk gençliği, gayeye, idealizme durmadan ve yorulmadan yürüyecektir. Bütün ümidim gençliktedir." Mustafa Kemal Atatürk

iyildirim

Parity pc de even iken A yani decimal 65, pic de  118 oluyor, pc de parity space derseniz de 10. Doğrumudur. ?
Peki hiç parity kullanmadığınızda ne değerler alıyorsunuz?.

487 half dublex. 491 full. Datasheetde detayı var.