C

rs485 ile pic devrelerin haberleşmesi

Başlatan caresiz_kaptan, 13 Haziran 2013, 09:35:16

caresiz_kaptan

Merhaba arkadaşlar,

Üzerinde çalıştığım bir projede, anakart ve yardımcı kartlar birbirleriyle haberleşmesi lazım mesafe uzun olduğu için edindiğim bilgilere göre rs485 kullanılması gerekiyor. Fakat ccs c nin içerisindeki örneği inceledim ve hiç açıklayıcı gelmedi, biraz karısık geldi..
Daha önce ccs c de rs485 kullanan arkadaşlar varsa konuyla ilgili nasıl haberleşeceklerini ve yardımcı kartlarının tanıması için Her karta ID belirlenmesi ile ilgili yardımlarınızı bekliyorum..

ete

Artık birerbir işinize yarayacak örnekler aramaktan vaz geçin lütfen. İşin teorisini anlatan bir sürü yardımcı bilgi var. Bu sistede konuyla ilgili çalışma var. En azından algoritma çalışması olarak açıklandığı için her dile kolaylıkla adapte edilebilir.
Çokmu zor sizce bir karta ID numarası vermek. İşin temelinde her kartın bir kimlik numarası olacak deniliyor. İki yolla bunu yapmak mümkün. Ya o karta ait işlemciye yükleyeceğiniz programa kartın kimlik numarasını eklersiniz ve açılışta kart bu numarayı beller yada karta bir dip-sw koyarsınız. Açılışta dip switch bacaklarını okuyarak kartın numarasını bellersiniz.
Bundan sonrası artık programcılık maharetinize kalmış bir şey.  Yine temel mantık şöyle olmalı.
- Açılışta bütün kartlar beklemede yada alıcı konumunda olmalı.
- Yalnızca master ilk etapta bir şey verebilir. Diğerleri bunu alıp uygulayabilirler.
- Master emrini emri uygulayacak kartın kimlik numarası ile birlikte verir. Örnek vereyim. Sıcaklığı oku emrine bir numara verelim 100 olsun. Emri uygulayacak kart numarasıda 02 olsun. O halde al sana yönlendirilmiş emir. 100,02,13 şeklinde yolladınmı bu emri bütün alıcılar alır. Burada önemli olan 2. parametre olan Kimlik numarasıdır. Herkes bu numarasyı kendi numarası ile karşılaştırır. Birisininki uyacaktır. Uyan kart hemen sıcaklığı okur ve karşılık veriri.  Sıcaklık,02,13 şeklinde.
MAster bilginin 02 den geldiğini anlar.
- Master emir yolladıktan sonra hemen alıcı konumuna geçmelidir. Böylece yolaldığı emrin karşılığını emri verdiği karttan alıncaya kadar bekler ve alır almaz ikinci emrini bir başka karta verir.
Temel mantık budur ve çok kolaydır.

Örnek aramayın siz örnek yaratın.

Ete

caresiz_kaptan

Ben bire bir programı yazın diye bir istekte bulunmadım.. Sadece RS485 in ccs c dilinde hangi komutlarla çalıştırıldığını ve ID belirleme ile alakalı komutların kullanıldığını söylemiştim. Sizin söylediğiniz mantığı bende biliyorum mantıken öyle fakat her derleyicinin o mantığı gerçekleştirmek için farklı farklı komutlarda ve şekillerde gerçekleştirmesi var. Ben bunu sordum mantığını değil.. Örnek dediysem en fazla 5 satırı geçmeyecek sekilde basit bir komut satırı amaç düşüncede olan mantığı uygulamada nasıl gerçekleştiriyor...Öğrenmede önemli nokta mantığın yanında örneklerinde olmasıdır..Siz örnek koymazsanız başkası örnek vermezse insanlar nasıl öğrenecek..Neyse yardımlarınız için sağolun...

ete

Alıntı YapBen bire bir programı yazın diye bir istekte bulunmadım.
Farklı şeyleri konuştuğumuz anlaşılıyor. Böyle bir şeyi ne ima ettim nede iddia ettim. Ya işin çok başındasın yada gerçekten hazırcısın. Çünki anlattıklarımın değerini anlamayacak kadar gerilerdesin. Üstelik alıngansın.  Yok ileride olduğunu düşünüyor isen , takıldığın bu konuda biraz araştırma yapmış olsan bir çok şeyi sormaktan vaz geçerdin sanırım. Yinede takıldığın konuya açıklık getirmeye devam edeyim ben.
RS485 ile haberleşme özel bir komut seti gerektirmez. Çünki Kullandığın komutlar Seri haberleşme (RS232) komutlarıdır.
Sen sistem olarak RS232 kullanırsın çıkışa ekleyeceğin RS485 entegresi (max485 veya SN75176) RS232 yi RS485'e çevirir zaten. Tek farkı Max485 entegresinde DE-RE pinleri birleştirilerek bir işlemci pinine bağlanacak ve bu pine LOW verirsen sistem alma konumunda olacak, bu pine HIGH verirsen sistem Verme konumuna geçecektir. Bütün olay bundan ibarettir.
O halde araman gereken tek şey CCS de RS232 nasıl kullanılıyor?. Bunuda kendi örneklerinden bulabilirsin diye umuyorum.
Ayrıca yinelemekte yarar görüyorum ! ID belirleme konusunda komut diye bir şey olmaz. Onu sen yaratırsın. Nasıl olması gerektiğini anlattım. Hala örnek ihityacın var ise bi zahmet başka sitelere bakıver. Burada bulamayacaksın çünki.

Ete

caresiz_kaptan

Bu işin alınganlıkla alakası yok ben sadece takıldım konu hakkında yardım istedim o kadar..Konuyu hazırcılığa yada polemik derecesine getiren sizsiniz...Siz yardım edersiniz yada etmezsiniz bu sizin kararınız bilgi paylaştıkça değer kazanır, ama tutupta benim ne derecede olduğumu yada bildiğimi karar vermek size düşmemesi lazım...Bırakın ona ben kara vereyim...Kolay gelsin size

ete

Amacımın polemik yaratmak olmadığını göstermek için susuyorum!!!!

Ete

umiter

#6
Sayın caresiz_kaptan ;

Ben yeni yeni öğrenmeye başladığımda problemin çözümü devreleri hep bulmaya çalıştım, çünkü vakit darlığı eğitimin yetersizliği, maddi imkanların kısıtlığı öğrenme süreci ezber metodunu besliyordu, neyseki ozamanlar çok uzakta kaldı. ETE hocamız öncelikle olta takımı verir, balık tutmayı öğütler ama hiç üşenmeden sepete de balıkları koyar. Dolayısıyla haberleşme devrelerini incelerken öncelikle bir algoritma kurmak gerekir size bunu yazıyorum çünkü C gibi üst seviye bir dil kullanma çabası içindesiniz, bu tür diller pek algoritmasız başa çıkılacak cinsten değildir, problemi iyi ortaya koymak gerekir.

Sizin işinize yarayabileceğini düşündüğüm kod aşağıda. Komutlara açıklama eklemedim, sizin maharetinize bırakıyorum.



#include <C:\Program Files (x86)\PICC\Devices\16F877.h>

#fuses HS,NOWDT,NOPROTECT,NOLVP
#use    delay(clock=10000000)
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7, stream=PC)


#define RS485_RX_BUFFER_SIZE 64
#define RS485_USE_EXT_INT FALSE
#define  RS485_ID             0x09
#define  ADAPTER_RS485_ID  0x7f
   
#define RS485_RX_ENABLE    PIN_B5
  #define RS485_ENABLE_PIN   PIN_B4
#define RS485_TX_PIN       PIN_C6
#define RS485_RX_PIN       PIN_C7

#include <C:\Program Files (x86)\PICC\Drivers\rs485.c>
#include <C:\Program Files (x86)\PICC\Drivers\stdlib.h>
int8 msg[32];
char RS485getc() {
    rs485_get_message(msg, TRUE);
    return msg[2];
}
   
char h;
void main()
{

output_low(RS485_RX_ENABLE);
    set_tris_a(0x00);
     
    output_low(RS485_ENABLE_PIN); 
       rs485_init();
    while(true)   
    {
    h=RS485getc();
       output_a('h');
    }
}


Saygılarımla.
Bilgi elde edilmesi zor,  tüketilmesi kolay bir bulamaçtır.

Powered by EzPortal