butona 2sn gıbı bır sure basılı tutuldugunda sayma ıslemını hızlandırmak

Başlatan dyonizos, 06 Nisan 2011, 06:32:47

dyonizos

merhabalar,
x butonuna basıldıgında counterda sayıyı artırabılıyoruz y butonu ılede azaltabılıyoruz. araya 200ms gıbı bır delay vermem gerekıyor tek tek artırıp azaltmayı rahatlatmak ıcın. Ancak butona 2-3sn gıbı bır sure basılı tutuldugunda bu delay suresını kısaltıp nasıl hızlandırabılırım sayma ısını?

IF BUT1=1 THEN sure=sure+1
IF BUT2=1 THEN sure=sure+1
pause 200

ete


Bekle=200
While But1=0 or But2=1
   ZAMAN=ZAMAN+1   
   IF ZAMAN>10 then BEKLE=100
   Sure=Sure+1
   PAUSE Bekle
Wend

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

dyonizos

tesekkurler hocam,
yanlız bu sureyı lcd ye yazdıramıyorum bu sekılde yapınca. sızın ders notlarınızdan bunun gıbı bırseyı bende denemıstım ancak elımı butondan cekınceye kadar sure lcd ye yazılmıyor wend dongusu dısında kaldıgı ıcın sanırım.
lcdye yazdırma ısınıde bu wend dongusu ıcınemı almam gerekır artısı gorebılmem ıcın?


birde

ADCON1 = %00000001

yazdıgımda 16f88 de RA0 analog dıger tum A portları dıjıtal demek olmuyormu?

OSCCON= %01101110       'osilator frekansi 4mhz
ADCON1= %00000001       'A0 analog digerleri dijital
TRISB = %00000011       'B0 ve B1 giris digerleri cikis
TRISA = %11000101       'A0, A2, A6 ve A7 giriş diğerleri cikis

su kullanım yanlısmı acaba?

RA0 analog calısıyor bu sekılde yaptıgımda ancak mesela RA2 dıjıtal olmuyor. RA6 ve RA7 her durumda dıjıtal calısıyor.

kafam karıstı ıyıce. benım aslıdna tek ıstedıgım sadece RA0/AN0 ı analog gırıs olarak kullanmak dıger tum portlarım dıgıtal olsun ıstıyorum ama delı oldum TRISA, ADCON1 ve ANSEL arasında mekık dokuyorum sureklı.





ete

Ne istersen onu alırsın. İlk mesajında LCD olayını bahsetmemişsin dolayısıyla dikkate almadım elbette.
Döngü içine LCD komutunuda eklersen süreyi ekranda görebilirsin elbette.

BU işlemcide analog pinlerin kontrolü ANSEL registeri ile yapılıyor. Her bir analog pinin karşılığı ANSEL registerinde bit olarak 1 yada sıfır verilerek o pinin analog mu yoksa dijitalmi olduğuna karar veriliyor.
ANSEL.0  =>AN.0
ANSEL.1 =>AN.1
..
ANSEL.6 =>AN.7
pinlerini kontrol etmektedir. Toplam 7 adet analog girişi vardır.
ADCON1 registeri yalnızca 7 nolu biti ile okunan değerin sağ aveya sola dayalı olmasını ayarlıyor ve 6 nolu biti ise uygulanan clk sinyalinin 2 ye bölünmesini (1 iken) yada iptal edilmesini (0) sağlıyor.
Geri kalan bitler referans voltaj seçimini gerçekleştiriyor.
Diğer piclerin ADCON1 registeri ile karıştırmayın bunu.
ADCON1 registerine
ADCON1 = %00000001  şeklinde değer verirsen, ADC için referans voltajı girişlerini bozmuş oluyorsun. Şöyle, +REf girişin pic beslemesi ancak -Ref girişi için picin buna ayrılmış girişinden bir giriş yapman gerekiyor. Bu nedenle bana kalırsa ADCON1=0 eşitliğini kullan. Böylece bütün referans voltaj girişileri için picin beslemesi kullanılır.

16F88 de ayrıca birde Comparatör bulunur ve default olarak bu açılır. Şayet CMCON=7 komutunu kullanmaz isen A portundaki pinler komparatör (yani analog) çalışırlar.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

emrah


hocam bir sorum olacaktı.

while .... wend ile  ıf.. then.. endif  arasındaki fark nedir ??

vermiş oldugunuz örnek ıf komutu ilede yapılamazmıda bu komutu kullandınız. nedir ayrıcalıgı ?



Alıntı yapılan: ete - 06 Nisan 2011, 07:29:09

Bekle=200
While But1=0 or But2=1
   ZAMAN=ZAMAN+1   
   IF ZAMAN>10 then BEKLE=100
   Sure=Sure+1
   PAUSE Bekle
Wend

Ete

ete

IF komutu yalnızca her çevrimde bir kere işlenir.
While ise şart yerine gelinceye kadar işlenir.
IF But1=0 then.. diy ebir komut yazdığınız zaman program o satıra geldiği zaman but1 tuşuna basılmışmı basılmamışmı bir kere kontrol eder ve basılmış ise if altındaki satırları değilse endif tensonraki satırları icra eder.
While But1=0  ... şeklinde bir komut olduğu zaman ise program bu satıra geldiğinde but1 tuşuna basılmış ise bırakıncaya kadar wend komutuna kadar olan komutları icra eder. Buton bırakılıncada wend den sonraki satırları icra eder. While kelimesinin Türkçe anlamınıda vererek açıklamak daha uygun olacak sanırım But1 ve But2 tuşlarına basılı tutuyor iken...... şunları yap diyor bu komut.

Aynı iş if komutları ilede yapılabilirdi .Şöyle;
Bekle=200
if but1=0 or but2=0 then
tekrar:
  zaman=zaman+1
  if zaman>10 then bekle=100
  sure=sure+1
  pause Bekle
  if but1=0 and but2=0 then tekrar
endif


Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

dyonizos

hocam siz muhteşemsiniz. Söyleyecek söz bulamıyorum.
Tekrar tekrar teşekkürler.

Mucit23

Ete hocam anlatmış. Yine benim en son yaptığım ayarlı termostat devresindede dediğinden yapmıştım.
Termostadın kodlarını vereyim. Biraz karışık gelebilir ama belki senin için fikir verici olur.
'****************************************************************
'*  Name    : TERMOMETRE.BAS                                    *
'*  Author  : [FERHAT YOL]                                      *
'*  Notice  : DS18B20'li oda termometresi]                      *
'*          :                                                   *
'*  Date    : 12.02.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   : Isı sensörü olarak DS18B20 kullanılacaktır. Sensör*
'*          : kablosu 15 metreden fazla olaması halinde DS18B20 *
'*          : Data bacağına bağlı olan 4.7K direnci 2.2K direnç *
'*          : ile değiştirilmesi gerekmektedir.                 * 
'****************************************************************
DEFINE OSC 4

@ DEVICE pic16F628                      'işlemci 16F628                               
@ DEVICE pic16F628, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak 

TRISA=%10111000
TRISB=%00000000
PORTA=0:PORTB=0

CMCON=7  'Comparatör pinleri iptal hepsi giriş çıkış
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
'presc:000=1/2, 001=1/4, 010=1/8, 011=1/16, 100=1/32, 101=1/64, 110=1/128,111=1/256	
OPTION_REG=%00000011  'Pull up dirençleri İPTAL- Bölme oranı 1/16
INTCON=%10100000  'Kesmeler aktif ve TMR0 (bit5) kesmesi aktif
TMR0=99

'---------------------------PIN TANIMLAMALARI-----------------------------------
SYMBOL SET=PORTA.5
SYMBOL YUKARI=PORTA.4
SYMBOL ASAGI=PORTA.3
SYMBOL DIG0=PORTA.0
SYMBOL DIG1=PORTA.1
SYMBOL DIG2=PORTA.2
'-------------------------------------------------------------------------------
ROLE  VAR PORTA.6
'-----------------------------DEĞİŞKENLER---------------------------------------

SAYAC  VAR  BYTE
SIRA   VAR  BYTE
SAYI   VAR  BYTE
TERM   VAR  WORD
ISIS   VAR  WORD
ONDA   VAR  BYTE
AKTAR1 VAR  BYTE
AKTAR2 VAR  BYTE
AKTAR3 VAR  BYTE
SYC    VAR  BYTE
SNS    VAR  BYTE
SNY    VAR  BYTE
ISIH   VAR  BYTE
ISIL   VAR  BYTE
TUS    VAR  BIT
DP     VAR  BIT
W      VAR  BIT
U      VAR  BIT
Z      VAR  BYTE
X      VAR  BYTE
I      VAR  WORD
'---------------------------------ISI TANIMLAMALARI-----------------------------
    Busy        VAR BIT         ' Busy Status-Bit
    HAM         VAR	WORD
    ISI         VAR WORD        ' Sensör HAM okuma değeri
    Float       VAR WORD        ' Holds remainder for + temp C display       
    ISARET_BITI VAR HAM.11'Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
    EKSI_ISI    CON 1           ' Negatif_Cold = 1
    SERECE      CON 223         ' ° işareti
    ISARET      VAR BYTE        
    Comm_Pin    VAR	PORTA.7
'-------------------------------------------------------------- 

BASLANGIC:DP=0'--------------------BAŞLANGIC------------------------------------   
gosub EKRAN3
gosub SENSORYAZ
GOSUB SENSOROKU
read $0,ISIL
READ $1,ISIH
READ $2,SNS
IF ISIL>99 THEN ISIL=0
IF ISIH>9 THEN ISIH=0
IF SNS>50 THEN SNS=0
TERM=(ISIL*10)+ISIH
ISIS=TERM-SNS
GOSUB DELAY1
DP=1:W=1:SYC=0

BASLA:'----------------------------ANA DONGÜ------------------------------------
GOSUB EKRAN
GOSUB SENSOROKU
GOSUB KONTROL

IF TUS=1 THEN GOTO AYAR
GOTO BASLA

'--------------------------------ALT PROGRAMLAR---------------------------------

SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
SENSORYAZ: 'okumaya hazırlan..          
OWOUT   Comm_Pin, 1, [$CC,$4E, $FF, $FF, $7F]
OWOUT   Comm_Pin, 1, [$CC,$48]          
OWOUT   Comm_Pin, 1, [$CC,$B8]          
OWOUT   Comm_Pin, 1, [$CC,$BE]          
return 

    
Hesapla:  ' Ham değerden Santigrat derece hesabı
    ISARET  = "+"
    IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-"  
       ham=~ham+2
    endif
    float = (HAM*10)/16  
    RETURN  
END
     
RETURN 

KONTROL: ' Role kontrol..
IF ISIS=>FLOAT THEN 
  SYC=SYC+1
   IF SYC=>3 THEN 
   SYC=3:HIGH ROLE
   ENDIF
endIF
IF FLOAT=>TERM THEN 
  SYC=0:LOW ROLE
ENDIF
RETURN   

DELAY: 'gecıkme 1
  FOR I=0 TO 150:NEXT
RETURN
DELAY1:'gecıkme 2
  FOR I=0 TO 12000:NEXT
RETURN
DELAY2:'gecıkme 3
  FOR I=0 TO 125:NEXT
RETURN

EKRAN:'Sıcaklık gösteriliyor.
 Z=FLOAT DIG 0:GOSUB AL:AKTAR1=SAYI          
 Z=FLOAT DIG 1:GOSUB AL:AKTAR2=SAYI
 Z=FLOAT DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN1: 'SET yazısı
 Z=14:GOSUB AL:AKTAR1=SAYI
 Z=13:GOSUB AL:AKTAR2=SAYI
 Z=5:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN2:'Set değeri gösteriliyor
 Z=TERM DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
 Z=TERM DIG 1:GOSUB AL:AKTAR2=SAYI
 Z=TERM DIG 2:GOSUB AL:AKTAR3=SAYI
RETURN
EKRAN3:
 AKTAR1=64
 AKTAR2=64
 AKTAR3=64
RETURN
EKRAN4:'Hassasiyet ekranı
 Z=SNS DIG 0:GOSUB AL:AKTAR1=SAYI:IF U=1 THEN AKTAR1=0
 Z=SNS DIG 1:GOSUB AL:AKTAR2=SAYI
 aktar3=0
RETURN
 
AL: LOOKUP Z,[63,6,91,79,102,109,125,7,127,111,99,57,64,121,120],SAYI :RETURN'Karekter al 

KAYDET: 'Değerler eproom'a kaydediliyor..
WHILE TUS=1:WEND
 ISIL=TERM/10
 ISIH=TERM//10
 WRITE $0,ISIL:PAUSEUS 2
 WRITE $1,ISIH:PAUSEUS 2
 WRITE $2,SNS:PAUSEUS 2
GOTO BASLANGIC

AYAR: 'Menuye gırıs 
 WHILE TUS=1:WEND
 DP=0 
 GOSUB EKRAN1
 GOSUB DELAY1
 READ $0,ISIL
 READ $1,ISIH
 TERM=(ISIL*10)+ISIH
 DP=1:syc=0:SNY=0:W=0 

MENU:
IF YUKARI=0 THEN
W=1:U=0:sny=0 
TERM=TERM+1
 WHILE YUKARI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=50:TERM=TERM+1:GOSUB DELAY
     ENDIF 
   GOSUB EKRAN2
   IF TERM>990 THEN TERM=0
 WEND
 SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF

IF ASAGI=0 THEN
W=1:U=0:sny=0  
TERM=TERM-1
 WHILE ASAGI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=50:TERM=TERM-1:GOSUB DELAY
     ENDIF 
   GOSUB EKRAN2
   IF TERM>999 THEN TERM=990
 WEND
 SYC=0:IF TERM>999 THEN TERM=990
ELSE
W=0
ENDIF

IF TUS=1 THEN
GOTO SENSIVITY
ENDIF
GOSUB EKRAN2
GOTO MENU

SENSIVITY: '| menusu giriş..
WHILE TUS=1:WEND
read $2,sns
IF SNS>50 THEN SNS=0
DP=1:SNY=0
SENS:
GOSUB EKRAN4
IF YUKARI=0 THEN
W=1:SNY=0:U=0  
SNS=SNS+1
 WHILE YUKARI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=40:SNS=SNS+1:GOSUB DELAY2
     ENDIF 
   GOSUB EKRAN4
   IF SNS=>50 THEN SNS=50
 WEND
 SYC=0:IF SNS=>50 THEN SNS=50
ELSE
W=0
ENDIF            

IF ASAGI=0 THEN
 W=1:U=0:sny=0 
 SNS=SNS-1
 WHILE ASAGI=0
   SYC=SYC+1:GOSUB DELAY
     IF SYC>40 THEN
       SYC=40:SNS=SNS-1:GOSUB DELAY2
     ENDIF 
   GOSUB EKRAN4
   IF SNS>50 THEN SNS=0
 WEND
 SYC=0:IF SNS>50 THEN SNS=0
ELSE
W=0
ENDIF

IF TUS=1 THEN 
GOTO KAYDET
ENDIF
GOTO SENS

Disable         		
KESME:  'kesme alt programı
  IF SET=0 THEN 
  TUS=1
  ELSE
  TUS=0
  ENDIF
  
IF W=0 THEN 
  SNY=SNY+1
  IF SNY=>120 THEN 
    U=1
    ELSE
    U=0
  ENDIF
ENDIF
IF SNY=>240 THEN SNY=0

	SAYAC=SAYAC+1				
   	If SAYAC>2 then SAYAC=0	

    If SAYAC=0 then
	  DIG2=0 
	  PORTB=AKTAR1
	  DIG0=1  
      PAUSEUS 2   	
	  Endif

	  If SAYAC=1 then		
	  DIG0=0
	  PORTB=AKTAR2
	  PORTB.7=DP
	  DIG1=1 
	  PAUSEUS 2
	  Endif
	  
	  If SAYAC=2 then		
	  DIG1=0
	  PORTB=AKTAR3
	  DIG2=1 
	  PAUSEUS 2
	  Endif	
          
   	TMR0=160
    INTCON.2=0
    			
    Resume		
	Enable	
  end		     

https://320volt.com/ayarlanabilir-termometre-devresi-16f628-ds18b20-picbasic-pro/

emrah

cevap için teşekkürler hocam. butonlarla ilgili olarak kendimi if komutları ile çok yormuşum. şimdi daha kolaylaştı.

erhanmete

haddim olmayarak küçük bir tavsiyem olacak
periyodik INTERRUPT kullanmasını öğrenirseni programlarınız içinde delay kullanmadan programlarınızı yazabilirsiniz.
aynı zamanda bu tip problemlere daha efektif çözümler üretebilirsiniz.

örneğin periyodik INTERRUPT içine timerlar kurarsınız ve bu timerlar bazı bitleri set eder sizde bu bitleri kontrol edersiniz.
bu sayede herhangi bir işlem için delay gerekirse, "delay kullanarak kodu durdurmadan" diğer işlerinize bakabilirsiniz.

jackal183

Alıntı yapılan: erhanmete - 07 Nisan 2011, 18:43:07
haddim olmayarak küçük bir tavsiyem olacak
periyodik INTERRUPT kullanmasını öğrenirseni programlarınız içinde delay kullanmadan programlarınızı yazabilirsiniz.
aynı zamanda bu tip problemlere daha efektif çözümler üretebilirsiniz.

örneğin periyodik INTERRUPT içine timerlar kurarsınız ve bu timerlar bazı bitleri set eder sizde bu bitleri kontrol edersiniz.
bu sayede herhangi bir işlem için delay gerekirse, "delay kullanarak kodu durdurmadan" diğer işlerinize bakabilirsiniz.

hocam tam da bu dediğinize ihtiyacım var, birkaç gündür düşünüyorum şu an üzerinde çalıştığım şeyi bunula yaparsam olacak diye, CCS biliyorsanız bu bahsettiğiniz şeyi örnek olarak yazabilir misiniz