pic te istenileni sırası ile yapma konusunda yardım

Başlatan Elektronikprojem, 31 Aralık 2015, 16:15:30

Elektronikprojem

Merhaba , Günaydın
Bakabilme şansınız oldu mu acaba .
Ben  ETE hocamın dediği gibi denedimn endif leri en sona koydum tam istenilen oluyor ama  bu seferde test tamamlandıktan sonra cihazin elektriğini açıp kapatmam gerekiyor baska türlü aynı komutları ikinci kez yapamıyorum yani program goto baslaya dönmüyor 

ete

Akıl edip te kodların son halini buraya koysan ve sorununuda altına yazsan şimdiye kadar bakılıup cevap da yazılmış olurdu ama bunu yapmadığın için benim gibi diğer arkadaşlarda mesajlara bakmakla yetiniyorlar yalnızca. Ortada doğru dürüst bir kod yok bölük pörçük baştan verilen kodlar var onlarda önerilerim doğrultusunda değişmiş olması gerek. Ama son halini görmeden kimse bir yorumda bulunamaz değilmi?

Aslında program aynı şeyleri yapmıyor ise en son geldiği noktadan sonra enbaşa yönlendirilmesi gerekir. Bak bunuda biliuyorsun üstelik. Biraz deneme yap ko bir Goto Basla sonucu gözlemle. Araştırma budur. Bu şekilde çok daha iyi öğrenirsin çünki en azından şunu yaptım böyle oldu diyebilirsin.

Ete

Elektronikprojem




'****************************************************************
'*  Name    : fornext.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 30.12.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ __config _BODEN_ON & _BOREN_ON & _CP_ON &  _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

trisa=0
trisb=%01111111
PORTA=0
PORTB=0
i var byte
;------------------------------------------------------------------------------;
basla:
if portb.0=1 then
for i=1 to 8
PORTA=1
PAUSE 10
PORTA=2
PAUSE 10
PORTA=4
PAUSE 10
PORTA=8
PAUSE 10
porta=1
pause 10
porta=2
pause 10
porta=0
pause 10
next

;------------------------------------------------------------------------------;

if portb=%00101010 then
for i=1 to 8
porta=4
pause 10
porta=8
pause 10
porta=1
pause 10
porta=2
pause 10
porta=4
pause 10
porta=8
pause 10
porta=0
pause 10
next
else
pause 1500
high portb.7
endif
;------------------------------------------------------------------------------;
if portb=%00100100 then
for i=1 to 8
porta=1
pause 10
porta=2
pause 10
porta=4
pause 10
porta=8
pause 10
porta=1
pause 10
porta=0
pause 10
next
else
pause 1500
high portb.7

endif
;------------------------------------------------------------------------------;
if portb=%01100000  then
for i=1 to 25
porta=8
pause 10
porta=4
pause 10
porta=2
pause 10
porta=1
pause 10
next
porta=8
pause 10
porta=0
pause 10
else
pause 1500
high portb.7


endif
endif
goto basla
end

ete

Programda hala mantık hatası var bence.
basla:
      if portb.0=1 then
şeklinde başlayan bir satır var. Bunun altında bir döngü kurulmuş ve döngü içinde bir takım şeyler yaptırılmış. Bu iş NEXT satırına kadar sürüyor.
Bu şu demek PORTB.0 pini HIGH ise aşağıdakileri yap değilse aşağıdakileri yapma. Yapma derken bu if satırına ait şartı kapatma komutu olan ENDIF satırına kadar olanlarada bakma anlamına gelir. Böylece program PORTB.0=1 değil ise en allta Goto Basla satırından evvel yer alan Endif satırına kadar olan komut satırlarını görmezden gelir.

Bu durumda NEXT satırından sonra bir ENDIF koyularak bu koşulun orada bitirilmesi gerekirdi.
Zira bir sonraki if satırında başka bir şart ve koşul ortaya koyulmuş ve bu şartın B.0 pini nin HIGH olması ile alakası yok. Bakalım ne söylenmiş;
if portb=%00101010 then
Görüleceği üzere burada B.0 pini sıfır gözüküyor. Yani bu durumda program mevcut hali ile bu satırıda görmeyecektir. Neden dersin?. Çünki bu koşulu ilk koşulun içine almışsın.
Kısaca program PORTB.0=1 değil ise en altta bulunan Goto Basla satırına kadar olan kısmı atlayacaktır.
İşin doğrusu  En altta yer alan Goto BASLA satırından evvel yer alan ENDIF satırını oradan silip doğruca  aşağıdaki işaretlediğim yere koyman gerekiyor;

basla:
      if portb.0=1 then
         for i=1 to 8
            PORTA=1
            PAUSE 10
            PORTA=2
            PAUSE 10
            PORTA=4
            PAUSE 10
            PORTA=8
            PAUSE 10
            porta=1
            pause 10
            porta=2
            pause 10
            porta=0
            pause 10
         next
      ENDIF   'burada olacak o endif    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


Ete


Elektronikprojem

Endif orada olunca da ilk elektrik verilir verilmez led yanıyor hocam gene aynı soruna dönmüş oluyoruz

ete

Hangi led yanıyor nereye bağlı bu led?
Birde şöyle düşün ilk çalıştırmada PORTB.0=1 ise zaten ve bunun sonucu led yanacak ise o led yanmalı öyle değilmi. ?
Aslında sorun PORTB.0=0 ise henüz başlat butonuna basılmamış anlamına gelir. O zaman program alt satırlara geçmemeli öyle değilmi. Basit bir mantık bu.  O zaman Next satırından hemen sonra bir ELSE koyarsın ve altına GOTO BASLA eklersin. Sonra ENDIF gelir. Bu durumda sistem başlat butonuna basılmamış ise tekrar basılmasını beklemek üzere BASLA satırına döner. Basıldığı zaman döngüyü çalıştırır ve alt satırlara atlar . Hepsi bu.

Ete


Elektronikprojem

hocam yukarıda detaylı anlatımda da belitmiştim portb.7 ye led veya buzzer bağlayacağım anahtarda bir hata olduğu anda led  veya buzzer yanacak hata bildirmek için.
o yüzden diğer konumlarda şöyle bir şey var
else
pause 1500
high portb.7
endif
diye gidiyor.Dediğiniz gibi şu şekilde
trisa=0
trisb=%01111111
PORTA=0
PORTB=0
i var byte
;------------------------------------------------------------------------------;
basla:
if portb.0=1 then
for i=1 to 8
PORTA=1
PAUSE 10
PORTA=2
PAUSE 10
PORTA=4
PAUSE 10
PORTA=8
PAUSE 10
porta=1
pause 10
porta=2
pause 10
porta=0
pause 10
next
else
goto basla
endif

;------------------------------------------------------------------------------;

if portb=%00101010 then
for i=1 to 8
porta=4
pause 10
porta=8
pause 10
porta=1
pause 10
porta=2
pause 10
porta=4
pause 10
porta=8
pause 10
porta=0
pause 10
next
else
pause 1500
high portb.7
endif
;------------------------------------------------------------------------------;
if portb=%00100100 then
for i=1 to 8
porta=1
pause 10
porta=2
pause 10
porta=4
pause 10
porta=8
pause 10
porta=1
pause 10
porta=0
pause 10
next
else
pause 1500
high portb.7

endif
;------------------------------------------------------------------------------;
if portb=%01100000  then
for i=1 to 25
porta=8
pause 10
porta=4
pause 10
porta=2
pause 10
porta=1
pause 10
next
porta=8
pause 10
porta=0
pause 10
else
pause 1500
high portb.7


endif

goto basla
end

yaptım.Pic e yükledim ama gene aynı enerji veriyorum portb.7 deki led yanmıyor .portb.0(başlatma) butonuna basıyorum anahtarı test ediyorum ama bu işlem ikinci kez olmuyor.elektriği kesip tekrar vermem gerekiyor.

ete

Bu program için kullandığın işlemci nedir?
İlk sayfada yayınlanan bir şema var orada 2 işlemci gözüküyor.
Bu kodlara bakarsan 16F628A kodu gibi yazılmış. Şayet 16F628A ise programın başına ;
CMCON=7 komutunu ilave etmen gerekiyor.
Ayrıca başla satırından evvel  PAUSE 200 ilave edilmeli. Yine enbaşa DEFINE OSC 4 komutu ilave edilmeli.

Programın nerede takıldığını bulmak gerek. Bir iş yapıp sonrasında devam etmiyorsa bir yerde kalıyordur mutlaka. Orayı da ancak sen bulabilirsin.
Mesela,
PORTB.0 daki butona basınca motor 60 derece dönecek. Bu ilk kontrol noktasına ulaşıldığını gösteriyor.
Bundan sonra otomatikman bir 60 derece daha dönmesi gerekir. Dönmiyor ise ilk kontrol noktasındaki anahtar konumları senin programa yazdığın gibi olmuyordur.

Ete

Elektronikprojem

#38
Hocam dediklerinizi de programa işledim. Eğer bir mail adresiniz varsa oraya video göndereyim daha iyi anlaşılır.sorun program istenileni bir defa yapıyor en başa döndükten sonra daha yapmıyor
portb.0=1 ..... .....;60 derece döndü
portb.1,3,5=1 .....;60 derece daha döndü
portb.2,5=1 ........;60 derece daha döndü
portb.5,6=1..........60+60+60= 180 oldu bu komutta da 180 derece geriye döndü.
şimdi  en başa dönmesi lazım ama bu işlemi tekrar yapmaya çalışınca (portb.0) basınca hiç bir şey olmuyor ta ki enerjiyi kesip tekrar enerji verene kadar.

ete

En baş dediğin yer motorun sıfır noktası. Sen ise 3 adımda (60+60+60=)180 derece döndürüyorsun motoru.
Programın en sonunda yer alan GOTO BASLA komutundan evvel motor 180 derece geri (veya ileri) döndürülmeli ve tekrar sıfır noktasına getirilmelidir. Zira program motorun sıfır noktasından başlıyor çalışmaya. Aslında 360 derecelik dönme açısının ortasına gelmiş olacağın için ileri yada geri 180 derece gitmen farketmeyecektir.
Ben olsam her bir 60 derecelik döndürme ye denk gelen komutları peş peşe vererek motoru bir 180 derece daha döndürür ve sıfır noktasına getirirdim.

Umarım sorunu anlamışsındır. Motor 180 derece dönmüş olduğu için kontaklar programda verdiğin konuma hiç bir zaman gelemiyor. Bu nedenle butona basmış olasn bile program orada BASLA ile GOTO BASLA arasında dönüp duruyor.
GOTO BASLA demeden önce o motoru çeviren 3 döngüyü peş peşe yeniden ver motor tekrar sıfır noktasına gelsin. Sonra GOTO BASLA yaparsan tekrar butona basmanı bekleyip aynı şeyleri yapacaktır.


Ete

Elektronikprojem

Hocam rb5 ve rb6 motoru 180 derece geri çevirmeye yarıyor zaten hani anahtar üçüncü konuma gelince orda rb5 ve rb6 basiliysa test tamam diyor geriye 0 noktasına dönüyor

ete

Bu tür motorlar adım başına genelde 7 derecelik bir açı ile dönerler. Sen 8 adım veriyorsun motorun 56 derece dönmüş olması gerekir. Çokda önemli değil kaç derece döndüğü. Önemli olan toplamda kaç derece dönmüş olması. Bu hesaba göre 3*8=24 adım atıyor bir yöne doğru. Bu durumda tam tersine 24 adım attırman gerekiyor.
Sen ne yapmışsın 25 adım attırmışsın. Belkide yanlışın bir fazla adım atması dır.

Motor başa döndüğünde PORTB=%00000000 şeklinde değer vermeli. Bak bakalım PORTB.1-PortB.6 pinlerine hangi lojik değerler var.

Ete

Not: Motor döndürme komutlarınızda bana göre yanlış. Tam adım çalışma yapıyorsunuz. Motora daha doğrusu A portuna vermeniz gereken komutlar bir yöne dönerken sırası ile 1-2-4-8 Motor durduğunda porta sıfır değerini vermeniz yeterli.  Bu değerleri aynı sırada bütün 60 derecelik dönmeler için kullanmanız gerekir.   Döngü sonunda PORTA=0 değrini verip motoru durdurursunuz. Sonra en sonda motoru geri döndürürken; sırası ile 1- to 24 döngüsü içinde 8-4-2-1 şeklinde değerler vermeniz gerekiyor. 

Powered by EzPortal