PIC basic de sistem oluşturma

Başlatan rumeysa34, 29 Mayıs 2020, 17:22:36

rumeysa34

İyi günler herkese. Microcode Studio'yu yeni kullanmaya başladım. Bir proje yapmam istendi bir kısmına kadar yaptım fakat sonra tıkandım. Yol gösterebilirseniz sevinirim. Soru şu şekilde Şekildeki sistemde Paket sağdan geliyor. PAS (parka algılama sensörü ) paketi algılayınca silindir A paketi diğer banda itiyor A silindirin son konuma vardığını Sensör2 tarafından algılanıyor ve silindir B paketi sola itiyor. Silindir A geri gidiyor ve peşine silindir B geri gidiyor. Sistem S1 butonuna basıldığında çalışmaya başlayacak ve sonsuz çevrimde çalışacaktır.Y1,Y2,Y3,Y4 selenoid valflerdir ve bağlantılı sensörden sinyali alıp valflerin yönünü değiştirerek pistonları hareket ettirir. Bu sistem Pic16F877'ile kontrol edilmek isteniyor.S1 butonu,Y1,Y2,Y3,Y4 selenoid valfler ve sensörlerin pic'in hangi port'a bağlı olduğu aşağıda verilmiştir. Sistemin istenildiği gibi çalışması için gerekli programı yazınız. Silindir hareketleri ve sensör algılamaları gibi bilgilendirmeler LCD'de gözükmesi gerekmektedir. (pic'in çıkışı valfleri hareket ettirebilecek güçte varsayılıyor.

Benim yazdığım kodlar:
define LCD_DREG PORTD
define LCD_DBIT  4
define LCD_EREG PORTD
DEFINE LCD_EBIT  3
DEFINE LCD_RWREG PORTD
DEFINE LCD_RWBIT 2
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 1
DEFINE LCD_BITS  4
DEFINE LCD_LINES 2


DEFINE ADC_BITS 8 
DEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50

TRISB=0
TRISC=%11111111
PORTD=0

ADCON1= %00001110

BASLANGIC VAR BYTE

SYMBOL START= PORTA.0
SYMBOL S1= PORTC.0
SYMBOL S2= PORTC.1
SYMBOL S3= PORTC.2
SYMBOL S4= PORTC.3
SYMBOL PAS= PORTC.4

SYMBOL Y1= PORTB.3
SYMBOL Y2= PORTB.2
SYMBOL Y3= PORTB.1
SYMBOL Y4= PORTB.0

BASLA:

 IF START=0 THEN
 DONGU:
 IF PAS=0 && S1=0 && PORTB.0=1 THEN
 HIGH Y2
 ENDIF
 
 IF S2=0 && S3=0 && PORTB.1=1 THEN
 HIGH Y3
 ENDIF
 
 IF S4=0 THEN: Y1=1
 ENDIF
 
 GOTO BASLA
 END

Çizdiğim Devre:



  Soruda verilen devre


ete

Bu gibi karmaşık lojik durumlarda başarılı algoritma yaratabilmek için sizin program platformunuzu çalışma ortamı gibi düşünmeniz daha doğru olur.
Sizin örneğinizden yola çıkarsak,

Programda önce BIRINCI_SAFHA olacak burada PAS sensörü cismi algılamak için bekleyecek.
ALgılar algılamaz sistem IKINCI_SAFHA ya geçecek. Burada PAS=0 olduğunda aynı zamanda PistonA kapalı konumda (Y1=0) ve sensor2 ninde aktif olmaması gerekiyor. O halde bunlarıda kontrol etmek gerekecek.
BASLA:
IF PAS=0 and Y1=0 and Sens2=0 THEN SAFHA_IKI
GOTO BASLA

İkinci safhada önce Piston-A açılacak ve Sensör 2 nin açılmasyı tespit etmesi beklenecek.
Y1=1
While Sens2=1:wend
Program bu satıra gelmiş ise sens2 pistonA yı görmüş demektir. O halde
Y1=0 :Y3=1' pistonB çalıştı
Y2=1 'Piston A geri çekiliyor
While Sens3=1:wend
Sensör3 Piston B yi gördü ve durdurdu 
Y3=0:
Bu bilgiler ışığında ancak bu kadarını yazabildim.
Ben programı yazacak olsam şunları sorardım.
Sensörler boşta lojik olarak ne veriyor. Burada pasif =LOW , aktif=HIGH gibi düşündüm.
Pisto harketleri nasıl kontrol ediliyor. Sensör-1 ve Sensör-2 şeklinde piston önünde iki sensör mevcut. Biri ne iş yapıyor diğeri ne iş yapıyor. Mesela Biri kapanmış halinimi yakalıyor diğeri açılmış halinimi yakalıyor. Bu detaylar önemli. Şayet düşündüğüm gibiise;
-Pas sensörü paketi görünceye kadar bekle. Bakarken PAS=0(Aktif) y1 ve y2 nin her ikisininde LOW olmasınada bakılacak.
-Pas=aktif oldu , Y1 çalıştı.  piston Sen-2 ye kadar gelmesi beklenecek. Geldiğinde. Y1=0 olacak. AYnı zamanda Y3=1 yapılarak PistonB çalıştırılacak. Böyece PistonB sen-4 önüne gelinceye kadar ittirecek ve Sen-4=0 olduğunda Piston B duracak (Y3=0) Bu aşamada Piston A geri çekilecek yani Y2=1 yapılacak ve sensör-1 bunu görünceye kadar geri çekilecek galiba.

Sonuç olarak buna benzer bir algoritma kurabilirsiniz tabiiki sistemin çalışmasını tam olarak biliyorsanız. Bilmiyorsanız soruları sıralayın bence.

Ete

rumeysa34

Çok teşekkür ederim hocam. Verdiğiniz bilgiler doğrultusunda tekrar deneyeceğim.

rumeysa34



Hocam dediğiniz gibi denedim fakat bu şekilde çalıştı. İlk yazdığımda da aynı bu şekilde çalışmıştı. Bir de start butonuna basmadan direkt çalışıyor onu nasıl düzeltebilirim. Bir de soruyu sorarken yazmamışım S1--> A silindiri geride S2--> A ileride, S3--> B geride S4--> B ileride, y1 yandığında A silindiri ileride y2 yandığında geride, y3 yandığında B silindiri ileride y4 yandığında geride olacak.

ete

#4
Bu gibi komplike işlerde önce oturup bir senaryo yazmak gerekir. Senaryo dediğimiz şey bir nevi adım adım sistemi lafla çalıştırmaktır. Aynen programın nasıl çalışmasını istiyorsak adımlarda buna uygun olmalı. Böyle bir şey yazabilirsen onu programa dönüştürmek çok kolay olur. Ben örnek vereyim.
-SI butonuna basıldımı
- hayır ise tekrar başa dön aynı şeyi tekrarla
- butona basıldı, A pistonu na hareket verilecek. AMa bakalım piston doğru yerdemi
- Piston doğru yerde değil ise ve S2 sensörü aktif ise piston geri çekilmemiş demektir.
- O halde önce geri çekilmeli Y1=0:Y2=1
- S1 sensörü aktif ise A Pistonu doğru konumdadır.Kapalıdır yani. O halde Y1 selenoidine güç verilecek Y1=1
- Piston varması gereken konuma vardımı yani S2=1 oldumu?
- Olmadı ise oluncaya kadar bekle
- S2=1 oldu o halde B pistonuna hareket verilecek. Peki piston doğru konumdamı? Yani S3=1 midir?
- Değil ise B pistonu geri çekilmelidir. Y3=0: Y4=1
- B pistonu doğru konumda. Önce B pistonuna hareket verelim Y3=1:Y4=0:
- A pistonunu geri çekelim Y1=0:y2=1
- B pistonu doğru konuma geldimi? Gelmediise gelinceye kadar bekle.
- B pistonu açıldı. O halde pistonu geri çekebiliriz demektir. Y3=0:Y1=0
- Bu konumda bütün pistonları geri çekinceye kadar bekliyoruz. Yani
- Şayet A pistonu S1 sensörü konumuna gerei geldimi bakıyoruz. Geldi ise Y1=0:y2=0
- B pistonu geri geldimi yani S2=1 oldumu oldu ise Y3=0:y4=0.
- Çevrim tamamlandı Tekrar başa döneceğiz.
- Bu baş denilen yer S1 tuşuna basıldıktan sonraki bölümde olabilir tekrar S1 tuşuna basılmasını bekleyen konumda olabilir.
  Hangisi olduğu soruyu sorona sormak lazım. Ancak açıklamada S1 butonuna basılarak çalışmaya başlayacak ve sonsuz olarak
  çalışmasına devam edecek denildiğine göre yanlızca bir kere S1 butonu kontrol edilecek demektir.
  Ledleri de bu program kontrol edecek ise uygun noktalarda ledler yakılmalı ve söndürülmelidir.

Bu benim yazdığım senaryo. Açıklamadan anladığım kadarı ile çalışma şekli böyle. Sende kendi senaryonu yaz ve karşılaştır. Dikkat edersen senaryo bir mantık sırasıdır. Programa dönüşmesi çok kolaydır. Program yazmakla uğraşma çünki senaryon yoksa mantık sırasını atlarsın yada kontrol etmen gerekenleri kontrol etmeyi unutabilirsin. Takıldığın yerde tekrar sorarsın.

Bu gibi senaryolarda iki farklı düşünce vardır. Birisi her şeyin yolunda gittiğı varsayılarak bir algoritma oluşturmak diğerinde ise bazı şeylerin ters gideceği düşünülerek farklı bir algoritma oluşturmak.
Sana tavsiyem her şeyin yolunda gittiğini varsayman. Bu nedemek dersenşöyle açıklanabilir.
Başlangıçta A pistonu kapalı, B pistonu kapalı ve her ikisinin kapalı konumunu kontrol eden sensörler de aktif durumda olduğunu düşünebilirsin.
Her şey  yolunda gitmiyorsa ne olabilir birde ona bakalım. Bir pistona aç emri verilmeden önce o pistonun kapalı olup olmadığını da kontrol etmek kapalı ise aç emrini vermek kapalı değil ise önce kapatmak sonra aç emrini vermek gerekir. Buda ne olur ne olmaz senaryosu oluyor.
Ben sana her şeyin yolunda gittiği senaryoya uygun bir program örneği vereyim değerlendir. Bak bakalım istenilen gibi çalışıyormudur.
BASLA:
      WHILE S1=1:WEND  'S1 BUTONUNA BASILINCAYA KADAR BEKLE
BASILDI:
       WHILE PASS=1:WEND 'PASS SENSÖRÜ AKTİF OLUNCAYA KADAR BEKLE
PASS_GECTI:
           Y1=1:WHILE S2=1:WEND  'a PİSTONU AÇILIYOR S2=0 OLUNCA AÇILMIŞ OLACAK
A_ACILDI:
           Y1=0:Y3=1  'A PİSTONU AÇILDI ŞİMDİ b PİSTONUNUDA AÇALIM
           WHILE S4=1:WEND 'PİSTON AÇILINCAYA KADAR BEKLE
B_ACILDI:
           Y3=0:Y2=1 'B PİSTONUDA AÇILDI ŞİMDİ A YI KAPATALIM                                            
           WHILE S1=1:WEND 'PISTON KAPANINCAYA KADAR BEKLE
           Y2=0:Y4=1  'A KAPANDI ŞİMDİ B Yİ KAPATALIM
           WHILE S3=1:WEND 'PİSTON KAPANINCAYA KADAR BEKLE
           Y4=0 'PISTON KAPANDI. 
           GOTO BASILDI  'ÇEVRİM TAMAMLANDI ŞİMDİ TEKRAR BAŞA DÖN.



Ete

rumeysa34

Anladım hocam. Kendi yazdıklarımla sizin anlattıklarınızı karşılaştırıp yeniden yazacağım. Çok teşekkür ederim vakit ayırdığınız için.

Powered by EzPortal