avatar_BİDİL

Sayaç sayma sorunu (while:wend)

Başlatan BİDİL, 08 Şubat 2013, 09:50:23

BİDİL

Yapmaya çalıştığım sayıcı devresinde sayma ile ilgili bir sorunum var. İki adet ağır devir motorunun tur sayılarını iki adet metal sensörü ile saymaya çalışıyorum. Teker teker saydığımda herhangibir sorun yok
ancak iki motoru aynı anda çalıştırdığımda devirleri eşit olduğundan aynı anda sensörleri görüyorlar ve devri yavaş ilerlediği için  her iki sensörde yaklaşık 2 sn aktif halde kalıyor ve birini sayıyor ise diğerini saymıyor.

while S1=1:WEND  bu kodlala ilgili olduğunu düşünüyorum zira S1 (sensör 1) 0 olduğu zaman 1 sayıyor ancak bu komutlar S1'in sıfır olmasını beklediği için S2 sensörünü saymıyor.

Sonuç olarak iki sensörde 20 saymasına rağmen gerçekte motor1 = 20 tur , motor2= 35 veya 40 tur atıyor. 
Bunu nasıl çözebilirim.


sensor-kontrol:

        IF S1=1 THEN GOSUB MOTOR_1 'sensör 1 olduğunda motor_1'e git
        IF S2=1 THEN GOSUB MOTOR_2 'sensör 1 olduğunda motor_2'ye git
        PAUSE 100
       
GOTO sensor-kontrol
'********************************* MOTOR ***************************************
     
MOTOR_1:

        while S1=1:WEND
        SAY1=SAY1+1
        IF SAY1=100 then SAY1=00
        ENDIF

RETURN

MOTOR_2:

        while S2=1:WEND
        SAY2=SAY2+1
        IF SAY2=100 then SAY2=00
       
RETURN

ete

Bu mantıkla aynı anda saydırma yapmanız mümkün değil malesef.
İkisini aynı anda saydırabilmek için kesinlikle kesme kullanman gerekiyor.
Devir sayma işinde birim zaman içindeki (genellikle 1 sn) puls sayısı esas alınır.
Bu nedenle TMR1 sayacını bir şekilde 1 sn sayacak şekilde ayarlayıp kesme oluşturmasını sağlamak ve bu arada da her iki motorun pulslarını sayman gerekir.
İşlem sırası olarak bakarsak;
- TMR1 sayacını sıfırla ve 1000 ms sonra kesme oluşturacak şekilde ayarla.
- Sonra her iki sensörün aktif olması durumunda sayac değerlerini bir artıracak komutları koy.
- Kesme oluşunc TMR1 kesmesini kapat ve sayac değerlerini al buradan devirleri hesaplayabilirsin artık.

Devir sayımında devir pulsları şayet 1 sn içinde 255 den az ise motorun birisi için TMR0 sayacını dışarıdan tetiklemeli olarak kullanabilirsin. Diğeri içinde TMR1 sayacını dışarıdan tetiklemeli olarak kullanabilirsin.
Bunun içinde Tmr değerlerini sıfırlarsın. Pause 1000 yazıp süre sonunda timer değerlerini kendi değişkenlerine aktarırısın. BUnlarda sana devir sayılarını verecektir.

Ete

BİDİL

Anladım hocam teşekkür ederim. Motorların 1 turu ortlama 5sn civarında, bu nedenle TMR0 ve TMR1 i dışardan tetiklemeli olarak ayarlayacağım.Peki motor sayılarını iki değilde dört yaparsam bu yöntemle yine tıkanırmıyım acaba?

ete

O zaman 1 sn yerine 1 dak zaman tut en güzeli böyle olur. Bu süre zarfında dışarıdan gelen pulsları sayarak devir hesabı yapabilirsin.
Ete

BİDİL

Hocam tmr kesmesini beceremedim sensörün durumunu farklı bir değişkene aktardım, sensör 1 olduğunda m1kont değişkenide 1 olur ve artırma işlemi yapılır hemen akabinde m1kont değişkeni sıfırlanır ve sensör sıfırlanmadan bu değişkenin 1 olması engellenir. Bu sayede TMR kesmesi ve while wend komutları kullanılmadan 4 adet motoru aynı anda birer birer saydırdım.
Bunu benmi yaptım hala inanamıyorum...Tmr kesmesini öğrenip birde öyle denicem çok teşekkür ederim.


M1KONT=0
M2KONT=0
M3KONT=0
M3KONT=0

'*********************************ANA DÖNGÜ*************************************

ANA_EKRAN:

        IF (S1=1)AND(M1KONT=0) THEN M1KONT=1
        IF (S1=0)AND(M1KONT=1) THEN GOSUB MOTOR1_ARTIR

        IF (S2=1)AND(M2KONT=0) THEN M2KONT=1
        IF (S2=0)AND(M2KONT=1) THEN GOSUB MOTOR2_ARTIR

        IF (S3=1)AND(M3KONT=0) THEN M3KONT=1
        IF (S3=0)AND(M3KONT=1) THEN GOSUB MOTOR3_ARTIR

        IF (S4=1)AND(M4KONT=0) THEN M4KONT=1
        IF (S4=0)AND(M4KONT=1) THEN GOSUB MOTOR4_ARTIR

        PAUSE 100
       
GOTO ANA_EKRAN
'********************************* MOTOR ***************************************
 
MOTOR1_ARTIR:
        SAY1=SAY1+1
        IF SAY1=100 then       
        ENDIF
        M1KONT=0
RETURN

MOTOR2_ARTIR:
        SAY2=SAY2+1 
        IF SAY2=100 then   
        SAY2=0                 
        ENDIF
        M2KONT=0
RETURN

MOTOR3_ARTIR:
        SAY3=SAY3+1
        IF SAY3=100 then       
        ENDIF
        M3KONT=0
RETURN

MOTOR4_ARTIR:
        SAY4=SAY4+1 
        IF SAY4=100 then   
        SAY4=0                 
        ENDIF
        M4KONT=0
RETURN

Powered by EzPortal