877 ile Asansör.Döngü yapamıyorum.

Başlatan isa_1907, 12 Aralık 2013, 01:42:07

isa_1907

Arkadaşlar merhabalar,
Hi tech C ile yazdığım kod aşağıdadır.Bu bir 4 Katlı asansör için yazmaya başladım.

ZEMIN,KAT1,KAT2,KAT3 => Kabin içi butonlar
SZEMIN,SKAT1,SKAT2,SKAT3 => Kat sensörleri

Sorum ise şu arkadaşlar, ben bunu önce ISIS de kurarak denedim ve çalışıyordu, istediğim gibi.Butonlar PUSH BUTON(bas çek) olmalıdır.ISISTE elimi butonlardan çekince devre çalışıyor.Devreyi yaptığım karta taktığımda BUTONLAR ve SENSÖRLER(buton gibi düşünürsek)
basınca çalışıyor.Elimi çektiğimde çalışma duruyor.

Kodda while döngüsüyle yaptım ama PIC'e yüklediğimde butonlara basılı oldugu sürece calısıyor.Bi kere butona basayım çalışssın istiyorum.Yardım eden herkese şimdiden çok teşekkür ederim.

#include <stdio.h>
#include <pic.h>
#include <htc.h>
#include "delay.h"


#define ZEMIN RB0 
#define KAT1 RB1
#define KAT2 RB2
#define KAT3 RA4
#define STOP RB4
#define FAN RB5
#define ALARM RB6 
//MOTOR
#define SOL RD2
#define SAG RD3
//KUYU SWITCH
#define  SZEMIN RA0 
#define  SKAT1 RA1
#define  SKAT2 RA2
#define  SKAT3 RA3
//KAPI KILITLERI
#define  LZEMIN RC0 
#define  LKAT1 RC1
#define  LKAT2 RC2
#define  LKAT3 RC3 


void SON()
{

static unsigned int  KAPA=0;

if(ZEMIN==1)
	{	
		KAPA=1;
		while(SZEMIN==0)
		{
		 	  if(SKAT1==1)
				{SOL=1;}
			
	 		  if(SKAT2==1)
		      	{ SOL=1;}
	
			  if(SKAT3==1)
				{ SOL=1;}
		}
		   	  if(SZEMIN==1)
				  {SOL=0;LZEMIN=1;KAPA=0;}
				
	}	
	
	if(KAT1==1)
	 {	KAPA=1;
	
		while(SKAT1==0)
			{
		  		if(SZEMIN==1)
					{SAG=1;}
				if(SKAT2==1)
		        	{SOL=1;}
 				if(SKAT3==1)
					{SOL=1;}
			}
				if(SKAT1==1)
				    {SAG=0;SOL=0;LKAT1=1;KAPA=0;}
			
	}
  	     
	if(KAT2==1)
	{	KAPA=1;
		while(SKAT2==0)
			{
		  		if(SZEMIN==1)
					{SAG=1;}
			 	if(SKAT1==1)
					{SAG=1;}
 				if(SKAT3==1)
					{SOL=1;}
			}
		 
				if(SKAT2==1)
				  {SAG=0;SOL=0;LKAT2=1;KAPA=0;}
						
	}
		 
	if(KAT3==1)
	{	KAPA=1;
		while(SKAT3==0)
		{
		  if(SZEMIN==1)
			{SAG=1;}
		  if(SKAT1==1)
			{SAG=1;}
		  if(SKAT2==1)
			{SAG=1;}			
  		}			
   		  if(SKAT3==1)
			{SAG=0;LKAT3=1;KAPA=0;}
							
	}
}					
				
				
						
	

void BASLA()
{
	while(SZEMIN==0)
	{ SOL=1;}
			
	if(SZEMIN==1)
	{ SOL=0;LZEMIN=1;}

}



void main() 
{
//KABIN ICI

	ADCON1=0x07;
	TRISA=0XFF;
	TRISB=0XFF;
	TRISC=0X00;
	TRISD=0X00;
	PORTA=0X00;
	PORTB=0X00;
	PORTC=0X00;
	PORTD=0X00;



while(1)
{

	SON();

}	
}

Erol YILMAZ

#1
Asansör'de güvenlik önemlidir.

Bu tarz kontrollerde en önemlisi "giriş kısmıdır"

Sinyal hem devrede, hem de yazılımda filtre edilmelidir.

Bir girişe, sadece 1 kere bakarak karar verirsek en ufak bir PİK sinyal programın döngüsüne mudahil olabilir.

Misal bir girişi 16 kere okuyup, çoğunluğu ne ise (0,1) onu kabul edebilirsiniz.

Daha da iyi bir giriş için şunu diyebiliriz.
Sinyal yavaş bir sinyal ise (Misal normalde 200 mS lik bir PALS ise) bu okumayı 50 mS'ye yayabilirsiniz.
Bu şekilde 50 mS nin altındaki sinyalleri (bu sizin için anlamlı ise) görmezden gelirsiniz.

Kabil ATICI

durum =0; bayrak

örnek olarak

kat1,kat2,kat3,kat4

but1,but2,but3,but4

1..4 yukarı, 20...22 aşağı durumlarını temsil eder.
kat1 iken but1 bas  durum=0 (değişmez)
kat1 iken but2 bas  durum=1
kat1 iken but3 bas  durum=2
kat1 iken but4 bas  durum=3


kat2 iken but1 bas  durum=20
kat2 iken but2 bas   durum=0 (değişmez)
kat2 iken but3 bas  durum=2
kat2 iken but4 bas   durum=3


kat3 iken but1 bas durum=20
kat3 iken but2 bas durum=21
kat3 iken but3 bas durum=0 (değişmez)
kat3 iken but4 bas durum=3


kat4 iken but1 bas durum=20
kat4 iken but2 bas durum=21
kat4 iken but3 bas durum=22
kat4 iken but4 bas durum=0 (değişmez)



while (durum==0)
{;buton durum atama. (asansör hareket etmiyorken butonlar çalışacak)
if kat1==1
{
if but2==1
{..
durum=1}
.
}
.
if but3==1
{..
durum=2}
.
.}

while (durum !=0) ;durumunda aktif olacak şekilde (durum sıfır değilken aktif olacak)





;hareket için
{
if durum==1
{;hareket ile ilgili kodlar burada
SOL=1
...
if kat2==1
{durum=0}

if kat3==1
{durum=0}

if kat4==1
{durum=0}
...
}
if durum==2
{
;hareket ile ilgili kodlar burada
SOL=1
if kat3==1
{durum=0}
...
}

...
if durum=20
{
SAG=1
...
}
..
}
ambar7

HexfeT

#3
Bunu bir şeyler öğrenme amaçlı yapmaya çalışıyorsanız güzel. Fakat gerçekten bir asansör için yapmaya çalışıyorsanız vayy o asansöre binenlerin haline. Asansör gibi güvenilirliğin son derece önemli olduğu bir şeyi tasarlayan kişinin bu kadar basit bir yerde takılıp daha işin başında soru sorması düşündürücü olur. ;D

Ali_54

Kesme tabalı çalışırsan işin bir nebze kolaylaşabilir. Basılan tuşlar için yanlış hatırlamıyorsam b0-b3  pinde giriş kesmesi var. pin sayısı yetmezse bu 4 pini 16 ya kadar çoğullayarak giriş yapabilirsin. buna göre komple algoritmayı değiştirmeni öneririm.

Birde 18 katlı binanın 4.katında oturuyorum. 3 asansör var Asansör yazılımını kim yatıysa her bindiğimde içimden küfür ediyorum. 4 tenn 0 a gitmek için önce 16 ya götürüyor   kim basıyosa yukardan, sonra tüm ara katlara uğra. stop bas çalışmaz devre dışı. ona göre yazılmı iyi kurgula sana da okumasınlar :D
1 harf öğretenin 4 gün kölesi olurum.

isa_1907

Alıntı yapılan: ambar7 - 12 Aralık 2013, 10:35:40
durum =0; bayrak

örnek olarak

kat1,kat2,kat3,kat4

but1,but2,but3,but4

1..4 yukarı, 20...22 aşağı durumlarını temsil eder.
kat1 iken but1 bas  durum=0 (değişmez)
kat1 iken but2 bas  durum=1
kat1 iken but3 bas  durum=2
kat1 iken but4 bas  durum=3


kat2 iken but1 bas  durum=20
kat2 iken but2 bas   durum=0 (değişmez)
kat2 iken but3 bas  durum=2
kat2 iken but4 bas   durum=3


kat3 iken but1 bas durum=20
kat3 iken but2 bas durum=21
kat3 iken but3 bas durum=0 (değişmez)
kat3 iken but4 bas durum=3


kat4 iken but1 bas durum=20
kat4 iken but2 bas durum=21
kat4 iken but3 bas durum=22
kat4 iken but4 bas durum=0 (değişmez)



while (durum==0)
{;buton durum atama. (asansör hareket etmiyorken butonlar çalışacak)
if kat1==1
{
if but2==1
{..
durum=1}
.
}
.
if but3==1
{..
durum=2}
.
.}

while (durum !=0) ;durumunda aktif olacak şekilde (durum sıfır değilken aktif olacak)





;hareket için
{
if durum==1
{;hareket ile ilgili kodlar burada
SOL=1
...
if kat2==1
{durum=0}

if kat3==1
{durum=0}

if kat4==1
{durum=0}
...
}
if durum==2
{
;hareket ile ilgili kodlar burada
SOL=1
if kat3==1
{durum=0}
...
}

...
if durum=20
{
SAG=1
...
}
..
}


Çok sağ olasın ustam, emeğe saygım var her durum için ayrı ayrı üşenmeden yazmışşsın.Kodunu inceledim mümBir sıkıntısı yok sadece eksiği var.O eksiklikte ZEMIN,KAT1,KAT2,KAT3 butonlarından elimi çektiğimde program çalışmıyor.Son olarak şöle bir şey denedim bu kodda başarız oldu.


if(ZEMIN==1)
   KAPA=1;
   if(KAPA==1)
   {   while(SZEMIN==0)
      {
            if(SKAT1==1)
            {SOL=1;}
         
            if(SKAT2==1)
               { SOL=1;}
   
           if(SKAT3==1)
            { SOL=1;}
      }
              if(SZEMIN==1)
              {SOL=0;LZEMIN=1;KAPA=0;}
   }         
      

isteyene video da çekip yollarım.

Kabil ATICI

açıklamaları yazılmamış bir programın nasıl çalıştığını anlamaya çalışmak bulmaca çözmekten beter.

SÖyle bakalım;
zemin kattasın 2. katın düğmesine bastın. kapı kapandı. Şimdi asansör hangi kata gideceğini nereden bilecek.? Bunu programında göremedim.
Kuyu anahtarı kullanırsan anahtar kurtulur kurtulmaz hemen duracaktır. Çünkü kuyu anatarlarıda senin butonlarından farklı değil.

Örneğin aşagıdaki kod parçasında zemin anahtarı basılı iken ve kuyu anahtarın basıl iken motor harekete geçiyor. asansör hareket geçti anahtar hala baslı ise kuyu anahtarı zemin anahtarından kurtulur kurtulmaz hemen duracaktır. Anahtarın basılı değilse durmaz. Bu noktada nerede durması gerektiğini belirtecek şekilde bir kod oluşturmalısın (kat anahtarı bırakıldıktan sonra butonlardan bağımsız sadece kuyu anahtarlarını takip edip İstenen katta duracak şekilde bir akış oluşturman gerekir) "while(SZEMIN==0)" ifadesini "if" ile de yapabilirsin.

if(ZEMIN==1)
    {   
        KAPA=1;
        while(SZEMIN==0)
        {
              if(SKAT1==1)
                {SOL=1;}   
             if(SKAT2==1)
                 { SOL=1;}
              if(SKAT3==1)
                { SOL=1;}
        }
                if(SZEMIN==1)
                  {SOL=0;LZEMIN=1;KAPA=0;}
    }   

Not: yazdığım kod parçası sadece fikir vermesi içindi...
ambar7

picusta

100 katli gökdelen asansörü için 100 if else mi yazilacak ?

Asagidaki kodda 1000 katli bina için progamin ana parçasini veriyorum, diger alt fonksyonlari yazarsin.

#define MX_KAT  1000

typedef struct Kat
 {
 int Numarasi;
 int GirisPin;
 int CikisPin;
 }Kat;


Kat GidilecekListesi[MX_KAT];

Dongu()
{
Kat GidilecekKat;
Kat GelinenKat;

if (KabinButonTest(GidilecekKat))
    {
    ListeyeEkle(GidilecekListesi, GidilecekKat);
    }

if (KataVardikMi(GelinenKat))    
    {
    ListedenCikart(GidilecekListesi,GelinenKat );
    }
}

isa_1907

Alıntı yapılan: ambar7 - 12 Aralık 2013, 22:11:48
açıklamaları yazılmamış bir programın nasıl çalıştığını anlamaya çalışmak bulmaca çözmekten beter.

SÖyle bakalım;
zemin kattasın 2. katın düğmesine bastın. kapı kapandı. Şimdi asansör hangi kata gideceğini nereden bilecek.? Bunu programında göremedim.
Kuyu anahtarı kullanırsan anahtar kurtulur kurtulmaz hemen duracaktır. Çünkü kuyu anatarlarıda senin butonlarından farklı değil.

Örneğin aşagıdaki kod parçasında zemin anahtarı basılı iken ve kuyu anahtarın basıl iken motor harekete geçiyor. asansör hareket geçti anahtar hala baslı ise kuyu anahtarı zemin anahtarından kurtulur kurtulmaz hemen duracaktır. Anahtarın basılı değilse durmaz. Bu noktada nerede durması gerektiğini belirtecek şekilde bir kod oluşturmalısın (kat anahtarı bırakıldıktan sonra butonlardan bağımsız sadece kuyu anahtarlarını takip edip İstenen katta duracak şekilde bir akış oluşturman gerekir) "while(SZEMIN==0)" ifadesini "if" ile de yapabilirsin.

if(ZEMIN==1)
    {   
        KAPA=1;
        while(SZEMIN==0)
        {
              if(SKAT1==1)
                {SOL=1;}   
             if(SKAT2==1)
                 { SOL=1;}
              if(SKAT3==1)
                { SOL=1;}
        }
                if(SZEMIN==1)
                  {SOL=0;LZEMIN=1;KAPA=0;}
    }   

Not: yazdığım kod parçası sadece fikir vermesi içindi...

Kusura bakmayın yanlarında açıklamayı eklemeyi unuttum, kolay anlaşılması için;

int KAPA=0;    //degişken
if(ZEMIN==1) // zemin butonuna basılırsa
   KAPA=1; // degişken1
   if(KAPA==1) //degişken 1 ise
   {   while(SZEMIN==0) // zemin kuyu butonu 0 olana kadar işlem yap
      {
            if(SKAT1==1) // Kabin 1.kattaysa
            {SOL=1;}//motor sola dön
         
            if(SKAT2==1)//kabin 2.kattaysa
               { SOL=1;}//motor sola dön
   
           if(SKAT3==1)//kabin 3.kattaysa
            { SOL=1;}//motor sola dön
      }
              if(SZEMIN==1)//kabin zemin kata geldiğinde
              {SOL=0;KAPA=0;}//motoru durdur, degiskeni 0 yap,
   }   

Koda bugun KAPA integer'ını ekledim, o da butonu basılı yapsın diye.Ama işe yaramadı...
Koda baktıgım da hersey dogru gözüküyor ama işin içinden çıkamadım.

Struct yapısıyla veren arkadaşıma da teşekkür ediyorum, 4 katlı bir kod olduğu için structure kullanma gereğinde bulunmadım.Yine de alakan ve ilgin için teşekkür ederim.

isa_1907

Kocaman bir ahhhh çekesim geldi.Sorun basit bir CONFIG ayarından kaynaklıymış sorunu çözdüm.Yardımcı olan herkese teşekkürler.Bu arada paylaştığım kod tamamen doğru çalışmaktadır.Birilerinin işine yaraması dileğiyle...

aydınD