whıle wend komutu

Başlatan dedim, 15 Haziran 2015, 20:39:33

dedim

whıle wend komutu arasında adc ölçumunu işlemek mumkunmudur

whıle ham<500 :wend
hıgh led
delayms 500
low led


demek mumkunmudur arıyorum ama whıle wend komutunda adc işlenırmı bulamadım

ete

#1
Bu sorunun cevabını aramak yanlış bence. Sebebi basit. While wend bir şart döngüsüdür. Programın bir şarta bağlı olarak bir yerde dönüp durmasını sağlar. Şart bozuluncaya kadar bu devam eder. Bu esnada while ile wend arasına ne komut koyarsan onlarda çalıştırılır. Zaten şartın bozulduğunu görmek yada programın onu anlamasını sağlamak için arada komut olması gerekir aksi halde bu bir sonsuz döngü olur. While 1: wend komut dizisi ile senin yazdığın while ham<500:wend komut dizisi arasında işlevsel fark yok ikiside sonsuz döngü yaratır. Program oraya kitlenir kalır.
Ama, while ham<500: adcin 0, ham: wend şeklindeki komut dizisi işi sonsuzluktan kurtaracak alternatife sahip olur. Zira adc kanalından okuduğun ham değeri 500 u geçtiği anda döngü sona erer.

Ete

dedim

#2
ete usta

yazılımı dediğin gibi  değiştirdim butona basınca led yanıp sönüyor ama aynı butona basınca sönmesı gerekırken sönmuyor rıca etsem bır kontrol edebilirmisin.goto basla_bır komutunun yerınıde degiştirdim.ham degerlerınıde degiştirdim ama olmadı


Device = 16F88
Xtal 4

Declare Adin_Res 10
Declare Adin_Tad FRC      
Declare Adin_Stime 50

ANSEL=%00000001  'ra0 anolog giriş          
ADCON1.7=1
ADCON0=%01000000
CMCON=7
                  
Symbol LED=PORTB.4        


Output LED


Dim  HAM  As  Word  
Dim VOLT  As  Word 


PORTA=0                                                    
PORTB=0                                                  
DelayMS 100
;-------------------------------------------------------------------------------
BASLA:
While HAM <600: ADCIN 0, HAM: Wend      'tusa basılıncaya kadar bekle
 DelayMS 5
While HAM >500: ADCIN 0, HAM: Wend    'tus bırakılıncaya kadar bekle
 DelayMS 5
  
BASLA_BIR:
DelayMS 5
While HAM >600
ADCIN 0,HAM
HAM=ham+1                                                    
VOLT=(HAM */ 1250)/100

High LED
DelayMS 500
Low LED
DelayMS 500
Low LED
Wend

DelayMS 5
While HAM <500: ADCIN 0, HAM: Wend 
GoTo BASLA_BIR
End

ete

#3
Bazı noktaları açıklığa kavuşturalım.

1. Programın başında hemen başla satırından sonra yerleştirdiğin ve önce tuşa basıldığını test eden sonra ise bırakıldığını test eden kısım ne işe yarıyor. Bana anlamsız geldi o kodlar orada yada yeri yanlış.
Çünki önce tuşa basılıp basılmadığını kontrol ediyoruz ve basılıncaya kadar bekliyoruz. Sonra bırakılmasını bekliyoruz.
Daha sonra yeniden basılmış ise diye yeniden bakıyoruz

2. Bu sistemin tam olarak amacı nedir. Aşağıdaki gibi adım adım yazılırsa onu programa dönüştürmek daha kolay olacaktır.
- Tuşa basılıncaya kada bekle
- Basılınca ledi yak (veya ledi toggle yap)
- Tuşun bırakılmasını bekle
- yeniden tuş bakmaya git

3. BASLA_BIR etiketinden itibaren yazdıkların tuşa basılması durumunda sürekli olarak 500 ms aralıklarla ledi yakıp söndürmektedir. Sen böylemi istiyorsun yoksa bir kera basılınca led yansın tuşu bırakıp yeniden basarsam led sönsün şeklindemi bir uygulama istiyorsun? İşin laf kısmında tekrar basarsam sönsün demişsin ama yazdığın kodlar bunu söylemiyor.
O yüzden gerçekte ne istediğini belirtmen gerek.

Toparlayacak olursak, yazdığın program bir kaç bölümden oluşuyor
1. Tuşa basılmasını bekliyor
2. Tuşun bırakılmasını bekliyor . Burada bir amaç yok gibi geliyor bana neden tuşa basıp bırakayım önceden?
3. Tuşa basarsam ledi 500 ms aralıkla yakıp söndürüyor ve basılı tuttuğum sürece bunu devam ettiriyor.
4. Tuşu bırakırsam yada baştan basmaz isem yeniden tuşun basılmasını bekliyor. Basınca da tekrar basla_bir etiketine gidiyor.

Şimdi böyle bir sistemde tuşa basılınca led yansın bırakıp tekrar bastığımda sönsün istiyorsan kodlar aşağıdaki gibi olmalıdır.

BASLA_BIR:
While HAM <600   'tuşa basılıncaya kadar bekle
ADCIN 0,HAM
wend
LED=1-LED
Pause 500
WHILE HAM>500
ADCIN 0,HAM
wend
PAUSE 500
GOTO BASLA_BIR


Ete

dedim

usta benım vermıs oldugum kod sizin bana gönderdıgınız koddu.butona basıp bırakınca led yanıp sönecek.tekrar basıp bırakıncada led sönecek ben ne zaman butona basıp bırakırsam tekrar yanıp sönecek.tekrar basıncada led sönecek.on off yapmaya calısıyorum ama adc kanalı üzerinden yapmaya calısıyorum.adc kanalında bırde ldr baglı bu buton ldr ye paralel baglı olacak sekilde baglı butona basınca adc kanalına low gönderıyorum.butona bastım cektım led yanıp sönmeye baslayacak.tekrar bastım led sönecek.ben ne zaman butona basıp bırakırsam  tekrar yanıp sönmeye baslayacak.tekrar basıp bırakınca led sönecek.

ete

#5
Aşağıdaki kodları dene bakalım.

Ete
Device = 16F88
Xtal 4

Declare Adin_Res 10
Declare Adin_Tad FRC      
Declare Adin_Stime 50

ANSEL=%00000001   'ra0 anolog giriş          
ADCON1.7=1
ADCON0=%01000000
CMCON=7
                   
Symbol LED=PORTB.4         


Output LED


Dim  HAM  As  Word  
Dim VOLT  As  Word 


PORTA=0                                                    
PORTB=0                                                  
DelayMS 200
;-------------------------------------------------------------------------------
BASLA:

While HAM <600: ADCIN 0, HAM: Wend       'tusa basılıncaya kadar bekle
 DelayMS 5
 LED=1                                                     'tusa basıldı belirtmek için ledi yak
While HAM >500: ADCIN 0, HAM: Wend       'tus bırakılıncaya kadar bekle
 DelayMS 5
   
BASLA_BIR:                                             
                                                              
ADCIN 0,HAM                                            'yeniden tuşa basıldımı bak bakalım
HAM=ham+1                                                     
VOLT=(HAM */ 1250)/100                          'bu arada VOLT hesapla burada lazım değil ama başka yerde lazım galiba
IF HAM>500 THEN                                     'şayet tuşa basılmış ise
  LED=0                                                   'led'i söndür 
  While HAM>500: ADCIN 0,HAM: Wend     'tus bırakılıncaya kadar bekle
   DelayMS 5 
   GOTO BASLA                                         'yeniden tuşa basılmasını beklemek üzere başla etiketine git.
ENDIF   

LED=1                                                    'tusa yeniden henüz basılmadı o halde ledi yak
DelayMS 500                                           '500 ms bekle 
LED=0                                                    'ledi söndür
DelayMS 500                                           '500 ms sönük beklet 

GoTo BASLA_BIR                                     'aynı şeyleri yapmak üzere BASLA_BIR etiketine git
                                                             'bu bölüm ledi bir yakıp bir söndürmektedir. Buradan çıkış ancak ve ancak tuşa basılmak sureti ile olacaktır.
End

dedim

#6
usta asıl yapmak ıstedıgım tus degıskenı yerıne adc kanalındakı ldr ye baglı buton ıle devreyı acıp kapatma yapmak ıstıyorum.ama olmuyor sizin gönderdıgınız kodları yazılıma gömemedım.
 Device = 16F88
Xtal 4


Declare Adin_Res 10
Declare Adin_Tad FRC      
Declare Adin_Stime 50

ANSEL=%00000001   'ra0 anolog giriş          
ADCON1.7=1
ADCON0=%01000000
CMCON=7

Symbol LED_0=PORTB.2          
Symbol LED_1=PORTB.1          
Symbol LED_2=PORTB.4          
Symbol ALARM1=PORTB.5          
Symbol SARJ=PORTB.7           
Symbol TUS=PORTA.1     ;BURDA PORTA.0 DAKI ADC GİRİŞİNİ KULLANMAM GEREK ACMA KAPAMA YAPMAK ICIN 
                       ;AMA OLMUYOR HAM DEGİŞKENI ILE CALISTIGIM ZAMAN 
Output LED_0
Output LED_1
Output LED_2


Input TUS
Input SARJ
Input ALARM1

Dim I As Byte
Dim  HAM  As  Word  
Dim VOLT  As  Word 


PORTA=0                                                    
PORTB=0                                                  
DelayMS 100
;-------------------------------------------------------------------------------
BASLA:
 While TUS=1:Wend       ;BURDA TUS DEGISKENI YERINE HAM DEGISKENI ILE BUTONU KONTROL ETMEK İSTİYORUM
 High LED_2
DelayMS 500
Low LED_2
DelayMS 500
High LED_2
DelayMS 500
Low LED_2
       DelayMS 5
       While TUS=0:Wend ;BURDA DA TUS BIRAKILINCA ALTTAKİ KOD ILE CALISMASINA DEVAM EDECEK
       DelayMS 5
   
BASLA_BIR:
While TUS=1  ;TUSA BASIP CEKILDIYSE KODLAR CALISMASINA DEVAM EDECEK.TUS DEGISKENI YERINE HAM DEGISKENI ILE İŞLEM YAPMAM LAZIM
ADCIN 0,HAM
HAM=ham+1                                                     
VOLT=(HAM */ 1250)/100
             If ALARM1=1 And HAM>1018 Then
           While ALARM1 ==0 :Wend
         GoSub follow_ac1
       Else
     GoSub follow_kapa1
   EndIf
;-------------------------------------------------------------------------------
If SARJ=1 And HAM>1017 Then              
 DelayMS 500
   GoSub ROLE_AC
    Else
     DelayMS 1
   GoSub ROLE_KAPA
EndIf
;-------------------------------------------------------------------------------
If SARJ=1 And HAM<1014 Then 
  DelayMS 10                          
   GoSub ROLE_KAPA                     
  EndIf
GoTo BASLA_BIR
;-------------------------------------------------------------------------------
follow_ac1:
High LED_0                                
High LED_2                                  
GoSub ZAMAN1                                  
Low LED_0                                               
Low LED_2                                   
Return
;-------------------------------------------------------------------------------
follow_kapa1:
Low LED_0                                              
Low LED_2                                     
Return
;-------------------------------------------------------------------------------
 ROLE_AC:
High LED_1
GoSub ZAMAN2
GoTo BASLA_BIR                                  
Return 
;-------------------------------------------------------------------------------
ROLE_KAPA:                                    
Low LED_1
Return
;-------------------------------------------------------------------------------
ZAMAN:
For I= 1 To 10   Step 1
If SARJ =1 Then GoTo BASLA_BIR      
     DelayMS 10
    Next
Return
;-------------------------------------------------------------------------------
ZAMAN1:
For I= 1 To 40  Step 1
DelayMS 10
Next
Return
;-----------------------------------------------------------------------------------
ZAMAN2:
For I= 1 To 10  Step 1
     DelayMS 10
    Next
Return
Wend
DelayMS 5
While TUS=0:Wend 'tusu bırakıncaya kadar beklet
 High LED_2
DelayMS 500
Low LED_2
DelayMS 500
High LED_2
DelayMS 500
Low LED_2

DelayMS 5
GoTo BASLA
End

 

TUS degişkenı yerıne adc kanalında baglı olan ldr nın bacaklarına baglı bır dokunmatık buton olacak.ben bu butona basıp cekınce devre calısmaya baslayacak.sinyal uclarından sınyal geldiginde röleleri acıp kapatıyor.ldr nın durumuna göre TUS degişkenı ile degilde adc ıle butonu kontrol edemedım bir türlü.


İlyas KAYA

#7
define osc 4

adcon1=0
CMCON=7
ANSEL=1

trisa.0=1
trisb.0=0

    deger var byte
      
      led var portb.0
          
     zaman var byte
     program var byte
     x var bit
      
      portb=0
      
    clear
    
    

bas:
   
    adcin 0,deger

if deger>=50 then x=0       
    
      if deger<50 and x=0 then   
            program=program+1
            x=1
              endif


select case program


case 1 

zaman=zaman+1

if zaman<128 then 
led=1
else
led=0
endif

case 2
led=0
program=0


end select



   pause 10   
      
goto bas


end



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

ete

ADC girişini tris registerinden giriş olark ayarlamamışsın.  Programda hiç TRIS register kullanımı yok. bütün portu tanımlaman gerekiyor. Yada en azından yalnızca PortA.0 pinini ,
TRISA.0=1 şeklinde tanımla tekrar dene.

Yapmak istediğinin bütününe vakıf değilim. O nedenle bu aşamadan daha fazla ileri gidemeyeceğim.
PORTA.0 da aynı zamanda LDR bağlı ise onun alacağı muhtemel değerleride bir şekilde simulasyonda görüp tedbir alman gerek aksi halde sistem çalışmayacak sanırım.

Ete

dedim

TESEKKUR EDERIM USTA

bu kadar ılgılenmen bile yeterlı yazılımda zayıf oldugumu biliyorum kendımı gelıstırmekte ıstıyorum.siz degerlı ustalarımız yardımlarınızı esırgemedıgınız surece sırtımızın yere gelmeyecegınıde bılıyoruz.sagolun varolun

dedim

#10
son bır sorum olacak ete ustam burdakı tus degişkenını dediginiz gibi adcın degişkenı ıle degiştirsem adc kanalından butonla ac kapa yapılırmı
 Device= 16F628A
Xtal 4

TRISA=%00000000
TRISB=%00000010
CMCON=7
Symbol TUS=PORTA.0         
Symbol LED=PORTB.1

BASLA:
       While TUS=1:Wend  'tusa basılıncaya kadar bekle
       DelayMS 50
       While TUS=0:Wend 'tus bırakılıncaya kadar bekle
       DelayMS 50
BASLA_BIR:
While TUS=1
High LED
DelayMS 100
Low LED
Wend
DelayMS 10
While TUS=0:Wend 'tusu bırakıncaya kadar beklet
delayMS 50
GoTo BASLA 

ete

Seni kolay anlayamıyorum. Daha önce yapılanlar neydi aynı şey değilmi.?
Bir ADC kanalını tuş gibi kullanmak istersen oraya vereceğin voltajıda tuş algılamasına yönelik olarak ayarlaman gerekir.
Örneğin tuş basılı değil ise adc den okunan değer 100 den küçük bir değer olur. Öye ayarlarımki tuşa basılınca ADC kanalına 5V ta yakın bir voltaj veririm buton üzerinden. Böylece tuşa basılınca ADC den okunan değer de 800 den büyük hale gelir. İşte ip ucu burada okunan değer 800 den büyük ise tuşa basıldı değilse basılmadı şekilden algoritma geliştirmek mümkün olur.

Bu bir genel açıklamadır. Kendi sorunun cevabını sen bulursun artık.

Ete

İlyas KAYA

Yazdığım kod 'u denemedin mi ? Kod çalışıyor ve tahminim tam da istediğin gibi çalışıyor...
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

dedim

#13
ete usta yazılımın son halı bu ama baslangıcda butona basmasam bile led yanıp sönuyor.ne zaman butona 1-2 sanıye basıp cekınce ledı sönduruyor.ondan sonrakı işlemlerde sıkıntı yok butona basınca yakıp sönduruyor tekrar butona basıp bırakırsam ledın yanıp sönmesı duruyor istedigimde buydu ama ilk basladıgında neden led yanıp sönmeye baslıyor onu bulamadım

Device = 16F88
Xtal 4

Declare Adin_Res 10
Declare Adin_Tad FRC      
Declare Adin_Stime 50

ANSEL=%00000001   'ra0 anolog giriş          
ADCON1.7=1
ADCON0=%01000000
CMCON=7
TRISA=%00000001                 
Symbol LED=PORTB.4         
Output LED


Dim  HAM  As  Word  
Dim VOLT  As  Word 


PORTA=0                                                    
PORTB=0                                                  
DelayMS 250
;-------------------------------------------------------------------------------
BASLA:
While HAM>1020: ADCIN 0, HAM: Wend  ;While TUS=1:Wend  tusa basılıncaya kadar bekle     
 DelayMS 10
While HAM<100: ADCIN 0, HAM: Wend    ; While TUS=0:Wend 'tus bırakılıncaya kadar bekle
 DelayMS 10
   
BASLA_BIR:
DelayMS 10
While HAM>1020                          ;tus 1 ise calıstır programı
ADCIN 0,HAM
HAM=ham+1                                                     
VOLT=(HAM */ 1250)/100

High LED
DelayMS 500
Low LED
DelayMS 500
Low LED
Wend

DelayMS 10
While HAM<100: ADCIN 0, HAM: Wend     ;While TUS=0:Wend tusu bırakıncaya kadar beklet
DelayMS 10
GoTo BASLA
End 

yazılımın son halı bu semayıda gönderıyorum musayıtsen kontrol edebilirmisin ete  usta

ete

Hiç bir şeyi kontrol etmeyeceğim artık. Sana işin yolunu gösterdim. Sen kafana göre gidiyorsun.
Biraz mantığını çalıştırman gerekiyor.
Bir ADC kanalı na +5V verdiğin zaman okuyacağın değer 1023 dür bu maksimum değerdir.
Bak bakalım sen ne yazmışsın;
BASLA:
While HAM>1020: ADCIN 0, HAM: Wend
Bu ne demek sence? Yani tuşa basılmış ise (tuşa basılınca ADC girişine 5V vereceğini düşünüyorum tersi bana ters geliyor)
Peki tuşa basmayınca ne olacak HAM değeri elbette 1020 den küçük olacağı için program bu satırı atlayacak.
Sonra  While HAM<100: ADCIN 0, HAM: Wend   satırını görecek. Peki tuşa basılmadığı zaman okunan adc ham değeri nedir bunu biliyormuyum ben hayır bilmiyorum. Ancak tahmin edebiliyorum 100 den küçüük olacağını düşünüyorum ve zaten şikayetinde bunu gösteriyor. O halde program burayıda atlayacak.
Sonrasında ledi yakıp söndürme kısmı geliyor ki programda bunu yapıyor zaten. O halde senin parametre değerlerin yanlış demekki.

Öncelikle oturup şu tespitleri yap. Tuşa basmayınca HAM hangi değeri alıyor?, Tuşa basınca HAM hangi değeri alıyor.
Sonra bu değerlere uygun olarak BASLA satırından sonraki iki satırı yeniden düzenle sorun düzelecektir.

Temel mantık tuşa basılmadığında programı orada bloke etmek olmalı sen tam tersini yapmışsın. Programı bloke edemiyorsun ve programda ledleri yakıp söndürme kısmına atlıyor. O kısmı ancak tuşa basınca geçmesi gerekiyor.

Ete

Powered by EzPortal