avatar_ete

Seri ve RF iletişim Sistemlerinde Master - Slave İlişkisi Üzerine bir Çalışma

Başlatan ete, 04 Eylül 2011, 16:33:47

ete

Bu başlık altında üyelerimizden İsak'ın seri haberleşme konusunda sormuş olduğu haberleşme sistemine ait algoritma çalışması üzerinde çalışacağız. Bu çalışma sonucunda programıda az çok ortaya çıkaracağız.

Önce elimizde neler var onlara bir bakalım isterseniz.

Sistemde 3 adet sensör kartı  yani 3 adet Slave , ve 1 adet Master kartı bulunmaktadır.
Her bir sensör kartına birer fotosel bağlı olacak ve fotosel için hazır bir cihaz kullanılacaktır
Kullanılacak fotosel 10-30V aralığında çalışabilmekte ve çıkışı da hame NPN hemde PNP olabilmektedir. NPN ve PNP ne anlama geliyor hemen açıklayayım.  Elinizde bir NPN transistör olduğunu varsayın. Bu transistör normal şartlarda Emitter ucu GND ye bağlanır ve Collector ucundan çıkış alınır. Beys ucuna bir High sinyali uygularsanız ve Collector ucunu bir direnç ile + beslemeye bağlarsanız sinyal olmadığı durumlarda Collector ucu size High sinyali verir. Ama Beys ucuna sinyal uygularsanız size Low verir. Bu şekilde sinyal gelince Low veren çıkışlara NPN çıkış adı verilir.
AYnı şekilde sinyal olmadan Low verip sinyal uygulayınca High veren çıkışlarada PNP çıkış ismi verilmektedir. Bize hangisi lazım olacak ise onu kullanacağız. Genelde fotosel sensör çıkışları her iki sisteme uygun yapılırlar. Kullanıcı istediğini kullanır.
Sensör çıkışı 5V seviyesinin üzerinde olacağı için arada bir izole sistem kullanacağız. Bunu bir optocoupler ile yapabiliriz. O halde devremizde 1 adet 4N35 tipi bir opto bulunacak demektir.
Her bir sensör kartına 1 adet Transceiver bağlanacak ve kart bu eleman vasıtası ile Master ile haberleşebilecektir.
Bir birinin aynı olacak şekilde 3 adet slave kartı üretilmesi gerekiyor. Ancak kartların haberlşem anında bir birlerinden ayrılabilmelerini sağlamak üzere birer dipswitch takılacaktır. Böylece kartlara fiziki birer numara verilmesi mümkün olacaktır. Pic ilk çalıştığında bir kereye mahsus bu numarayı okuyacak ve sonra programda onu kullanacaktır.
Master kart üzerine yalnızca 1 adet 16F877 ve buna bağlı 1 adet Transceiver modül olacaktır.
Her ne kadar belli değilsede modül olarak Udea modüllerinden birisini kullanacağımızı varsayacağız.

İşin donanım kısmını açıkladıktan sonra senaryo çalışmasına geçebiliriz.
Senayomuz şöyle;
Ortamda çalışan 3 sensör kartında yer alan sensör çıkışları HIGH olunca bu bilgi Master'a ulaştırılacak ve master da bir çıkışı (bu bir röle çıkışı olabilir) HIGH yapacak. Sensörlerden herhangi birisi low ise master çıkışıda low olacak.

Şimdi önce slave kartından çalışmaya başlayalım. Bir tanesini inceledikten sonra diğerleri de aynı mantıkla çalışacaklardır.

Sensör kartı ilk çalıştırmada üzerinde bağlı olan dip sw. pinlerini okuyarak kendi kimlik numarasını öğrenecektir. Bu birinci adım.
Sonra sürekli olarak sensör çıkışını kontrol edecektir. Bu sistemde USART kesmesi ile bilgi akışı her zaman açık olacak ve geri planda çalışacaktır. Şayet master dan kendisi için bir emir gelmiş ise bir değişken set edilecek ve salve de buna bağlı oalrak hemen sensör bilgisini Master a yollayacaktır.
Şimdi, bu açıklamayı biraz program dili ile inceleyelim;
Öncelikle sigorta ayarlarınıveriyoruz ve dahili OSC kullanıyoruz.
Sonra USART kesmesini açmak için gerekli parametreleri ayarlıyoruz.
Değişkenlerimizi tanımladıktan sonra  kimlik okumasına geçiyoruz.
Dip-Sw  PortA da bağlı olacaktır. Sw pinleri normalda pulldown yapılmış bekleyecek ve set edilen pin High olacaktır. O halde okuma işlemi şöyle yapılabilir.
Kimlik=PortA & %00001111
Bu komut ile portA nın ilk dört bitini okumuş olduk. Bu bitlerden hangisi sw üzerinden high yapılmış ise ona karşılık gelen bit 1 olacaktır. Diyelimki sw =%0011 şeklinde ayarlanmış . İşte bizim kimlik değişkenimizde otomatikman %0011 değerini alacaktır. Yani desimal olarak 3 değeri kimlik değişkenine yerleşecektir.

Bu işlemden sonra kesme aktif edilip ana çalışma kısmına geçilecektir.
Basla:  etiketi ile ana çalışma kısmına başlıyoruz.
Sensörümüz PortB.7 de bağlı olduğunu varsayalım. Bunu program başında Symbol komutu ile sensör olarak tanımlayacağız. Yani Symbol Sensor=PortB.7  şeklinde bir tanımlama olacaktır. Tabiiki bu pinin aynı zamanda giriş pini olacağını TRIS tanımlamalarında unutmuyoruz.

Bu aşamada if sensor=1 Then Veri=10  şeklinde yollanacak verinin sensör=1 olduğu şeklinde tanımlıyoruz. Veri değeri 10 ise sensör değeri High, veri değeri sıfır ise sensör değeri Low olduğunu hemen anlamanız gerekir.

Şimdi sensörü okuduk ancak bu bilgiyi master a yollamak için artık masterdan emir bekleyeceğimiz için bir değişken değerine bakacağız. Oda "Yolla" olacaktır. Şayet Yolla=1 ise bilgi yollanacak değilse beklenecektir.
Burada
if Yolla=1 then
    HSEROUT ["$","R","F",#KIMLIK,#VERI,$45,$4E,$44,$0D,$0A]
    Yolla=0
endıf
şeklinde bir komut dizisi kullanacağız. Bu komutlara veriyi master'a yollayacak ve yollama bitini sıfırlayarak yeni bir yollama emri bekleyeceğiz. Yollanan bilgi başına kimlik numaramızıda ekliyoruzki master bilginin kimden geldiğini anlayabilsin.
Yollama komutu Hserin Usart yollama komutudur. İçinde yer alan bilgiler Udea transceiverine ait standart ve olması gereken komut dizisidir. Bize ait olan yalnızva Kimlik ve Veri bilgileridir.

Bu işlemden sonra program yeniden başla satırna yönlendirilecek ve bir döngü içinde aynı işlemler tekrarlanacaktır.

İşin Usart Kesmesi kısmınd olacaklarıda burada belirtmekte yarar var.
Şayet Usart portuna bir veri gelmiş ise hemen bir kesme oluşacaktır.
Burada yer alacak komut dizisi;
HSERIN 5,ATLA, [WAIT("$RF"),# KIME,GELEN]    şeklinde olacaktır.
IF Kime=Kimlik and Gelen=10 then  Yolla=1
şeklinde olacaktırç Şİmdi bunları açıklayalım.
Heserin komutundan sonra 5 rakamı yer alıyor. Bu gelen veri bizim istediğimiz değil ise en fazla 5 ms orada bekle ve ATLA isimli etikete geç anlamını taşıyor. AKsi taktirde veri gelinceye kadar program orada bekleyecektir.
Gelen veri paketinin başı "RF" işareti ile bulunuyor. Bu işaret rast gele seçilmemiş olup UDEA modülünden kaynaklanan zorunlu seçimdir. Araya kendi işaretinizide koyabilirsiniz ancak boşuna zaman kaybı olmaktan öte bir fayda sağlamaz.
Veri paketi başı bulunduktan sonra peşinden gelen iki adet veri alıncaktır. Bunlardan birisi Kime diğeride Gelen isimli verilerdir. Kime bu emrin hanig salve kartına yollandığını belirleyecektir. Gelen ise emrin cinsini belirlemektedir. Aslında bu programda Gelen diye bir şey kullanmak gerekmez. Zira yalnızca Kime bilgisi seösr bilgisinin master a iletilmesini açıklayabilir. Ancak programın ileride geliştirilmesine imkan vermek amacı ile masterdan gelecek birden fazla emir cinsini tanımlayabilmek amacı ile bu değişkenide kullanmayı uygun gördüm.
Veri alındıktan sonra gelen verilerin değerlendirilmesi yapılacaktır.
Gelen veri o karta ait ise ve gelen emir 10 yani sensör bilgisini oku ve bana yolla emri ise slave hemen emri yerine getirecektir. Ne yapılyor bunu sağlamak için  Yolla değişkenini hemen set ediyoruz.
Program kesme kısmından derhal çıkıyor ve normal çalışma kısmına geçiyor. Orada önceden yazmış olduğumuz if yolla=1 then komutunu görerek hemen bilgilerini yolluyor.
Sistemde bir transceiver kullanmanın avantajı burada yatıyor. Biz ne verici açıyoruz ne alıcı açıyoruz. Hepsini verdiğimiz gönder veya al komutları ile Transceiver kendisi ayarlıyor.
Bu açıklamalar ise bir slave kartının çalışma prensibini ve şeklini az çok belirlemiş olduk böylece.

Şimdi Master kartına bakalım.
Master kartıda aynı şekilde Usart kesmesi ile çalışacak tır. Başlangıçta registerler ve sigorta değerleri ayarlanacak ve sistem 4Mhz de çalıştırılacaktır. Bunun için devrede 4 Mhzlik bir rezonatör kullanılacaktır.
Devrede 1 adet transceiver bağlı olacak ve ayrıca birde röle çıkışı bulunacaktır. Röle , bir BC547 transistörle sürülecektir.

Bu devre programı kısaca aşağıdaki senaryoya göre çalışacaktır.
1. Kendisine bağlı olan kartların kimlik numaralarını yazılm ile bilecektir. Burada biz 0001 - 0002 - 0003 şeklinde bu kartları tanımlamış olacağız.
2. Basla satırından itibaren Master önce 1 nolu karta bilgini yolla emrini yollayacak ve hemen kendisini beklemeye alacaktır. Beklediği bilgi gelmiş ise hemen 2 nolu karta emri yollayacak ve ondan gelecek bilgiyi bekleyecektir. Daha sonra 3 nolukarta bilgi yollayacak ve ordan gelecek bilgiyi bekleyecektir.
3. Sonuçta 3 sensörden gelen bilgileri aldıktan sonra üçününde HIGH olup olmadığına bakacak ve şayet olmuş ise röle çıkışını aktif edecektir. Değil ise röle çıkışı kapalı tutulacaktır.
Bütün sistem mantığı bu temel üzerine olacaktır.
Şimdi başla satırından itibaren olayı inceleyelim;
BASLA:
              Kimlik=0 '
              Kime=1
              Veri=10
              Gosub Yolla
Burada emrin kime verileceğini Kime değişkeni belirliyor. Emrin cinsini Veri belirliyor ve sonuçta bir gönderme altp programı kullanarak veri yollanıyor. Kimlik değeride sıfırlanarak gelen kimlik değerinin değişmesi beklenecektir.
Yolla:
          Hserout ["$","R","F",#Kime,#Veri,$45,$4E,$44,$0D,$0A]
          return
şeklinde de altprogramı ayarlıyoruz.
Bu aşamadan sonra program hemen  bekleme aşamasına girecektir.
BekleBir:
                 if kimlik=0 then bekleBir
burada USART kesmesinden sensör bilgisinin gelmesi beklenecektir.
Bilgi geldiğinde Kimlik değeri sensör bilgisini yollayan ile eşdeğer olacaktır. Ohalde 1 nolu slave den bilgi beklediğimize göre Kimlik=1 değeri ile kesmeden çıkılacak ve BekleBir etiketinde Kimlik=0 olmayacağı için bir alt satıra geçilecektir.
                If Kimlik=1 then
                     SENSOR_BIR=GELEN
                     GOTO IKI
                Endif
şayet doğru kimlik gelmiş ise işlemin ikinci safhasına geçilecek değilse bir hata oluştuğu varsayılarak işleme baştan yeniden başlanacaktır.

                Goto basla

IKI:
              Kimlik=0
              Kime=2
              Veri=10
              Gosub Yolla
ikinci sensörede emri verdik.
BekleIki:
                 If Kimlik=0 then BekleIki
                 If Kimlik=2 then
                   SENSOR_IKI=GELEN
                   GOTO UC
                  Endif
                 Goto IKI
UC:
              Kimlik=0
              Kime=3
              Veri=10
              Gosub Yolla
BekleUc:
              If Kimlik=0 then BekleUc
             If Kimlik=3 then SONUC
             Goto UC
SONUC:
              SENSOR_UC=GELEN
Burada üç adet sensör bilgisini test edeceğiz. Hepsi 10 ise röle açlacak. Birisi sıfır ise röle kapatılacak
             If senor_Bir=10 and Sensor_iki=10 and Sensor_uc=10 then
                        Role=1
             else
                        role=0
              endif
             pause 20
             goto basla
Bu işlemden sonra döngüyü yeniden başlatmak üzere basla satırına geri döneceğiz.

Pogramın kesme kısmı diğer lerinden farklı olmayacak.
             HSERIN 5,ATLA, [WAIT("$RF"),# Kimlik,Gelen]    şeklinde olacaktır.

Bu şekilde program algoritma incelememiz bitmiş oluyor. Elbette ufak tefek eksikler ve gözden kaçan hususlar çıkabilecektir. İyi program 6 ayda oturur derler. her programın bir oturma yani düzgün çalışır hale gelme süresi vardır. Hiç bir program ilk yazıldığı hali ile hemen çalışır hale gelmez.
Bu nedenle işin geri kalanı sistem çalıştırıldıktan sonra sonuçlar ve çalışma şekli gözlemlenerek çözülür. Ama şöyle bir bakıldığında büyük bir mantık hatası yapmadığımızı görüyorum.
Herkese kolay gelsin
Ete

ete

İsak Yazmış ;
Alıntı YapEvet hocam dediğiniz gibi algoritma oluşmuş.Sensörün PNP çıkışını kullanırsak daha iyi olacak gibi.Başka diyecek pek birşey bulamıyorum.Herkesin bu projeyi takip etmesini istiyorum gayet güzel işler çıkacak bundan eminin.Hiç bir bilgisi olmayan bile buradan birşeyler öğrenecek gibi.
İzlemeye devam edelim.
Kolay gelsin.


ete

Tasarladığımız sistemin simule edilebilmesi için bir deney çalışması yaptım. Simulasyonda RF denemesi yapmak hayli zor bir iş. Zira, normalde RF yolu ile bir birine bağlı gibi çalışacak olan  işlemcilerin  RX ve TX uçlarını bir birine bağlarsanız sistem bloke oluyor ve çalışmıyor. Bu pinleri birer dirençle izole etseniz bile program sanırım empedans vs gibi bir hesap yapıp yine haberleşmeyi bloke ediyor. Çareyi sistemi RS485 mantığı ile bağlamakta buldum. Her işlemciden birer RS485 entegresi ile çıktım ki bu aslında izolasyonu sağlıyor ve sonra RS485 lerin hat uçlarını (A ve B) birbirleriile birleştirdim.Sonra yukarıda açıklamaya çalıştığım algoritma üzerinden birer program yazdım. Zaten programların detaylarını epeyce verdik. Sonra bunları denedim. Her şey mükemmel çalıştı.Görmek isteyenler Sitenin  "Yüklemeler/Downloads " kısmına yüklediğim  "Master_Slave" dosyasını indirip deneyebilirler.  Programların yalnızca hex dosyalarını verdim. Kafanız karışmasın diye.Zira programda RS485 kontrol kodu da yer almakta olup RF sisteminde buna gerek kalmayacaktır.Bu deneme ,  sistemin yapılması halinde RF de sorunsuz çalışabileceğini gösteriyor elbette. Programı daha sonra ekleyeceğim. Ama bu arada program hakkında biraz düşünmenizi isterdim doğrusu.

Ete

ete

Medes Yazmış ;
Alıntı Yaphocam proje güzel devamını takip edeceğim anlatımınız  gayet anlaşılır inşallah daha farklı projeler üzerinde yeni pbp .yazılım ve uygulamaları ile yeni programlamayı öğrenmeye çalışanlara kendini biraz geliştirmiş arkadaşlarada farklı pbp uygulamalar sunarak programcılğın gelişiminde faydalı olunacağı  kanaatindeyim.ete hocam şimdiden elinize kolunuza sağlık .

ete


Yönetici

Medes,
İlgin için teşekkür ederim. Bu sitede başka yerlerde olmayan değişik proje fikirleri üzerine hem algortima hemde devre tasarımını birlikte yaparak proje tasarımı üzerine kendimizi geliştirmeye çalışacağız. Bu sağdan soldan bilgi toplayan sitelerden farklı bir uygulama olacak yada oluyor zaten.
Ancak zaman zaman konu bulmakta zorlanıyorum. Tabiiki her konuyu işleyebiliriz anlamına gelmiyor bu. Zira ancak bilgi sahibi olduğumuz konularda çalışma yapabiliriz. Bu hepimiz için geçerli . Ben bilmem ama üyelerimizden birisi bilebilir. Açıklama gelirse üzerinde çalışabiliriz. Kısaca parlak fikirleri olan arkadaşlardan konu başlığı açmalarını rica ediyorum. Böylece incelemelerimize devam edebilir merak ettiklerimizi öğrenebiliriz.

Ete

ete

Master-Slave ilişkisi programları ile ilgilenenler verdiğim açıklamalar üzerinden kafa yormuşlardır umarım.
Sistemin sensör tarafına ait programı aşağıda veriyorum. Söz konusu program kaç adet slave olursa (maksimum 16 adet) olsun hepsinde aynı program çalışacaktır. Farkı kartın üzerinde yer alacak ID dip sw ayarı yaratacaktır. Devre şemasında da göreceğiniz üzere bu swich kullanılarak kartlara sıra numarası verilmiştir. Programlarda bu numaralara göre çalışacaktır.

'****************************************************************
'*  Name    : SENSOR.BAS                                        *
'*  Author  : [                   E.T.E.                      ] *
'*  Notice  : Copyright (c) 2011  İzinsiz kullanılamaz )        *
'*          : All Rights Reserved                               *
'*  Date    : 03.04.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : 3 adet sensör kartı bu programla çalıştırılacaktır*
'*          : Ayırım yalnızca dip-sw den verilecek numara iledir*
'****************************************************************
@ device pic16f628a                      'işlemci 16f628                             
@ device pic16f628a, wdt_off             'watch dog timer açik
@ device pic16f628a, pwrt_on             'power on timer açik
@ device pic16f628a, protect_off         'kod protek kapali
@ device pic16f628a, mclr_off            'mclr pini kullaniliyor.
@ device pic16f628a, intrc_osc_noclkout  'dahili osilatör kullanilacak

define OSC 4
CMCON=7
PortA=0: TrisA=%00001111 'ilk 4 bit dip-sw nedeni ile giriş diğerleri çıkış pini
PortB=0: TrisB=%10000010 '2. bit RX pini ve 7. bit ise sensör pini olarak giriş

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
SYMBOL SENSOR=PORTB.7

KIMLIK var byte 56
KIME   VAR BYTE 57
GELEN  VAR BYTE 58
VERI   VAR BYTE 59
TEMP   VAR BYTE 60
I      VAR BYTE
SAY    var byte
YOLLA  VAR BIT

pause 500
KIMLIK=(PORTA & %00001111)

RCIE=1
PEIE=1
GIE=1

ON INTERRUPT GOTO KESME
YOLLA=0

BASLA:
      VERI=0
      IF SENSOR=1 THEN VERI=10
      if Yolla=1 then       
         HSEROUT ["$","R","F",KIMLIK,VERI,$45,$4E,$44,$0D,$0A]
         GOSUB DELAY
         Yolla=0
         toggle portb.0 'bu satır olmasada olur. yalnızca görsel olarak programın buraya eriştiğini gösteriiyor
      endIF
      GOSUB DELAY
      GOTO BASLA
     
DELAY: FOR I=0 TO 255
          PAUSEUS 5
       NEXT
       RETURN     
     
DISABLE
KESME:
    GIE=0
    HSERIN 5,ATLA, [WAIT("$RF"),KIME,GELEN]
    IF KIMLIK=KIME THEN YOLLA=1
ATLA:
    TEMP=RCREG
    GIE=1
    Resume
    enable
end         

Ete

ete

İsak Yazmış ;
Alıntı YapHocam yazdığınız program için veri kısmını, 3 verici için değiştirirsek sorun olmaz değil mi gönderilen verilerin ayrı ayrı olmasını istiyorum(10,11,12 gibi).Ve bu program daha önce yukarıda vermiş  olduğunuz simülasyon için mi yazıldı.Simülasyon da çalışma sorunu var gibi sanki bende ama.Deneme olduğu için olsa gerek tabi.Devreyi gerçeklemek istiyorum en kısa zamanda,  tabi sizle beraber adım adım ilerlliyeceğiz ve ilgilenen arkadaşlar da faydalanacaktır umarım.Modül olarak Udea'nın  UFM-M11 modülü olacak muhtemelen sizce de uygunsa tabi.Gerekli devre aşamalarını foto olarak ekleyerek öğrenilmesini daha da kolaylaştırabiliriz.Vizeler dolayısıyla foruma pek giremedim artık çalışmalarımızı hızlandırabiliriz.
Herkese kolay gelsin.

ete

Verici yani sensör programı 3 ayrı verici için aynı program olacak ve öyle çalışıyor.
Senin belirttiğin farkı her karta bağlı olan sürgülü anahtar sağlıyor. Böylece 1 nolu kart veri yollarken 1 yolluyor, 2 nolu kart ise 2 yolluyor ve 3 nolu kart ise 3 yolluyor. Tabiiki kartlar üzerindeki anahtarları siz bu numaraları verecek şekilde ayarlıyorsunuz. Binary kodlama bu ayarda esastır. Verdiğim şemada bu ayarlarda gözüküyor zaten. Bütün mesele kartlardaki sürgülü anahtarlara farklı numaralar vermektir ki bu da zor bir şey değil sanırım.

Bu program simulasyon için yazıldı. Simulasyonda RS485 var bir kaç kod onu kontrol ediyor ama onu çıkartınca RF ile çalışacak halide yukardaki şekildedir.

Simulasyon programı mükemmel çalışıyor, kusurusuz. Sende ne gibi sorunlar var anlatırsan anlayabiliriz. Sorun olmaması gerekir.
UFM-M11 modülü bu iş için uygundur. Pogramda zaten bu seriden modüllere göre verildi.

Ete

ete

İsak Yazmış ;
Alıntı Yaphocam ben simülasyonu çalıştırmadan önce bütün sensör girişlerini 0 yapıyorum ve çalıştırıyorum ardından birinci sensörü 1 yapınca led yanmıyor.aynı şekilde diğerleri için de geçerli.normalde 1 yapınca ledin  yanması lazım değil mi?

Şöyle bir durum var tabi ki 3 sensör girişi aynı anda 1 olunca led yanıyor ama sıra sıra 1 olunca yanması lazım değil mi hocam.

ete

Programa ne verirseniz onu yapar. Senin daha önceki açıklamalarından sanki 3 sensör girişide 1 olunca led yanacak gibi bir fikir edinmişim. Dolayısıyla programada 3 sensör girişide 1 olunca git ledi yak dedim ki oda öyle çalışıyor. Dediğim gibi bunu değiştirip her sensörden bilgi geldikçe kim 1 ise o lediyak demek zor bir şey değil. Ama bana biraz garip geldi. Sistemin çalışma hızına bakarsanız 1 sn sürmüyor sensörlerin okunması ve iki okuma arasındaki sürede çok az. Bu durumda bu dediklerimi çok dikkatlice izlemeni öneriyorum.
-Master 1. sensörü okudu ve gelen bilgi 1 olduğu için ledi yaktı. Dah aled yanarken hemen ikinci sensör bilgiside geldi diyelimki gelen bilgi "0" o halde ledi söndür emrini verdi yani ledin yanması ile sönmesi bir oldu.
- Üçüncü sensör okundu ve gelen bilgi "1" olduğundan led yandı
Bu şekilde bir çalışma ile işin görsel tarafını tek lede vermek bence yanlış. BU durumda her sensör için bir led kullanılırsa daha uygun olur gibi geliyor bana.

Ete

ete

İsak Yazmış ;
Alıntı YapBen yanlış anlattıysam özür dilerim hocam.Şöyle olacak; 1. sensörden bilgi geldikten sonra bir veri gönderilecek ve işleme konulacak.Sonra 1. sensör 0 olacak ve 2. sensör den gelen bilgi olacak ve veri gönderilecek bu da işleme konulacak.aynı şekilde 3. sensörden bilgi gelince bu da  veriyi gönderecek.Yani kısaca 3 sensör herzaman sıfır olacak ve nezaman sensör algılama yapınca 1 olacak ve veriyi yollayacak.Sensörler arası mesafe olacağından arada baya bir zaman olacak yani 1. ile 2. arası algılamada baya bir süre olacak yani ms lerde ardı ardına algılama yapmayacaktır.Tek led olmasının sebebi ise 3 vericiden herbiri faklı bir veri gönderecek ve rs232 ile bilgisayara bağlantı yapılacağından bir yerden verileri sıra sıra alacak ve gelen veri ne ise ona göre işlem yapacak yani tek bir yerden gelen veriyi değerlendirecek.Durum böyle olacak deiğiniz gibi her sensör için bir led kullanılsa gelen bilginin değerlenidirilmesi nasıl olur bilmiyorum.Bana tek led mantıklı gibi geliyor ama.

Hocam simülasyon ve kodlar üzerinde kafama takılan bazı sorular var :
1.Programda 628 ler için dahili osilatör komutu var  dahili osilatör olmasının nasıl bir faydası var ve gerçeklenme aşamsında da osc pinleri boş mu kalacak.
2.877 ye bağlı röle ne işe yarar devrede gerekli midir?
3.kim 1 ise ledi  bir defa yak (sürekli bilgi gelsin istemiyoruz) komutu alıcı kısmında mı işliyor.
teşekkürler.
Kolay gelsin


ete

628 de dahili osilatör mevcut yalnızca 4Mhz de çalışıyor. Kritik zamanlamalar için uygun değil ama sıradan işler için uygundur. Kullanırsanız devreye kristal veya rezonatör bağlamak gerekmiyor.
Osc pinleride boş kalacak elbette.

877 ye bağlı olan röleyi sen söylediğin için koymuştum. Çalışan bir şey olsun diye. gerekli değildir elbette.

Led yakma işlemi tabiiki 877 de işleniyor ve yakma olayı sensör kartlarından gelen bilgiye göre değerlendirilmektedir.

Ete

ete

Programın Master kısmı için çalışmaya başlama zamanı geldi. Konuyla ilgilenenlerin epeyce kafa yorduğunu düşünüyorum. Ancak ne bu konuda soru soran oldu nede ben ilgileniyorum diyen oldu.
Yalnızca İsa arkadaş ilgileniyor sanırım ama oda fazla bir şey yapamıyor anlaşılan.

İşin temelinde USART kesmesi oluşturmak olduğuna göre sensör programı örnek alınarak işlemci farkları giderilir ve usart kesmesi oluşturacak şekilde sistem kurulur.
Bu nedenle başla satırına kadar olanları burada açıklamayacağım.
Algoritma kısmında detaylı şekilde açıkladık. Sistem senaryosuna göre Master, 1. ci sensöre sen bilgini yolla emri yollayacak oda kendi üzerindeki sensörün durumunu okuyarak karşı mesaj olarak bunu Mastere yollayacak idi. Bu gün ilk sensör kartına verilecek emri burada işleyeceğiz.
Önce elimizdekileri bir inceleyelim.
Elimizde ID isimli bir değişken var. Bu sensör kartından gelecek olan Kimlik numarası olacak ve bilginin kimden geldiğini buradan anlayacağız.
Elimizde birde KIME isimli değişkenimiz var. Buda emrin hangi sensör kartına verildiğini belirliyor.
Elimizde birde VERI isimli bir değişkenimiz var ve buda sensör kartına verilen emri belirliyor. Daha öncede belirtmiştik. Alsında bu projede emir şekli yalnızca tek ama ileride birden fazla emir verilebileceğini düşünerek böyle bir uygulama yaptık. Bu projede emir tipine 10 değerini veriyoruz.
Şimdi toparlayalım. ID değerini başlangıçta sıfırlıyoruz ve sensör kartından bir bilgi geldiği zaman ID değeri otomatikman bilgi yollayan sensör kartının numarasını alacaktır (USART kesmesi kısmında)
Daha sonra kime emir vereceğiz 1 nolu sensöre o halde Kime=1 olması gerekiyor.
Veri değeri ne olacak 10 olacak tabiiki. Şimdi bakalım program satırları ne şekil alacak.

BASLA:
      ID=0
      Kime=1
      Veri=10
      Gosub Yolla
      GOSUB DELAY
     
Sonunda birde gecikme koyduk. Sebebi, biz sensör-1 kartına emir yolladık. Oda bu emri alacak ve hemen sensörünü okyup geri Master'a bilgi olarak yollayacak. Gecikme bu haberleşmeye biraz imkan sağlayacaktır.
Dikkat ederseniz gecikme satırına kadar 1 nolu sensör kartına 10 emrini yolladık.
Şimdi sensör kartından gelecek bilgiyi beklemekten başka bir şey yapmak gerekmiyor.Peki bilgi geldiğini nasıl anlayacağız.? Tabiiki ID değerini kontrol ederek. Bilgi geldiğinde program kendi kendine zaten USART kesmesine atlayacak ve gelen bilgileri alacaktır. Orada bilgi gelmiş ise ID değeri gelen kimlik numarası ile eşitlenecek ve böylece siz yukarıda ID yi kontrol ederek bilgi gelip gelmediğini anlayacaksınız.
Bu aşamada ID değeri sıfır ise sıfırdan farklı bir değer oluncaya kadar beklemek gerekiyor.
BU nedenle while ID=0 :wend gibi bir komutla ID nin değişmesini bekleyebilirsiniz.
Diyelimki ID yeni bir değer aldı ve o değerde ID=1 oldu. Ne yapmak gerekiyor. ID beklenen kimlik numarasını almış ise sensör bilgiside gelmiş olacaktır. Ohalde gelecek olan ikinci bilgi bize sensörün durumunu bildirecek. Sensör programına bakarsanız. Bu bilgi 10 ise sensör=1 ve sıfır ise sensör=0 olduğu anlaşılacak.
İşte bu konumda sensör bilgisi 10 ise gidip LED'i yakmanız değilse bir şey yapmamanız gerekiyor.

Bu işlemden sonra değişkenleri sıfırlayarak bir sonraki sensör kartına emir yollayıp ona ait bilgileri istemek ve gelen bilgiye göre led'i yakmak yada söndürme işlemini yapmanız ve daha sonrada 3 nolu sensör kartı için aynı işlemleri yapmanız gerekiyor.

Kusura bakmayın. Amacım kendi kendime program yazıp buraya koymak değil. Amacım bu konuyla ilgili kişileri mantık geliştime konusunda biraz olsun eğitmek ve doğruyu kendilerinin bulmasını sağlamak. Bu nedenle bilgileri mümkün olduğunca açıklamalı veriyorum. Hatta bazılarını direk yazıyorumki gerisini siz getirebilesiniz diye.
Umarım yardımcı oluyorumdur.

ete

İsak Yazmış ;
Alıntı YapSayın ete hocam ve arkadaşlar;
alıcı kısmı için yazmaya çalıştığım program aşagıda.
Ben derlemeye çalıştım ama demo program kullandığımdan tam olarak derlemedi.
Siz bir bakabilir misiniz.
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2011 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 16.04.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :ALICI KISMI İÇİN YAZILMASI MUHTEMEL PROGRAM                                                   *
'*          :                                                   *
'****************************************************************
@ device pic16F877a                      'işlemci 16f628                             
@ device pic16f877a, wdt_off             'watch dog timer açik
@ device pic16f877a, pwrt_on             'power on timer açik
@ device pic16f877a, protect_off         'kod protek kapali
@ device pic16f877a, mclr_off            'mclr pini kullaniliyor.
@ device pic16f877a, intrc_osc_noclkout  'dahili osilatör kullanilacak

define OSC 4
CMCON=7
PortE=0: TrisE=%111 ' 3 bit LED LER İÇİN ÇIKIŞ OLARAK AYARLANDI
PortC=0: TrisC=%10000000 ' 7. bit RX pini olarak giriş

DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
SYMBOL LED1=PORTE.0      '3 TANE LED BAGLANACAK -YERLERİ
SYMBOL LED2=PORTE.1
SYMBOL LED3=PORTE.2

KIMLIK var byte 56
KIME   VAR BYTE 57
GELEN  VAR BYTE 58
VERI   VAR BYTE 59
TEMP   VAR BYTE 60
I      VAR BYTE         
SAY    var byte
                         'YOLLA DEĞİŞKENİ VARDI AMA KULLANILACAK MI BİLMİYORUM

pause 500

RCIE=1
PEIE=1
GIE=1

ON INTERRUPT GOTO KESME
KIMLIK=0

BASLA:
   
KIMLIK=0
KIME=1
VERI=10
GOSUB YOLLA
GOSUB DELAY
YOLLA:

Hserout ["$","R","F",#Kime,#Veri,$45,$4E,$44,$0D,$0A]
    return

LEDYAK:
SELECT CASE KIMLIK
CASE 1
HIGH LED1
PAUSE 400
LOW LED1
CASE 2
HIGH LED2
PAUSE 400
LOW LED2
CASE 3
HIGH LED3
PAUSE 400
LOW LED3


END SELECT

      GOSUB DELAY
      GOTO BASLA
     
DELAY: FOR I=0 TO 255
          PAUSEUS 5
       NEXT
       RETURN     
     
DISABLE
KESME:
    GIE=0
    HSERIN 5,ATLA, [WAIT("$RF"),KIME,GELEN]
    IF KIMLIK=KIME THEN YOLLA=1
ATLA:
    TEMP=RCREG
    GIE=1
    Resume
    enable
end   

ete

Bir sürü kusur var programda;
Birincisi, program bir döngü içinde çalışmalıdır. Alt alta satırlar sırası ile işlenecek komutları gösterir.
Komutların en altına gelindiği zaman program oradan en başa yeniden yönlendirilmelidirki aynı işleri yeniden yapsın.

İkincisi, sıklıkla kullanılan bazı komut yada komut satırları bir alt program altında toplanır ve o satırları sürekli yeniden yazmak yerine oraya GOSUB ile program yönlendirilir. Oradan dönmesi içinde en altına bir RETURN koyulur. Mesela GOSUB YOLLA  Bunun anlamı YOLLA isimli etikete git oradaki satırları icra et ve Return görünce de seni yolladığım yere dön.
Şayetprogramiçinde Return ile dönülecek bir etikete program sıra takip ederek yada goto ile gider ise sonunda programda STACK taşması meydana gelir ve program muhtemelen kitlenir. Sebebi de her GOSUB komutunda ,işlemci ayrıldığı adresi stack denilen bir ara hafızaya atar. 5 adet kullanılabilir hafıza olduğunu düşünün stack da. Gittiği yerde Return görüp dönerken hemen stack deki kayıtlı adresi alır ve o adrese geri döner. Böylece giderken stack kalan adres 4 e düşer ama return iledönerken adres yine 5 olur. Bazen Gosub içinde yeni bir gosub olabilir o zaman stack önce 4 e sonra 3 e düşer.
Bu nedenle iç içe geçmiş Gosub ların sayısı 3 ten fazla olmamalıdır. Aksi taktirde staqck hafızası biter ve program nerden geldiğini şaşırarak ratsgele bir yere gider ve kitlenir.

Bunlar temel hataların şimdi ilk hataya nasıl yer vermişsion ona bakalım.
BASLA:
   
KIMLIK=0
KIME=1
VERI=10
GOSUB YOLLA
GOSUB DELAY
YOLLA:

Hserout ["$","R","F",#Kime,#Veri,$45,$4E,$44,$0D,$0A]
    return
Program kendiliğinden satır takip ederek Yolla satırına geliyor ve Hserout komutunu çalıştırıyor.
Sonraki satırda ise RETURN komutunu görüyor. Ne yapacak ? şaşıracak elbette. Çünki oraya Gosub ile gelmediki? Ohalde program şöyle olmalı idi.
BASLA:
   
KIMLIK=0
KIME=1
VERI=10
GOSUB YOLLA
GOSUB DELAY
GOSUB YOLLA
  GOTO BASLA

YOLLA:

Hserout ["$","R","F",#Kime,#Veri,$45,$4E,$44,$0D,$0A]
    return

Gördüğünüz gibi Yolla etiketine gosub ile yolladım ve oradan return ile döndü. Gei döndükten sonra 1. sensör emri yollamış oldu. Peki ne yapacakprogram başamı dönmesi gerekiyor. Tabiiki hayır.
Bu onumd 1ci sensöre okuduğun sensör değerini bana yolla diye emir yolladık. 1. sensörde o emri alacak ve hemen sensör bilgisini yollayacak. Bu bilgi nereye gelecek tabiiki Usart kesmesine gelecek. Ama program nerede bekleyecek ilk sensöre emri yollandıktan sonra o satırda gelen emrin 1. nolu sensörden geldiğini anlayıncaya kadar beklemesi gerekmezmi. Kimdir bunu sağlayacak değişken, Tabiiki KIMLIKisimli değişken. Dikkat ederseniz birinci sensöre bilgi yollarken KIMLIK=0 diyerek onu sıfırladık. O halde Hserin komutu ile gelen bilgiden birisi KIMLIK bilgisi olması gerekir. Gelen kimlik 1 ise anlamı birinci sensöre emri yoladık karşılığında sensör kartı bilgisini yoladı demek olacaktır. O halde Kımlık=1 olmuş ise birinci sensördenbilgi geldi demektir . Ne geldi onada GELEN ismini verelim. Gelen şayet 10 ise (sensör kartı bubilgiyi sensörü=1 ise yollayacak idi bak sensör programı) sensör=1 demek olacaktır. O halde Gelen=1 ise Led=1 olacaktır. Bunu sonradankullanabilmek amacı ile SENSOR_BIR=GELEN şeklinde bir başka değişkene de aktarma uygun olacaktır.

Buraya kadar yalnızca 1 nolu sensöre emir verdik ve karşılığında gelen bilgiyi aldık. Geride daha iki adet sensör kartı daha var. Aynı işlemleri onlarada uygulayıp en sonunda tüm sensörleri değerlendirmek ve Başa dönmek gerekir. Bu nedenle programın en son satırı GOTO BASLA komutu olmalıdır.

Ete

Powered by EzPortal