Arkadaşlar merhaba, SN75176 ile yaklaşık olarak 200 metre içerisinde 16 cihazla haberleşmeye çalışıyorum. Sonlandırma direnci 120 ohm takılı ve DATA A VCC'ye 2k2 ile DATA B de GND'ye 2k2 ile bağlı. Kullandığım PC Programında sistem cihazlar ile 300 ms içinde bağlantı kurmaya çalışıyor. Yani önce 1. cihazın bilgisini gönderiyor ve 300 ms içinde ondan bir cevap bekliyor, cevap gelmezse cihaz çalışmıyor diye uyarı veriyor. sonra 2, 3., 4. ..... cihazın sorgulamasını yapıyor. sistemi takıp çalıştırdığımda 16 cihazın her birinden sinyal alıyorum, ancak 5 dakika sonra cihazlarla iletişim yavaş yavaş kopmaya başlıyor, önce bir cihaz gidiyor, 5 dakika sonra başka bir cihaz derken, yarım saat sonunda sadece 5-6 cihaz ile haberleşme yapabiliyorum. Gücü kesip tekrar verdiğimde yine 16 cihazla sorunsuz haberleşmeye başlıyorum ve yine 5 dakika sonra yavaş yavaş kopmaya başlıyor. Kısa kablolarla 16 cihazı bağlayınca bir sıkıntı oluşmuyor, ancak hat uzayınca böyle bir sorunla karşılaşıyorum. Bunun sebebi ve çözümü ne olabilir? Konu ile daha önce çalışmış arkadaşlar yardımcı olabilir mi?
Bu 16 cihaz aynı besleme ilemi çalışıyor yada şaseler ortakmı?? Ortak ise 2K2 dirençleri 22K gibi daha yüksek bir değerle değiş ve 120 ohm sonlandırmayı 200m için kullanma..Bakalım sonuç ne olacak..
Balans dirençleriniz yanlış. A ve B hattı için direnç değeriniz ne görünüyor? Teknik dökümanları ve uygulama notlarını incelerseniz, detaylı bilgi mevcut. Muhtemelen toprak sorununuz da mevcut. Asıl kritik noktalardan bir tanesi, direction pinlerini kontrol şekliniz. Haberleşme öncesinde ve sonrasında nasıl bir kontrol yapıyorsunuz? Kullandığınız bağlantı topolojisi nedir?
Isı ile voltaj düşmesi falan yok ise problem yüksek ihtimalle yazılımsal sanıyorum. Başlangıçta temiz haberleşip sonra sekteye uğraması onu gösteriyor.
16 cihazı öncelikle aynı güç kaynağından(12 Volt) besledim ve hattın sonunda 9 volt okudum. bu yüzden hattın ortasında beslemeyi ayırdım ve ikinci bir güç kaynağı kullandım ve bu sayede her bir cihazda 11-12V okudum. cihazların her birinde 7805 var 9 volta düşse bile sorun yaratmazdı ama ben yine de işimi garantiye almak için yaptım bunu. fakat data hattını ayırmadım. balans direnç değerleri dediğim gibi 2k2, uygulama notlarında hesaplamalarla bakınca 2k2 doğru değer değil. bu çok kritik bir değer mi?
şase sorunu da olabilir evet çünkü iki farklı güç kaynağı var ve şaseleri birbirine bağlanmış değil.
120 ohm ile sonlandırmadan da denedim sonuç aynı.
haberleşme esnasında direction pinlerinin durumu ise: sadece gönderme yapacağım zaman tx modedayım onun dışında cihazlar her zaman rx modda data bekliyor.
problemin yazılımsal olması ihtimalini de düşündüm ancak bu 16 cihazı kısa kısa kablolarla bağlayınca bir sıkıntım çıkmıyor, 1 saat boyunca sistemi izledim ve her bir cihaz ile haberleştim. kablo uzayınca sıkıntı çıkmaya başlıyor.
kullandığınız bağlantı topolojisi derken ne demek istediğinizi tam anlayamadım? ancak şema ile gösterecek olursam, şu resimde görüldüğü gibi bağlantı;
(http://imageshack.us/photo/my-images/834/emabw.jpg/)
ve sn75176 ise şu resimdeki gibi bağlı;
(http://imageshack.us/photo/my-images/715/47795495jc6.jpg/)
120 ohm her bir cihazda değil sadece en sondaki cihazda takılı.
haberleşme için standart cat6 kablosu kullanıyorum.
Her yolu denedim ancak sitemi bir türlü stabil hale getiremedim.
Edit OG, resmi biz göremiyoruz
(http://s10.postimg.cc/nxu2ifdyh/47795495jc6.jpg) (http://postimg.cc/)
hosting images (http://postimg.cc/)
Haberleşme hızı nedir?
9600 baud haberleşme, 1200 bauda da denedim ancak 1200 baudda ilginç birşey oluyor, ilk gönderdiğim 3 data sağlıklı gidiyor ancak 4. dataya 240 değeri eklenerek geliyor, yani atıyorum x değişkenine x=30 diyorum, ancak data 240+30=270 şeklinde geliyor, farklı değerlerle denedim hepsinde de 240 eklenerek geliyor. CCS C kullanıyorum.
sisteme 12 Volt 7 Amperlik kameralar için kullanılan güç kaynaklarından bağladım, yani akım sorununu da gerilim sorununu da ortadan kaldırdım.
resmi de imageshackten yüklemeye çalıştım ama görünmüyor, nasıl yükleyebilirim başka
OSC seceneği nedir, dahili mi? Şu bilgileri topluca yazsanız?
İşlemci, hız, osc tip vs vs .....
Alıntı yapılan: jackal183 - 11 Ocak 2012, 19:43:27
1200 baudda ilginç birşey oluyor, ilk gönderdiğim 3 data sağlıklı gidiyor ancak 4. dataya 240 değeri eklenerek geliyor
Senin sorunun belli aslında,bir takım gecikmeler vermen lazım..
txen=1
100ms bekle
data gönder
20ms bekle
txen=0
cihazlardaki işlemci pic16f877a, 16 mhz harici osilator
gecikmeleri de verdim, direk rs485 application noteda yazdığı gibi txen'dan sonra bir data boyutu kadar gecikme verilmesi gerektiği yazıyor, 9600 baudda bu yaklaşık 100 us eder, ben de 10 ms olarak yaptım.
OG Hocam bana kalsa ben burda yazılımı donanımı herşeyi paylaşırım ancak, iş ticari bir iş ve bu gibi şeyleri paylaşmak etik olmaz diye düşünüyorum.
@My75'in söylediğinden yola çıkarak,
Ben RS485 data uçlarını ters polarmalandırıyorum.
(http://s17.postimg.cc/6mz5ngyqn/Ekran_Al_nt_s.png) (http://postimg.cc/)
image hosting gif (http://postimg.cc/)
Böylece hattaki herhangi bir ünite TX Enable edilmemişse (75176 pin 2 ve 3 High olmamışsa), hattı dinleyen ünitelerin RO çıkışı (pin 1) LOW çıkışı veriyor.
Hattaki data bekleyen üniteler belli periyodlarla hattın polaritesini kontrol ediyorlar. Low ise data gönderen yok deyip işine dönüyor. High ise dinlemede kalıyor.
Çünkü,
Gönderecek ünite TX Enb = H yaptığında RO çıkışı High'a döner. My75'in dediği gibi biraz bekleme koyuyorum ki bu H değerini yakalayamayan olmasın diye.
datayı ben putc() fonksiyonu ile teker teker gönderiyorum. bu bir sorun yaratır mı? printf("%c%c%c", data1, data2,data3) şeklinde göndermek mi yoksa putc(data1); putc(data2); putc(data3); şeklinde göndermek mi gerekli? hangisi daha sağlıklı.
Alıntı yapılan: jackal183 - 11 Ocak 2012, 20:44:16
cihazlardaki işlemci pic16f877a, 16 mhz harici osilator
gecikmeleri de verdim, direk rs485 application noteda yazdığı gibi txen'dan sonra bir data boyutu kadar gecikme verilmesi gerektiği yazıyor, 9600 baudda bu yaklaşık 100 us eder, ben de 10 ms olarak yaptım.
OG Hocam bana kalsa ben burda yazılımı donanımı herşeyi paylaşırım ancak, iş ticari bir iş ve bu gibi şeyleri paylaşmak etik olmaz diye düşünüyorum.
Yazdığın dili bilmiyorum ama kullandığın komut eğer her byte tek gönderip peşinden stop gönderiyorsa karmaşa olur..Tüm verileri tek seferde göndermen lazım..
10ms vermekle iş bitmiyor,data gönderdikten sonra yine gecikme verip low yapmak gerekiyor..
Evet çok tuhaf bir durum aslında ama böyle,sanki datalar daha yolda ilerliyormuş ve bu esnada txen low yapılınca datalar bozuluyormuş gibi bir durum söz konusu..
Ben 2400 baud 5 byte veri gönderiyorum bir ürünümde fakat şu gecikmeleri vermezsem sorun çıkıyor..
Txen=1 'Pin 2,3 tx modunda
delayms 100 'Tx modunun tam aktif olması için bekliyor
Data gönder
delayms 20 'Verilerin yol boyunca tam olarak ulaşması için bekliyor
Txen=0 'Pin 2,3 rx modunda..
Alıntı yapılan: OG - 11 Ocak 2012, 20:48:47
@My75'in söylediğinden yola çıkarak,
Ben RS485 data uçlarını ters polarmalandırıyorum.
Böylece hattaki herhangi bir ünite TX Enable edilmemişse (75176 pin 2 ve 3 High olmamışsa), hattı dinleyen ünitelerin RO çıkışı (pin 1) LOW çıkışı veriyor.
Hattaki data bekleyen üniteler belli periyodlarla hattın polaritesini kontrol ediyorlar. Low ise data gönderen yok deyip işine dönüyor. High ise dinlemede kalıyor.
Çünkü,
Gönderecek ünite TX Enb = H yaptığında RO çıkışı High'a döner. My75'in dediği gibi biraz bekleme koyuyorum ki bu H değerini yakalayamayan olmasın diye.
Bir terslik var sanırım,
Bu ters polarmanın Pin1' i low'a çekmesi demek Pic için start demektir..Yani data alınmaya başladığı zaman Pin1 low olur ve sonunda yine high olur..
Verileri tüm alıcılar alıyor,kendi ile ilgili bir durum ise cevap veriyor,şunu atlamamak lazım yazılımı iyi kontrol edin,abuk subuk değerler oluşuyorsa aynı anda 2 veya daha fazla alıcı cevap verebilir,bu çakışmadan dolayı veri bozulur ve her zaman veri alırken zaman aşımı kullanın..Yoksa gürültüden veya başka bir sebeble oluşacak bir bilgi alımı aktif yapar ve kaç byte alınacaksa tamamlanmasını bekler buda sistemi kilitler..
Bir diğer sorun ise özellikle usart kesmede yaşanılıyor,data gönderdikten sonra gecikme verilmeden txen low yapılırsa data ulaşmadan veya yansımadan dolayı pic kendi gönderdiği veri ile kesmeye gidebiliyor..
Bu tip tasarımların kullanılacak max. mesafe ile test edilmesi gerekiyor.
Yazılımsal hatanız olmadığına inanıyorsanız;
1- Master Modülden çıkan A/B sinyal pinleri ile Slavelere girenlerin kontrolünü tekrar yap.Eğer bir tanesinde hata varsa komple hattı bozar.
2- CAT6 yerine CAT5 denedinizmi?
3- Master modül için Pull up ve Pull downları 560 OHM , A/B arasına 130 Ohm deneyin.
4- Tüm dirençlerin 1/4 Watt olmasına dikkat edin
5- Bağlantıların temiz olmasına, özellikle 8P8C kullanıyorsanız iyi bir pense ile bağlantıları sıkıca penseleyin.
Akılıma gelen şimdilik bunlar.
Alıntı YapBu ters polarmanın Pin1' i low'a çekmesi demek Pic için start demektir..Yani data alınmaya başladığı zaman Pin1 low olur ve sonunda yine high olur..
Doğru. Ama ben farklı bir mantıkla kullanıyorum. İletişimde tıkanmaları bu şekilde aştım.
Hat boş zamanlar için hep low da bekliyor.
Alıcı pic'ler asıl işi arasında belli aralıklarla hatta bakıyor, low ise işine geri dönüyor, bir iki saykıllık kayıp süre.
H ise datayı bekliyor. Zaten datanın alınabilmesi için başlangıçta H olmalı ki (true iletişim için) start bite inişi görülsün ve time değerleri doğrulansın. Bekleme süresi de veriyorum, o sürede gelmezse tekrar işine dönüyor.
Datayı gönderen üniteler de zaten başına bir header tanımlama bilgisi eklediğinden ( https://www.picproje.org/index.php/topic,16623.msg109571.html#msg109571 ), alıcı konumundaki öncelikle o bilgiyi bekliyor.
Değişik bir mantık,bu durumda uart donanım nasıl kullanıyorsunuz? Çünkü donanım low'u görür görmez start diyecek 8 bit işleyecek ve stop bekleyecek yani takılacak....Kafam karıştı :D
Sanırım anladım,
Ters polarmadan dolayı tüm alıcıların Ro çıkışları low,herhangi bir ünitenin txen pinleri high olunca polarma değişiyor ve Ro çıkışları high oluyor..Bu durumda siz askerleri bekletiyorsunuz..Doğru anlamışmıyım?? Uart'da sorun olmuyormu?*
UART ile veya yazılımsal farketmez, hat low ise data alışa geçmez geri döner,
high ise
SERIN ..
veya
HSERIN ..
der data bekler.
UART da sürekli alış biti kapalı durur, H görünce açarsınız.
Anladım zaten yukarıda editledim..Peki aykırı bir durum değilmi? Sanırım sadece kendi ürünlerinizde kullanıyorsunuz bu yöntemi? Dmx modüller yapıyordunuz sanırım sorun olmuyormu?
Valla buna kişisel tercih deyin. Belki kulağı tersten tutmak ama, aynı hatta çok ünitenin çift yönlü haberleşmesinde tıkanıklığı ancak bu şekilde çözdüm. Tek yönlü DMX için buna gerek yok ama bende alışkanlık oldu, her iş için hattı ters polarmalandırıyorum. Aynı mantıkla data takip ediyorum.
Alıntı yapılan: OG - 12 Ocak 2012, 18:20:02
Valla buna kişisel tercih deyin. Belki kulağı tersten tutmak ama, aynı hatta çok ünitenin çift yönlü haberleşmesinde tıkanıklığı ancak bu şekilde çözdüm. Tek yönlü DMX için buna gerek yok ama bende alışkanlık oldu, her iş için hattı ters polarmalandırıyorum. Aynı mantıkla data takip ediyorum.
Usart data alımlarınızda (bit banged değil) Kesme kullanıyormusunuz?
Genelde kesme kullanmam, kolay olanı tercih etttiğimden sanıyorum. Kesmede "nerede kalmıştım" meselesini fazla düşünmemek için, yani tenbellikten.
Alıntı yapılan: OG - 12 Ocak 2012, 18:34:54
Genelde kesme kullanmam, kolay olanı tercih etttiğimden sanıyorum. Kesmede "nerede kalmıştım" meselesini fazla düşünmemek için, yani tenbellikten.
Hocam sizin ters polarlama methodu sadece bitbanged alım gönderimlerde çalışır. Gömülü USART modüllü çiplerde data alım - gönderim çalışmaz. Çünkü başlangıç biti yok yani hep sıfıra çekili zaten..
Ama bakın hat LOW ise data alımı ile uğraşmıyorum zaten. High ise Hserin diyorum. USART da sürekli alışta (RCSTA.4 =1) olmak zorunda kalmıyor.
Alıntı yapılan: OG - 12 Ocak 2012, 18:46:12
Ama bakın hat LOW ise data alımı ile uğraşmıyorum zaten. High ise Hserin diyorum. USART da sürekli alışta (RCSTA.4 =1) olmak zorunda kalmıyor.
Hocam siz USART Senkron iletişimmi kuruyorsunuz? Çünkü Senkron iletişimde Start ve Stop bitlerine gerek yok.
Hayır asenkron 8N1, 8N2,
250.000'e kadar çok değişik değerlerde.
RCSTA.4 =1 demekle kastettiğim bunu 0 yaparsanız zaten USART oto alış yapmaz.
Hattı HIGH görünce RCSTA.4 =1 yaparsınız start bitini bekler (RCSTA.4 =0 ve sonra RCSTA.4 =1 yapmak usartı da temizler). Bu bekleyişe de bir miktar süre koyarsanız,
alinmadi = 0
HSerIn 5, bekleme,
- ' 5ms data bekler
return
gibi
bekleme:
alinmadi = 1
return
etiketindede alınmadığını gösterirseniz bir çok işde kesmeye gerek kalmaz
CCS C kullanıyorum, pc'den veriler şu şekilde geliyor:
'A'
delay_ms(1);
'B'
delay_ms(1);
'C'
delay_ms(1);
'D'
delay_ms(1);
'cihazadresi'
ve rx interruptım şu şekilde
#int_RDA
void seri_kesme(void)
{
int data;
data=getch();
if((data==adres) & (gelensayisi==0))
{
gelenveri[gelensayisi++]=data;
// cevapgonder();
}
else if ((gelensayisi==1))
{
gelenveri[gelensayisi++]=data;
}
else if ((gelensayisi==2))
{
gelenveri[gelensayisi++]=data;
}
else if ((gelensayisi==3))
{
gelenveri[gelensayisi++]=data;
}
else if ((gelensayisi==4))
{
gelenveri[gelensayisi++]=data;
datageldi=1;
}
}
interruptan sonra main code şu :
while(1)
{
if(datageldi)
{
datageldi=0;
cevapgonder();
gelensayisi=0;
}
}
cevapgonder fonksiyonum ise şu şekilde;
output_high(txen);
delay_ms(20);
printf("FG%c%c%c", buton1, buton, adres);
delay_ms(20);
output_low(txen);
iletişim için yazılan başka kodları incelediğimde bu çok sağlıklı bir yöntem gibi görünmüyor çünkü checksum yok, ancak benim cihazlarıma veriler sürekli geliyor gidiyor, sistem 16 adet cihazı sırayla soruyor ve 16 dan sonra tekrar başa dönüp yine sormaya devam ediyor.
yazılımda bu kısmı nasıl daha sağlıklı hale getirebilirim?
Bugün hattın en sonuna bir pc daha koydum ve bu pcde sadce com porttan gelen giden dataları inceledim. Hattın başında PC(master)den veriler sürekli ve sağlıklı şekilde geliyor. hattaki cihazlar da yine başlangıçta sağlıklı bir cevap veriyor, ancak kısa zaman sonra bazı cihazlar artık hiç cevap vermemeye başlıyor. Bazen de cevap veriyor ancak bozuk datalar, yani gelmemesi gereken cevaplar geliyor. Ben de bu yüzden sorunun yazılımsal olduğuna kanaat getirdim. Ancak nasıl bir sorun olduğunu çözebilmiş değilim.
pc programı tarafında kodu ilk yazdığımda datalar arasında delay_ms(1); beklemesi yapmamıştım, sistem yine aynı şekilde çalışıyordu. daha sonra acaba dedim cihazlarda rx interruptının içindeyken o anda başka bir veri daha geliyor ve çakışma yaşanıyor olabilir mi? bu yüzden de böyle bir bekleme koydum.
jackal183, kullandığın dili bilmediğimden yardımcı olamıyorum, yanlızca iş üzere kendi kullandığım dilden mantık yürütüyorum.
hocam pc programı tarafında delphi ve gömülü yazılımda CCS C kullanıyorum
Bu tarz sorunları yakından çözmek bile zor olabiliyor, uzaktan daha da zor. En baştan söyleyeyim en kalabalık(!) 485 network üm 4 elemanlıydı ve max kablo uzunluğu 30-40 m idi. Hocam kablo uzadıkça ve hız arttıkça hatta yansımalar görülür, hattın uzunluğu ve elemanların yerleşimine göre yansıyan voltaj dalgaları serseri kurşun gibi nerede nasıl bir bit hatasına yol açar bilinmez. Uzun hatlarda hattın sonuna 120ohm şart, 2K2 ler bana az geldi çünkü 10 ünitede 220 ohma düştü zaten... 220 de aşağıda AC de 110 ohm görünecek. Ben pull up ve down yapmamıştım ama en azından arkadaşların tavsiye ettiği gibi 22K gibi daha yüksek bir değer kullanın.
Sistemde bir süre sonra çalışmayan elemanları fark ediyorsunuz, bu elemanları resetlediğinizde de hâlâ cevap vermiyorlar mı?
Çalışanla çalışmayanın yerini değiştirip tüm sisteme reset ten sonra tekrar gözlediğinizde sabıkalı eleman düzeliyor mu? Sorun yerleşimden mi elemandan mı bakılabilir.
Yazılımı da çok sade yapmışsınız... adresler hatta ünik tek mi? Hatta bir byte adresini gören dizginleri ele alıyor, sonrasında söyledikleri arasında başkasının adresinin olması kazara da olsa ihtimali nedir? Çakışma riski yüksek durumlar bunlar... Standart bir protokolü sisteminize yerleştirin veya kendiniz basitçe bir protokol belirleyin. Bir paket formatı belirleyin, her pakette muhakkak preamble olsun... Benim kullandığım paket formatı ve örnek kodu aşağıya koyuyorum:
#define frame_size 5
// PACKET FORMAT: PREAMLBES(2BYTES):36,36 - DEST(1BYTE) - SOURCE(1BYTE) - PAYLOAD(2BYTES)- CHCK BYTE
// LATCHED FRAME: DEST(1BYTE) - SOURCE(1BYTE) - PAYLOAD(2BYTES)- CHCK BYTE
// COMMAND LIST: PAYLOAD(2 BYTES)
//...
Kesme içeriği:
prev_data=data;
data=getc();
if(data==prev_data && prev_data==36){ //preamble is received, make subsequent bytes be latched
en_latch=1;
return;
}
if(en_latch==1){
frame[frame_index]=data;
frame_index++;
if(frame_index==frame_size){//frame is latched, disable latch and clear index
en_latch=0;
frame_index=0;
if(frame[0]==adres){//the new frame is for me
new_frame=1;
output_toggle(led);
}
}
}
Ana döngüde new_frame i kontrol ediyorum, 1 ise "process_frame" çalışıyor.
PIC UART hardware de adres byte/data byte tanıma gibi bir özellik var ama ben kullanmadım, bakılabilir. İyi çalışmalar, kolay gelsin.
Düzenleme: Kelime hatası düzeltildi. "ünik" ne demek!
hocam her zaman aynı elemanlar sabıkalı değil. reset atıyorum bir üre sonra 5. eleman gitti diyelim, tekrar reset attığımda bu sefer 5. eleman güzel, başka niri gidiyor. sadece sabıkalı elemanı resetlediğimde yine düzeliyor. bu yüzden ben sorunun yazılımdan olduğunu düşünüyorum.
başka bir adresin kazara araya girme ihtimali yok hocam. çünkü her bir elemanın sorgusu 500 ms de bir gidiyor. hem araya başka bir eleman girdi diyelim. ben hattın tamamında giden gelen verileri inceledim, sabıkalı elemandan hiç veri gelmiyor, geldiği zaman da hatalı veri geliyor.
yazılımda checksum ya da crc checksum gibi şeyler yapmayı düşünüyorum ama bunları bilmiyorum braz araştırdım da crc_checksum karışık gibi geldi bana, içinizde iyi bilen birisi bir örnekle anlatabilir mi?
Bak hatalı veri geliyor diyorsun,daha öncede dedim arasıra abuk subuk değerler görürsen muhakkak bir çakışma var bunun başka bir sebebi yok,iyi bir protokol uygula mesela basitçe proton örnek vereyim;
SYMBOL MASTER=1 'Sorgulama yapanın kimliği
SYMBOL SLAVE=2 'Bu modül için bir cihaz kimliği
ADRES=8
BASLA:
Hserin 100,kontrol,[ARANAN,ARAYAN,ADRES,KOMUT]
IF ARAYAN<>MASTER THEN BASLA 'Arayan master değilse başa dön, 1.filtre
IF ARANAN=SLAVE AND ADRES=8 THEN ARANAN_BENIM 'Aranan bu modül işlem yap
GOTO BASLA
kontrol:
Bu bölümde 100ms dilimlerde işlem yapabilirsin..
goto basla
ARANAN_BENIM:
IF KOMUT=1 THEN
ARAYAN=SLAVE
ARANAN=MASTER
KOMUT=5
GOSUB GONDER
ENDIF
GOTO BASLA
GONDER:
TXEN=1:DELAYMS 100
HSEROUT [ARANAN,ARAYAN,ADRES,KOMUT]
DELAYMS 20
TXEN=0
RETURN
END
Ben bu protokole benzer ama daha detaylı 5byte bir protokol oluşturdum,şu an sahada çalışan görüntülü interkom sistemi olarak binlerce modülüm var,bir çok zorluk ve hata yaşadım ama 2 senede yazılımsal olarak şuan tam oturdu..
Sen 16 modül diyorsun şuan 2 blok apartmanda SN75176 ile 150 modül çalışıyor,ne sonlandırma var nede sorun..
Yani biraz uğraştırır ama sonunda olur..
anladım hocam teşekkür ediyorum.
Bugün birinin tavsiyesi üzerine hatta bazı donanımsal değişiklikler yaptım. her bir slavedeki sn75176ının 2k2 lik dirençlerini söktüm, master için bu dirençleri 560 ohm olarak taktım, başlangıca ve en sona da 120 ohm taktım. daha önceden sadece 5-10 dakika sorunsuz çalışan sistem, bu sefer 1 saat kadar sorunsuz çalıştı, ancak yine cevap vermeyen cihazlar olmaya başladı. Bu gelişmelerden sonra ben sorunun yazılımda olma ihtimalini yine eledim. Yani sorun yazılımdaysa madem, benim yaptığım donanımsal bir değişiklik üzerine niye daha uzun süre çalıştı? ve yine sorun donanımdaysa madem, niye 1 saat sonra yine cihazlar cevap vermemeye başladı? resmen bir komplonun içerisine düşmüş gibiyim :) ağlanacak halime gülüyorum
yazılımsal olarak da crc_checksum protokolünü uygulayıp bir de bunu deneyeceğim
Önce moralinizi düzeltin, çözemeyeceğiniz bir problem değil.
Slave den 2K2 yi söküp master da 560R bırakmanız doğru değil. Sökecekseniz hepsini sökün. Hat yansımaları oluşurken, master veya slave diye ayırtetmez. Doğru olan hattın uçlarının açık kalmamasıdır.
Hatta 2 uç var ama, master veya slave uniteler hatta bağlanırken ilave edilen kablo varsa ve bu ek kablo belli bir uzunluğa sahipse (?) bu da hattın üçüncü (dördüncü, beşinci ..) ucu sayılır ve bunlar da açık bırakılmamalıdır, yansımalara sebep olur. Bu bağlantı kablosu çok kısa ise yansıma yapmaz.
bunu sadece bir tavsiye üzerine yaptım hocam, bence de yapılmaması gereken birşey, ama bakınca da sitemin çalışması daha uzun sürdü bir anlamda faydası oldu, ama diğer yandan bakınca da sistem yine gitti ve faydası olmadı gibi :o
İlginç bir problem ama karmaşık değil, adım adım gidilirse çözülebilir. Hattaki üniteleri modifiye etmeniz mümkün mü bilemiyorum ama sistem oturana kadar şu göstergeleri koyabilirsiniz: Her bir ünite çalıştığı esnada 1sn de bir ledi toggle etsin, bu çalışma göstergesi olsun, sistem çalışırken bu ledi gözleyin sekme oluyor mu bakın. Bu led her RX te ve her adres uyuşumu görüldüğünde de tepki versin. RX te 1010 adres uyuştuğunda 111000111000 yapsın mesela... süreleri kendiniz ayarlarsınız. Mümkünse RX ve adres uyuşumu için 2. bir led kullanın.
1 saat sonra X ünitesinden cevap yok. Gidin ünite başına ledi toggle etmeye devam ediyor mu? Sonra X ünitesine sorgu gönderin. RX oldu mu? Adres uyuşma oldu mu?
Olası durumlar:
1) Ünite hiç çalışmıyor, besleme gerilimi düzgün geliyor mu kontrol edilir.
2) Ünite komut gönderdiğinizde RX yapıyordur ama adres uyuşma ledini yakmayabilir... adresi nerede EEPROM da mı tutuyorsunuz?
Çalışmayan X ünitesini hattan çıkarıp direkt bilgisayara bağlayın komutu doğru alabildi mi? Adresini hâlâ doğru biliyor mu?
...
RX de oldu, adres uyuşma da oldu ama geri dönüş yok. Bilgisayarın UART RX ini çalışmayan ünitedeki mikronun TX ine bağlayın UART TX te cevabı görebildiniz mi?
Söylemesi kolay :) Sistem şu an yanımda olsa hemen bu denemelere girişirdim onu da söyleyeyim :) İyi çalışmalar.
hocam bu denemeleri yapmak çalışma ortamında 2 günümü alır :) benim taa en baştan beri aklımda olan şeyler bunlar, her rx geldiğinde ledi 1 saniye yakıp söndürmek ver her doğru veri geldiğinde başka 1 ledi 1 sn yakıp söndürmek ama bunlar çalışma ortamında pek mümkün değil, ama şu dediğinize özellikle hiç bakmadım, "1) Ünite hiç çalışmıyor, besleme gerilimi düzgün geliyor mu kontrol edilir." ben buna hep hattın en sonunda baktım,
"Çalışmayan X ünitesini hattan çıkarıp direkt bilgisayara bağlayın komutu doğru alabildi mi? Adresini hâlâ doğru biliyor mu?"
evet bunu denedim doğru biliyor. çalışıyor
"2) Ünite komut gönderdiğinizde RX yapıyordur ama adres uyuşma ledini yakmayabilir... adresi nerede EEPROM da mı tutuyorsunuz?"
adresi epromda tutmuyorm sadece tek bir değişkene yazıp cihaza gömüyorum.
mümkün olsa da çalışmayan cihazlarda debug yapabilsem belki de sorunu hemen çözeceğim ama bu da mümkün değil
Jackal183 Problemin hala çözülemedi mi?
çözüldü gibi hocam ama iş bitirmeden kesin çözüm oldu diye buraya yazmak istemiyorum, her türlü sıkıntıları ve sıkıntıları nasıl aştığımı tek tek yazacağım buraya diğer arkadaşlar aynı sıkıntıları yaşamasın diye
arkadaşlar sıkıntılarımı çözdüm ve sistemi tamamladım şu an aktif halde kesintisiz çalışıyor. çözümünü şu şekilde yaptım.
1. ilk olarak sizin de dediğiniz gibi yazılımdaki veri alışverişini daha kontrollü yaptım. crc_checksum protokolü ile kontrol yaptım.
2. buna rağmen yine de kopmalar oluyordu, hattaki cihazlar kitlenniiyordu. bu da cihazların yazılımından dolayı oluyormuş, bazı yerlerde taşmalar ve kitlenmeler meydana geliyormuş, bunu da hallettim.
3. buna rağmen yine de sorun devam ediyordu. bu sefer 1200 baudda çalışmaya karar verdim. ancak 16f877a'yı 1200 baudda 20 dakikadan fazla çalıştıramadım. ben de 18f452 ile sistemi yeniden tasarladım. ve bütün sorunlarım çözüldü. yardım eden hocalarıma teşekkürü borç bilirim
@jackal183 Sorunu hallettiğinize sevindim. 877 yerine 452 kullanmışsınız. Peki neden 877 ile böyle bir sorun oldu acaba. birde hat dirençleri olarak 2.2k ve 120 ohmmu kullandınız acaba.
formumuzun en büyük özellikleirnden biri birileri yazar sorar söyler sorun çözülür çözüm yoktur bağlantı kopar...
Alıntı yapılan: EFESU - 26 Ocak 2012, 01:47:30
formumuzun en büyük özellikleirnden biri birileri yazar sorar söyler sorun çözülür çözüm yoktur bağlantı kopar...
Eski Nickiniz ne idi?
Forumun eski müdavimlerinden misiniz?
Otorite kıvamında bir cevap yazmışsınız...
Alıntı yapılan: dnacikaya - 25 Ocak 2012, 21:52:54
@jackal183 Sorunu hallettiğinize sevindim. 877 yerine 452 kullanmışsınız. Peki neden 877 ile böyle bir sorun oldu acaba. birde hat dirençleri olarak 2.2k ve 120 ohmmu kullandınız acaba.
877 nin sebebini çözemedim ama tahminimce CCS C derleyicisi ile ilgili birşey. donanımsal olarak da 2.2k var sadece 120 ohmlar yok
Alıntı yapılan: EFESU - 26 Ocak 2012, 01:47:30
formumuzun en büyük özellikleirnden biri birileri yazar sorar söyler sorun çözülür çözüm yoktur bağlantı kopar...
ne demek istediğinizi ve neden bu başlık altında böyle birşey yazdığınızı anlayamadım?
Sorun çözüldümü çözülmedimi bilmiyorum ama ilk mesajınızdan okuduğum kadarıyla tamamen yazılılımsal bir hata var ortada!!! Daha 4 hafta önce kurduğum bir sistemde 24 adet slave bağlantıda 4 adet en uzak nokta yaklaşık 1100 metre diğerleri 200 ile 600 metre arası değişiyor ve 120r ve 2x 2k2r direnç kullanılarak yapıldı. veri göndermeden önce 100ms bekleme yapıyorum tx enable high yapıyorum ve preamble yaptıktan sonra kendi oluşturduğum bir protokolle veri paketimi gönderiyorum , 100ms bekledikten sonra tx enable low yapıyorum.. Verileri tek tek göndermek ve almak konusunda bir kaç tecrübem oldu en iyisi tek pakette göndermek, tek tek olunca bazen tekteye uğrayabiliyor. Ayrıca belirtmek istiyorum 24 adet slave cihazımın hepsi farklı güç kaynağı kullanıyor, hatta kimisi işin ucuzuna kaçılarak nokia şarj cihazı tabi çin malı olunca zırt pırt patlayanlarıda olmuyo değil. Buna rağmen 4 haftadır bir kez olsun ters bir veri veya sekteye uğrayan bir iletişim gerçekleşmedi. Kurduğum sistem test aşamasında olduğu için internet tabanlı olarak kontrol edebiliyorum ve şuan elektrik kesintileri dışında bir sıkıntı gözükmüyor maaşallah :) Ama dediğim gibi yazılım konusunda ufak bir test yazılımı yaparak master cihazınla slave cihazları tek tek dahil ederek denemeni tavsiye ederim.
Alıntı yapılan: enrique_iglesias - 05 Şubat 2012, 01:11:53
Sorun çözüldümü çözülmedimi bilmiyorum ama ilk mesajınızdan okuduğum kadarıyla tamamen yazılılımsal bir hata var ortada!!!
Verileri tek tek göndermek ve almak konusunda bir kaç tecrübem oldu en iyisi tek pakette göndermek, tek tek olunca bazen tekteye uğrayabiliyor.
sorunu çözdüm kardeş, son mesajımda da yazdım. sorun yazılımsalmış.
peki verileri paket halinde nasıl gönderiyoruz? öğrenmek için soruyorum
paketten kasıt belli komut dizisi, yani bir protokol demek daha uygun olur..
Mesela kendimden örnek vereyim ben slave cihazlara hatta olup olmadıklarını öğrenmek için sürekli ping atıyorum ;
MASTER İÇİN :
master_no var byte
cihaz_no var byte
komut var byte
master_no = 1' bu değişken sistemimizde bağlı olan master cihazımınızın numarasını taşır örn.1
cihaz_no = ' bu değişken yazılımı yüklediğimiz slave cihazın numarasını belirler her slave numarası farklıdır örn.4
komut = ' bu değişken slave cihazın ne yapmasını istediğimiz 0 dan 255'e kadar olan komut dizisi
örn: 1- ping döndür
2- bilgi gönder
3- akım bilgisi gönder
4- ısı bilgisi gönder
5- pil bilgisi gönder
6- hepsini gönder
v.s.........
basla :
komut=1
cihaz_no=4
preamble 'dataların karşı tarafa sağlıklı ulaşabilmesi için data göndermeden önce hattı uyandırıyoruz.
hserout ["STX-" & cihaz_no & "-" & master_no & "-" & komut & "-ETX"]
goto basla
veri şu şekilde paket halde gidecektir; STX-4-1-1-ETX
paketi türkçeleştirirsek :
START TX "hey 4 numaralı slave sana diyorum" "konuşan 1 numaralı master" "bana ping gönder" "END TX"
SLAVE İÇİN :
master_no var byte
cihaz_no var byte
komut var byte
master_no = ' bu değişken sistemimizde bağlı olan master cihazımınızın numarasını taşır örn.1
cihaz_no = 4 ' bu değişken yazılımı yüklediğimiz slave cihazın numarasını belirler her slave numarası farklıdır örn.4
komut = ' bu değişken slave cihazın ne yapmasını istediğimiz 0 dan 255'e kadar olan komut dizisi
örn: 1- ping döndür
2- bilgi gönder
3- akım bilgisi gönder
4- ısı bilgisi gönder
5- pil bilgisi gönder
6- hepsini gönder
v.s.........
basla:
hserin [wait ("STX-"),gelen_cihaz_no,gelen_master_no,gelen_komut]
if gelen_cihaz_no=cihaz_no then
master_no=gelen_master_no
komut=gelen_komut
if komut=1 then
preamble 'hattı uyandırıyoruz
hserout ["STX-" & master_no & "-" & cihaz_no & "-" & komut & "-ETX"]
end if
end if
goto basla
veri şu şekilde paket halde mastera gidecektir : STX-1-4-1-ETX
paketi türkçeleştirirsek
START TX "hey 1 numaralı master" "konuşan 4 numaralı slave" "bana ping atmıştın alsana ping" END TX
Komutları direk buraya yazdım compile etmediğim için ufak tefek kusurları olabilir ama genel mantık böyle... Umarım anlatabildim ben tüm iletişimlerimde bu ve buna benzer birçok karmaşık protokol oluşturuyorum ve çok rahat bir komut yapısına sahip oluyor bunu prensip edinmenizi tavsiye ederim....
sağolasın kardeş ben de zaten bunları yaptım da çözdüm sorunumu, hatta crc_checksum yöntemini kullandım, son olarak.
benim paket halinde göndermekten kastım ise verileri byte byte göndermek değil de bir diziyi tamamen göndermek. printf() fonksiyonunun yaptığı şekilde göndermekten bahsediyorum yani. CCS C de ki printf fonksiyonu "/n" i görene kadar stringe koyup "/n" i gördüğü anda bu stringi mi gönderir. helpinde öyle yazıyor ama ben başarılı olamadım. hatta help kısmında puts() fonksiyonundan bahsediyor paket halinde gönderebilmek için ama ben bunları da denedim, fakat dediğim gibi başarılı olamadım. veriyi putc() ile gönderdim ama puts() ile gönderemedim.
Bir çok ustanın yorumundan sonra ben de bir not ekleyeyim.
5 yıldır RS485 ile haberleşen otomasyon uygulamaları yapıyorum. Hiçbir sorun yaşamıyorum. Kullanılacak doğru kablonun cat6 değil LIY(ST)CY kodlu kablo olduğunu belirteyim. 4 telli veya 2 telli rs485 tercihinize göre, bu kabloyu 5*0,11 veya 3*0,11 (bir tel yedek) seçebilirsiniz. Toplam kablo boyu 500-600 metre üzerindeyse 0.22'ye çıkmanızda fayda var. Kablo yolu üzerinde veya yakınında manyetik alan oluşturan elektrik motorlarları vb. etkiler olduğu durumunda, hatta gönderdiğiniz data paketlerinde bozulmalar oluşacaktır. Kablo yolu üzerinde bu etkiler çok fazla ise cihaz ile iletişim tamamen kesilebilir.
Alıntı yapılan: ogunduru - 15 Şubat 2012, 21:33:40
Bir çok ustanın yorumundan sonra ben de bir not ekleyeyim.
5 yıldır RS485 ile haberleşen otomasyon uygulamaları yapıyorum. Hiçbir sorun yaşamıyorum. Kullanılacak doğru kablonun cat6 değil LIY(ST)CY kodlu kablo olduğunu belirteyim. 4 telli veya 2 telli rs485 tercihinize göre, bu kabloyu 5*0,11 veya 3*0,11 (bir tel yedek) seçebilirsiniz. Toplam kablo boyu 500-600 metre üzerindeyse 0.22'ye çıkmanızda fayda var. Kablo yolu üzerinde veya yakınında manyetik alan oluşturan elektrik motorlarları vb. etkiler olduğu durumunda, hatta gönderdiğiniz data paketlerinde bozulmalar oluşacaktır. Kablo yolu üzerinde bu etkiler çok fazla ise cihaz ile iletişim tamamen kesilebilir.
Merhaba! Forumumuza hoşgeldin.
Rs485 gibi diferansiyel hatlarda burgulu çift kablo kullanmak , burgusuz kablo kullanmaya göre daha yüksek emc bağışıklığı sağlar.
Önerdiğiniz kabloyu incelemedim. Şöyle bir resmine baktım , bana hiç burgulu gibi gelmedi. eğer burguluysa kablo seçimi doğru ama 1 yedek meselesi hatalı.
Eğer kablo içinde yedek bırakılacaksa 1 tane değil 2 tane bırakmak ve kablonun birinde bir kopma olursa iki hattı birlikte yedek burgulu hatta geçirmek gerekir. Eğer utp kabloda emc sorunları yaşanırsa STP kablo kullanılabilir.
arkadaşlar sizden bir ricam olacak sn75176nın pin bağlntılarını paylaşabilirmisiniz???oydugunuz resimler hep yarım:)))
Alıntı yapılan: gibi2 - 06 Mart 2012, 16:10:47
arkadaşlar sizden bir ricam olacak sn75176nın pin bağlntılarını paylaşabilirmisiniz???oydugunuz resimler hep yarım:)))
http://www0.fh-trier.de/~berres/Datenbl%E4tter/TEXAS/75176.pdf (http://www0.fh-trier.de/~berres/Datenbl%E4tter/TEXAS/75176.pdf)
Konuyu uyandırabilirmiyiz?
Şema arıyorum.
http://aquaticus.info/sites/default/files/more_images/atmega8_max485_0.png (http://aquaticus.info/sites/default/files/more_images/atmega8_max485_0.png)
Bunun haricinde bir detay istiyorsanız, detay vermelisiniz.
Master ve slave kısmnda verdiginiz şema daki pinler baglantı yapılacak ve örnek bi haberleşme kodu verebilirmisiniz?
Paylaşacak örnek bir kodum yok. Sizin yaptığınız, çalışmayan veya anlayamadığınız bir kod varsa burada paylaşın, anlayamadığınız yerleri belirtin. Bu şekilde daha fazla yardım eden olacaktır.
Şu anda üzerine çalıştım kod tam anlamıyla yok anahtar kodlar olsa işimi görecek .
ccs c kullanıyorumm misal
Veriyi en saglıklı hangi kodla gönderip alabilirim?
Veri geldinde kesme ile mi almalıyım?
Masterda Rx pinni 485 ro ına girip slave dede ro a mı girilmeli yim
-Kesme kullanmanız sizin yararınıza.
-Master da olsa, Slave de olsa, işlemci ile MAX485 arasındaki bağlantı değişmez. Şekildeki gibi olacak.
Kesme ile yaptımda takılmalar oluyor kesme kullanmadımda takılmıyor
Örnek bir kodu olan var ise paylaşabilirmi?
Jackal183 hocam foruma bakarsanız iletişim maili yazma imkanınız var mı sorunlarınızın aynısını alıyoruz ve 1ay süredir çözüm arıyoruz.
Alıntı yapılan: jackal183 - 05 Şubat 2012, 13:28:52sağolasın kardeş ben de zaten bunları yaptım da çözdüm sorunumu, hatta crc_checksum yöntemini kullandım, son olarak.
benim paket halinde göndermekten kastım ise verileri byte byte göndermek değil de bir diziyi tamamen göndermek. printf() fonksiyonunun yaptığı şekilde göndermekten bahsediyorum yani. CCS C de ki printf fonksiyonu "/n" i görene kadar stringe koyup "/n" i gördüğü anda bu stringi mi gönderir. helpinde öyle yazıyor ama ben başarılı olamadım. hatta help kısmında puts() fonksiyonundan bahsediyor paket halinde gönderebilmek için ama ben bunları da denedim, fakat dediğim gibi başarılı olamadım. veriyi putc() ile gönderdim ama puts() ile gönderemedim.
[Alıntı yapılan: jackal183 - 05 Şubat 2012, 13:28:52sağolasın kardeş ben de zaten bunları yaptım da çözdüm sorunumu, hatta crc_checksum yöntemini kullandım, son olarak.
benim paket halinde göndermekten kastım ise verileri byte byte göndermek değil de bir diziyi tamamen göndermek. printf() fonksiyonunun yaptığı şekilde göndermekten bahsediyorum yani. CCS C de ki printf fonksiyonu "/n" i görene kadar stringe koyup "/n" i gördüğü anda bu stringi mi gönderir. helpinde öyle yazıyor ama ben başarılı olamadım. hatta help kısmında puts() fonksiyonundan bahsediyor paket halinde gönderebilmek için ama ben bunları da denedim, fakat dediğim gibi başarılı olamadım. veriyi putc() ile gönderdim ama puts() ile gönderemedim.
Hocam yazılımsal hatanız neredeymiş ?