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

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

Elektronikprojem

Merhabalar. 16f628 ile bir step motor devresi yaptım. Devrenin çalışma mantığı şu şekildedir.Ekte devre şeması  var.
Ekteki devrede rb0 portuna basınca motor 60 derece civarına geliyor. ra1,ra3,ra5 butonuna aynı anda basınca 60 dereceden 121 dereceye kadar geliyor.rb2,rb5 teki butona basınca 180 dereceye geliyor.burdada rb4,rb5,rb6 butonlarına basınca 0 dereceye geri dönüyor.
Benim istediğim bu işlemleri sırasıyla yapsın yani 60 dereceye gelince rb0 a basınca rb0 ı algılamasın sadece 60 dereceye gelince ne yapacaksa onu yapsın .kodlar şu şekilde yardımcı olursanız mutlu olurum.

not:bu durumdan dolayı mesela
else high porta.6 yazıyorum
daha başlatma butonuna basmadan led yanıyor.


@ __config _BODEN_ON & _BOREN_ON & _CP_ON &  _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

trisa=0
trisb=%11111111
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
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
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


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



endif

goto basla
end

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

İlyas KAYA

programdaki tüm "if" ve "endif" satırlarını kaldırırsanız sırası ile o işlemleri yapar.
Unutmayın ki kodlar en tepeden aşağı doğru siz yönlendirme yapmadığınız sürece işler.


örneğin;

basla:
if portb.0=1 then        <------------- bunu silin
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           ' <------------- bunu da silin
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Elektronikprojem

#2
Peki o zaman butona basınca şunu yap basmayınca şunu yap demem lazım onları kaldırınca şöyle bir şey mi yazmalıyım .
Portb.0=1 then
Porta....
....
...
Böyle yazınca butona basmayinca ledi yak diye cem mesela o nasıl olacak

İlyas KAYA

Şimdi sırası ile işlem yapmak ayrı butonları da kullanmak ayrı bir işlem. Eğer aynı zamanda butonları da kullanmak istiyorsanız bütün algoritma değişir.

Bir tane butonkontrol adlı alt program yaparsınız. Bu alt programı her FOR döngüsü içinde çağırırsınız. Böylece sıralı işlemler çalışırken program butonkontrol isimli etikete dallanır ve kontrollerini yapar. Eğer buton basılı ise işlemi yapar ve geldiği yere döner.

Yalnız gecikmeler olacaktır. Buton basıldığında yaptığınız işlemlerde gecikme var ise bu sıralı işlemlere de yansıyacaktır. Daha çok çalışmanız ve bol bol program yazmanız gerekir. Sürekli farklı algoritmaları incelemeniz ve neyin nasıl ve neden yapıldığını çok iyi kavramanız gerekir.
Bu ise zamanla olur. Çalışarak olur.



@ __config _BODEN_ON & _BOREN_ON & _CP_ON &  _PWRTE_ON & _WDT_OFF & _LVP_OFF & _MCLRE_OFF & _INTRC_OSC_NOCLKOUT

trisa=0
trisb=%11111111
PORTA=0
PORTB=0
i var byte
;------------------------------------------------------------------------------;
basla:

for i=1 to 8

gosub butonkontrol

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

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

for i=1 to 8

gosub butonkontrol

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

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

for i=1 to 8

gosub butonkontrol

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



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

for i=1 to 25

gosub butonkontrol

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



goto basla

butonkontrol:

if portb.0=1 then
'------- B0 butonuna basıldı ise yapılacak işlemler
endif
'-------------------------------------------------------
if portb=%00101010 then
'-------> B1 , B3 ve B5 için işlemler.
endif

if portb=%00100100 then
'-----------> B2 ve B5 için işlemler
endif

if portb=%01100000  then
'-----> B5 ve B6 için işlemler.
endif



return


end

;------------------------------------------------------------------------------;
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Elektronikprojem


Elektronikprojem

şimdi de hiçbir komut algılamadan dönmeye başlıyor

ete

Ne istediğini anlatamıyorsun sanırım. İyi düşün ve ne istediğini tam anlat. Zira yazdıklarındn hiç bir şey anlamadım. Neden bir işi yaptırmak için 3 tane butona birden basmak gerekiyor.? Neden tek buton bu işi yaptırmıyor?
Yazdığın ilk mesaja bir bakalım;
"Benim istediğim bu işlemleri sırasıyla yapsın yani 60 dereceye gelince rb0 a basınca rb0 ı algılamasın sadece 60 dereceye gelince ne yapacaksa onu yapsın .kodlar şu şekilde yardımcı olursanız mutlu olurum."
RB0 a basınca algılamasın !!!! ne demek bu oraya algılama kodunu yazmazsan algılamaz elbette zormu bunu düşünüp yapmak?. Bence ne demek istediğini anlamıyoruz!!!.
60 dereceye gelince ne yapacaksa onu yapsın demişsin ne yapacak biz nereden bilelim? Onu sen bileceksin.
Bak algılama komutlarını kaldırınca bu seferde "şimdi de hiçbir komut algılamadan dönmeye başlıyor" demişsin döner elbette kimseden bir emir yada tetik beklemez ve ne yapacaksa onu yapsın dersen o şekilde çalışır. Yine ne istediğini anlamadı arkadaşlar ve benim anladığım şekilde düşünerek bunu yaptırdılar ama sen farklı bir şey istiyorsun.
Sen tipik bilen insan mantığı yürütüyorsun. kafanda olanları sen iyi biliyorsun programa bakınca bizde bileceğiz zannediyorsun. Yok öyle bir şey ne istediğini adım adım burada anlatman gerek.

Ete


İlyas KAYA

Butonlara basıldığı zaman yapılacak işlemleri bilmediğimiz için açıklama olarak yapılacak işlemler diye not düştüm. Siz oraya ne eklerseniz o çalışır. Yani zaten kodda butona basınca yapılacak bir işlem yok.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Elektronikprojem

şimdi resimdeki anahtarı kontrol etmek istiyorum o yüzden anahtarın her bir kontağını buton olarak kullanmalıyım anahtar 0-1-2-3 konum ilerliyor ardından geri dönüyor. benim asıl anlatmak isteediğim şu

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
;------------------------------------------------------------------------------;

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
high porta.6
endif

mesela bu yazılımda ben çalıştırmak istersem enerji verir vermez porta.6 daki led yanıyor. benim istediğim de enerji verildiğinde o ledin yanmaması lazım çünkü ben bu uygulamayı motor 60 derece döndükten sonra (anahtar 1 numaralı konuma geldikten sonra) yapmak istiyorum.eğer anahtarın yazılımda belirtilen kontakları kapalı değilse o zaman led yansın ikaz versin istiyorum. umarım anlatabilmişimdir. evet konu biraz değişik olduğu için anlatmakta zorlanıyorum haklısınız

ete

Asıl konuya geçmeden hemen belirtmek istediğim bir husus var.
Programın en başına PORTA=0 komutunu yerleştirmiş olmana rağmen port henüz tam aktif olmadığı için bu komut bir işe yaramaz ve BASLA satırına gelindiği zaman o senin PORTA.6 pini rastgele (senin örneğinde HIGH) bir değer ile açılabilir.
Her şeyden önce gerek pic registerlerinin işlemesini sağlamak ve değişkenlerin değerlerini almasını beklemek amacı ile açılıştan evvel mutlaka ve mutlaka 200ms lik bir gecikme koyulması gerekir. Sende bu gecikmede yok. Kısaca açıklamak gerekir ise,
BASLA satırından önce;
PORTA=0
PAUSE 200
BASLA:
şeklinde bir satır dizisi kullanman gerekiyor.
PORTA.6 nın HIGH olması aslında çok garipsenmemeli. Zira işlemci komutları çok hızlı değerlendirir.
Step motor dönerken kontakları sürekli izleyerek ;

if portb=%00101010 then
...
else
high porta.6
komutunu çalıştırması kuvvetle ihtimaldir. Yani PORTB%00101010 değil ise PORTA.6=1 olsun demişsin ki program bu konumu her halukarda yakalar. Yakalamaması için senin kontakların işlemcinin komut işleme hızında konum değiştirmesi gerekirki buda mümkün değildir bana kalırsa.
Şöyle yap PORTA.6=1 olsun ama PORTB=%00101010 yakalandığı zamanda PORTA.6=0 olsun ki konumu yakaladığını en azından sonradan anlayabilesin.

Açıklamaların olayı anlamamıza biraz daha yardımcı oldu diyebilirim.
Ancak açıklanması gereken bazı şeyler daha var. Örneğin Step motoru kim çeviriyor?. Zira step motor kontakları bir konuma getiriyor ve o konuma göre sende programda bir döngü çalıştırıyorsun. BU çalıştırdığın döngü step motoru çeviriyor ise yinede komut eksikliği var gibi geliyor bana. Zira komut dizisine bakılırsa TEK faz modunda çalıştırıyorsun. Bu konumda sarıgılara sırası ile 1-2-4-8-0 bilgisi verilmesi gerektiğini hatırlıyorum. Ters yönde çevirmek için sıralama ters çevrilir.
Senin sıralaman 1-2-4-8-1-2-0 şeklinde ve bana göre yanlış. o döngünün içine 1-2-4-8-0 sıralamasını yerleştir bence.

Ete

Elektronikprojem

Şöyle yap PORTA.6=1 olsun ama PORTB=%00101010 yakalandığı zamanda PORTA.6=0 olsun ki konumu yakaladığını en azından sonradan anlayabilesin.

hocam bunu nasıl yapabilirim peki

ete

Aşağıdaki satırdan hemen sonrasına;
if portb=%00101010 then
PORTA.6=0
şeklinde bir komut satırı eklersen bu dediğim gerçekleşmiş olur.
Böylece pic çalışır çalışmaz hemen yanan bu led bir müddet sonra sönüyor ise anlaki konumu yakalıyorsun.
Yakalamadığın anda da led geri yanıyor demektir.

Ete

Elektronikprojem

Yardimlarinizdan dolayı teşekkür ederim deneyeceğim hocam

Elektronikprojem

Sayın Hocam,
Dediğinizi denedim ama sonuç alamadım bunun üzerine sorunu tam anlatamadığımı düşünüyorum.
Şimdi herşeyi silelim ve şöyle örneklendireyim
diyelim ki pic e lcd bağlı.
ve ben lcd ye şöyle bir komut veriyorum

TRISA=%00000001
TRISB=%00000001
TRISC=%11111111
TRISD=0

@ __config _HS_OSC & _WDT_ON & _LVP_OFF & _CP_OFF
DEFINE OSC 4
DEFINE LCD_DREG PORTB     ;LCD  data bacakları hangi Porta bağlı?
DEFINE LCD_DBIT 4     ;LCD  data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG PORTB     ;LCD  Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT 3     ;LCD  Enable Bacağı Hangi bite bağlı ?
define LCD RWREG PORTB    ;LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT 2        ;LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG PORTB    ;LCD  RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT 1        ;LCD RS  bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS 4        ;LCD 4  bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES 2        ;LCD Kaç  sıra yazabiliyor
DEFINE ADC_BITS 8      ;A/D  çevirim sonucu kaç bit olacak
DEFINE ADC_CLOCK 3       ;Clock  kaynağı (3=rc)
DEFINE ADC_SAMPLEUS 50  ;Örnekleme zamanı mikro saniye cinsinden.
ADCON1=7
LOW PORTB.2
PAUSE 500
PORTC=0
PAUSE 200
PORTB=0
PAUSE 200

BASLA:


IF PORTC.0=1 then
LCDOUT $FE,1, "TEST BASLADI"
PAUSE 250
ENDIF
IF PORTC=%01100000 then
LCDOUT $FE,1, "TEST OK"
PAUSE 250
ELSE
LCDOUT $FE,1, "KONUM ARIZALI"
PAUSE 200
HIGH PORTC.7

ENDIF
GOTO BASLA
END

Şu anda ben bu şekilde enerji verirsem ekranda direk konum arızalı yazıyor. Ve portc.7 ye bağlı olan buzzer ötüyor. halbuki başlarken ilk başlama butonuna basacağım ardından gelen sıralamada istenilen şart olmazsa konum arızalı diyecek. bu şekilde olması lazım.
saygılar.

İlyas KAYA

Devrenizin isis şemasını paylaşırmısınız.
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

Powered by EzPortal