elektronik devre problemi

Başlatan kerem, 10 Aralık 2018, 14:35:50

ete

Tuş kontrollerini hiç beğenmedim. Programı sürekli bloke ederek çalışıyorsun.
Bir tuş kontrolü aşağıdaki gibi olmalıdır. Üstik Tuşa basılınca Pin LOW mu oluyor HIGH mı oluyor karar veremedim.
BU örnekte tuşa basılınca Pin HIGH oluyor.


IF ACKAPA=1 THEN
Buralara tuşa basılınca ne yapılacak ise onu yazarsın
Burada Tuşun bırakılma kontrolünü yaparsın.
WHILE ACKAPA=1:wend
Az bir gecikme eklersin tuş titremesini engellemek ve programın hızla buraya yeniden gelme ihtimalini önlemek için
Pause 100
ENDIF


Şayet tuşa basılıp basılı tutunca sürekli bir iş yapılacak ise ;

IF ACKAPA=1 then
  WHILE ACKAPA=0
....
...
WEND
ENDIF

şeklinde olur.

Senin kodlara bakıyorum. Hemen programın başında;
WHILE ACKAPA=0:WEND  komut satırı tuşa basılmaz ise programı oraya bloke edip bekleyecek.
Buna hiç gerek yok. Program akmalı sürekli ve gereken arada yakalanıp işlem yaptırılmalıdır.
Ancak çok özel durumlarda programı tamamen bir noktada bloke edebilirsin.

Ete




kerem

ete hocam şöyle anlatayım ackapa butonuna basınca high oluyor. ama ben komut vermeden kart herhangi birşey yapmamalı üsteki
while ackapa=0 : wend de kalmalı açkapa botununa bastığımda kart devreye girmeli.
ben dediğinizi yaptım, kartı taktım daha açkapa ya basmadan kendi kendine çalıştı. ben aç kapaya bastıktan sonra kart işlemler yapacak tekrar açkapa ya basınca da duracak.
tam olarak çalışmıyor. bende denemeler yapıyorum.

ete

Bu gibi durumlarda programı kademeli çalıştırmak gerekir.
BIRINCI: burası birinci kademe olur ve ackapa butonuna basılmadan program bu kademeyi aşmamalıdır.
Çözüm elbette WHILE ACKAPA=0:WEND komutudur.
IKINCI: Buradan sonra ikinci kademeye geçeriz.
burada neler yapılacak ise onu yapmalı ve program kapatılmadığı müddetçe ikinci kademede çalışmalıdır.
gerekirse ikinci kademede yeniden açkapa kontrolü yapabilir ve basıldığı algılanırsa programı birinciye yönlendirirsiniz. tabiiki yönlendirmeden önce butonun bırakıldığını kontrol etmen gerekecek şöyle;
IF ACKAPA=1 THEN
WHILE ACKAPA=1:WEND
PAUSE 100
GOTO BIRINCI
ENDIF


ETE

kerem

ete hocam dediginize yakın bir şey yapmışım gönderdiğim programda mevcut . ama ilk açılışta hep problem çıkarıyor diğer hiçbir yerde sorun yok .
ilk açılışta açmada problem yok . Ama kapatmak isteyince ilk bastığımda başka bir yere dallanıyor ikinci basışta kapatıyor kendini. ondan sonra devrede enerji olduğu sürece açma/kapama işini düzgün yapıyor.  sadece ilk başta kapatmak için iki defa tuşa basmam gerekiyor. bu iki defayı ortadan kaldırmak istiyorum.
devre prouteusta cok güzel çalışıyor. gerçekte çalışmıyor

ete

programı buraya koy bakayım yukarıdakinden bir şey anlamadım.
Ete

kerem

#110
ok

kerem

ETE hocam program bu şuanda böyle çalışıyor. sadece ilk çalıştırmada açıyor kapatmak için tekrar iki defa basmam gerekiyor

ete

Çok yanlış bir program yazma tekniğin var.

Basla satırından itibaren inceleyelim birlikte programı,
BASLA:
PORTB=%10000000
WHILE ACKAPA=0 :WEND
kod satırlarını işletecek ve ACKAPA tuşuna basılıncaya kadar bekleyecek program.
Tuşa bastık diyelim. Şimdi sonrasında ne oluyor ona bakalım.
      A=0
      ILERI=1                'SAYDIRMA SAYISI YANİ A 2 TUR DÖNDÜĞÜNDE CİHAZ ERROR VERİP KAPANACAK.
      pause 100
      toggle durum
      GOTO SIFIR
program GOTO SIFIR satırına kadar gelip o satırı görünce de SIFIR isimli etikete gidecek.
Sıfır etiketi aslında br while wend döngüsünin içinde yar alıyor. Normal programlama tekniğinde hiç bir zaman program bir while döngüsü içine aradan girecek şekilde gönderilemez.
Derleyici bu durumda nasıl davranıyor bilemiyorum ama teknik olarak yanlış bir iş bu. Program muhtemelen While komutunu görmeden döngü içine girdiği için wend komutunuda görmeyecektir.  Bu ise programdan istenen sonuçların alınmasını engelleyecektir.
Programa şöyle bir bakarsan aşağıdaki satırları program hiç bir konumda görmeyecektir.
       WHILE CAKDON=1         'PORTA.5 (YANİ ATEŞLEME KARTININ DÖNÜŞÜNÜ 5V GELDİĞİ SÜRECE )ALTAKKİ İŞLEMLERİ YAP DİYOR.EN AŞAĞIDAKİ WENDE KADAR GİDİYOR
         IF ACKAPA=1 THEN     'EĞER 1. TUŞA BASILDIYSA DURUMA BAK , 1 İSE AŞAĞIDAKİ İŞLEMLERİ YAP 0 İSE KAPAT.
            TOGGLE DURUM         
            IF DURUM=0 THEN
              GOSUB KAPAT         
              GOTO BIR
            ENDIF

senin sıkıntında burada zaten. Bu satırları göremediği için program çıkış yapamıyor.

Programı goto sıfır satırına gönderip bir kaç saır işledikten sonra;
BIR:    
            WHILE ACKAPA=1:WEND
            pause 100

satırlarını koymuşsun. Bu en başta ACKAPA tuşuna basıldıktan sonra tuşun bırakıldığını test eden yer oluyor ve alakasız bir yerde duruyor. Bunu oraya yazdığın için yukarıda açıkladığım anlamsız işlemi yapmış oluyorsun mecburen.

Ben olsam şöyle yapardım. Başla satırından sonra gelen,
 toggle durum
      GOTO SIFIR
yerine ,
 toggle durum
      while ackapa=1:wend
      GOTO SIFIR
yazardım böylece program ackapa butonun hakimiyetinden kurtulmu olurdu.
Sonraki kısımlarda ise GOTO SIFIR yazmak yerine SIFIR etiketini,
SIFIR:
       WHILE CAKDON=1
şeklinde kullanır ve programı daima bu döngüye yönlendirirdim.
Sonuç olarak hiç bir zaman bir programı while wend döngüsünün ortasına gönderme. Program mutlaka önce WHile komutunu görmeli ardından wend komutu mutlaka gelmelidir. Bu iki komutun ortasında bir yer yollayınca sorunlar oluşmaya başlıyor.

O kadar karmaşık br mantığın varki ben bile anlamakta zorlanıyorum. Kimin ne yaptığı belli olmuyor gerçekten.

Ete

kerem

doğrudur ete hocam biraz karmaşık. siz yardımcı olmuştunuz yazmamda da ama ben eklemeler yapıp biraz karmaşıklaştırmışım.

BIR:   
            WHILE ACKAPA=1:WEND
            pause 100
ENDIF


yukarıdaki komut aslında asağıdaki IF ACKAPA=1 THEN döngüsünü buton kontrolü için verilmiş bir koddur. 
baştaki ACKAPA tuşuna basıldıktan sonra tuşun bırakıldığını test eden komut yazılmamıştır.


WHILE CAKDON=1         'PORTA.5 (YANİ ATEŞLEME KARTININ DÖNÜŞÜNÜ 5V GELDİĞİ SÜRECE )ALTAKKİ İŞLEMLERİ YAP DİYOR.EN AŞAĞIDAKİ WENDE KADAR GİDİYOR
         IF ACKAPA=1 THEN     'EĞER 1. TUŞA BASILDIYSA DURUMA BAK , 1 İSE AŞAĞIDAKİ İŞLEMLERİ YAP 0 İSE KAPAT.
            TOGGLE DURUM         
            IF DURUM=0 THEN
              GOSUB KAPAT         
              GOTO BIR
            ENDIF

ete

Sen öyle  düşünüyorsun ama program ACKAPA tuşuna basıldıktan sonra bir kaç satır işleyip doğruca bu while wend komutuna geliyor ve hala ackapa butonuna basılıyor ise bırakılmasını bekliyor. Sen daha elini butondan çekmeden program bu satıra geliyordur bundan eminin.

Diğer satırlar olan,
WHILE CAKDON=1         'PORTA.5 (YANİ ATEŞLEME KARTININ DÖNÜŞÜNÜ 5V GELDİĞİ SÜRECE )ALTAKKİ İŞLEMLERİ YAP DİYOR.EN AŞAĞIDAKİ WENDE KADAR GİDİYOR
         IF ACKAPA=1 THEN     'EĞER 1. TUŞA BASILDIYSA DURUMA BAK , 1 İSE AŞAĞIDAKİ İŞLEMLERİ YAP 0 İSE KAPAT.
            TOGGLE DURUM         
            IF DURUM=0 THEN
              GOSUB KAPAT         
              GOTO BIR
            ENDIF
Programın bir kere bile gelebildiğnden emin değilim. Buraya hiç uğramıyor program.
Şayet simulasyon devresi var ise yolla test edip sana söyleyeyim.

Ete

kerem

#115
ETE hocam temsili bir devre yaptım . zaten bende bu devrenin üzerinde calışıyorum. program ve devre ektedir

ete

Enteresan sonuç. Program o kısıma gidiyormuş. Bunu görebiliyorum. Oraya pinin birini high yapan komut yazdım yapıyor. Demekki oraya uğruyor.
Şemayı görünce yada çalıştırınca bazı şeyleri daha iyi anlıyorum. Aslında aç kapa sı CAKDON olsa gerek çünki her şey o butonun 1 olmasına bağlı. Ama CAKDON =0 yapıp ACKAPA tuşuna basıncada anlık olsada çalışıyor. Halbuki hiç çalışmaması gerek bana kalırsa.
Yaşadığın sorunu bu deneme simulasyonunda da görebiliyormusun?
Çünki baktımda ACKAPA ya basınca duruyor program.  Sorun tam olarak ne zaman ortaya çıkıyor?

Ete

kerem

ewt ete hocam enterassan . normalde similasyonda çalışıyor. herşey normal çalışıyor sadece ilk enerji verilip aç/kapa tuşuna basınca açmada herhangi bir problem olmuyor cihaz gayet iyi çalışıyor ama kapatmak istediğimde 2 defa ac/kapa tuşuna basmam gerekiyor.
ilk basmada sanki sıfır komutuna dallanıyor ikinci basışta ise kapatıyor kendini.
yukarıda yazdıklarım sadece ilk enerji verildiği zaman yapıyor. enerjiyi kesmeszen normal işlevini yapıyor açıp kapatıyor sorun olmuyor.
ama enerjiyi kesip, tekrar enerji verdigimde en üste yazdığım gibi yapıyor. ilk kapanmada sıkıntı oluyor. kapatmıyor dallanınıyor ikinci defa basınca kapatıyor.

kerem

herşey cokdon kumutuna baglı çakdön komutuda ileri 1 komutuna baglıdır. ileri =1 olduktan sonra cakdone enerji gidiyor. öylece devam ediyor

ete

Şemada display dikey düzlemde ters olmuş. Onu düzelttim. 7 segment displayde çalışan bitler şöyledir. %011111111
Bunların segment bazında dizilişi ise %0gfedcba şeklindedir. Senin yerleştirmene göre e segmenti solda yer alması gerekirken ters olarak sağda yer alıyor idi.
Programda bazı iyileştirmeler ve kısaltmalar yaptım. Bak ve dene bakalım nasıl olmuş.
Olaya çok hakim olmadığım için çok da kurcalamak istemedim doğrusu.

Ete

Powered by EzPortal