avatar_elektro77

Bir butonun hıgh süresini ölçme

Başlatan elektro77, 29 Mayıs 2020, 14:56:01

elektro77

Merhabalar. Picin bir pinine bağlı butona hangi hızla basılıp bırakılırsa aynı hızda veya  ona yakın bir hızda picin 16 adet pinine bağlı ledleri sırası ile yakmak istiyorum. yine başka bir pine bağlı diğer bir buton ile de yine butona basılıp bırakma hızına göre aynı ledleri ters taraftan sıra ile  yakıp sıra ile söndürmek  istiyorum.
ledler yanarken iki butondan herhangi birine  tekrar basılıp bırakılırsa o anda yandığı yönde (o an yanık olanlar sönmeden) tekrar yanmaya başlamasını istiyorum.
Not: Butona basıp bırakma süresi en az 200mS en fazla 1000 veya 2000mS limitli
Bunun için hangi yolu izlemeliyim.
Her iki butona da sayaç değişkeni atayıp saydırarak yapsam olur mu? Bu yolla ledlerin yanma esnasında tekrar butonlara basılıp basılmadığına nasıl bakarım.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

IF BUTON=0 THEN 'butona basılmış ise
  TMR1H=0:TMR1L=0:T1CON=1
  WHILE BUTON=0:WEND
  T1CON=0:SURE.BYTE0=TMR1L:SURE.BYTE1=TMR1H
ENDIF

...
...
LEDYAK:
LED1=1
PAUSEUS SURE
LED1=0
LED2=1
PAUSEUS SURE
LED2=0
...

Ete

elektro77

Alıntı yapılan: ete - 29 Mayıs 2020, 15:48:19
IF BUTON=0 THEN 'butona basılmış ise
  TMR1H=0:TMR1L=0:T1CON=1
  WHILE BUTON=0:WEND
  T1CON=0:SURE.BYTE0=TMR1L:SURE.BYTE1=TMR1H
ENDIF

...
...
LEDYAK:
LED1=1
PAUSEUS SURE
LED1=0
LED2=1
PAUSEUS SURE
LED2=0
...

Ete

Yani tmr1 kesmesini öğrenmem gerecek değil mi hocam. Ayarlar falan.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Ne ayarından bahsediyorsun acaba. Yapabileceğin ayar bölme oranı ile ilgili olabilir.
Biliyorsun 16 bitlik olan Timer-1 , bölme kullanmadan  en fazla 65535 us sayabilir. Bu yaklaşık 65 ms eder.
Bölme oranı ise 1/1 - 1/2 - 1/4 - 1/8 olarak kullanılabiliyor.
1/2 bölme oranını kullanırsan 65535 saydığında aslında 2 katını saymış olursun. Süre olarak 130 ms ye denk gelir.
1/4 bölme oranını alırsan, 262 ms sayabilirsin.
1/8 bölme oranını kullanırsan 65535 x 8= 524,280 ms saymış olursun.
Bölme oranı T1CON registeri 4-5 nolu bitlerine verilen değerle ayarlanıyor.
%00 = 1/1
%01 = 1/2
%10 = 1/4
%11 = 1/8
Başkada birşey öğrenmen gerekmiyor.
Ete

elektro77

#4
Kesme sigorta ayarlarından bahsediyorum hocam. Yani başla satırından öncesini pek ayarlayamıyorum. Birde tmr1 için belirli bir pin kullanılacaksa 16f876a da hangi iki pini buton olarak kullanacağım hocam. Zira portB ve portC nin tamamında ledler var.(Devre gerçekte hazır)

"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Timer-1 bir sayac ve belirli bir pine bağlı değil. Sadece basılma süresini ölçecek.
Şemanda 4 adet buton yada anahtar mevcut işte bunları kullanacaksın işi karıştırdın yine. Baştan bu şekilde açıklasan olmazmıydı??????
Neden kıt bir açıklama verip sonra böyleydi şöyleydi diyorsun?. Soru sordun cevapladım. Cevaba göre yap bir şeyler. Benden bu kadar. Temel fikir şu. Butona basılır basılmaz Timer önce sıfırlanıyor ardından aktif ediliyor. Buton bırakıldığında timer değeri bir başka değişkene aktarılıyor ve bu değişken değeri, şayet bölme oranın 1/1 ise, direk gecikme değeri olarak (us) cinsinden kullanılıyor. Şayet farklı bir bölme oranı kullandın ise hesap yapman gerekecek. Örneğin 1/8 kullandın ise olsı 65535 i geçme ihtimaline karşılık SURE=(SURE*8)/1000 diyerek sure değerini PAUSE (ms) olarak kullanman gerekir.

Ete

elektro77

#6
Hocam aşağıdaki gibi yaptım ama byte0,byte1 isimli etiketlere hata veriyor. timer1 ders notlarına bakınca byte0 ve byte1 isimli bir tanımlama göremedim hocam. Derslerde tanımlama şöyle TMR1IF VAR PIR1.0   
Birde mantıklımı yaptığım pwm şekli bakarmısınız? Tusa basılma süresine göre aynı hızda ledler dimleyerek yanacak.
@ __Config _XT_OSC  &  _WDT_OFF &_PWRTE_OFF &_BODEN_OFF &_CP_ON &_CPD_OFF &_LVP_OFF 
 '-------------------------------------------------------------------------------
define OSC 4
 '-------------------------------------------------------------------------------
CMCON=7               'komparatör pinleri iptal hepsi giriş çıkış yapıldı.16F876 dA yok.
ADCON1=7              'ADC KANALLARI DİJİTAL YAPILDI - ADC İPTAL
T1CON=%00110001
'OPTION_REG.7=1       'portB deki dahili PULL-UP lar iptal edildi.
 TRISA=%11111100
 TRISB=%00000000
 TRISC=%00000000
 PORTA=0
 PORTB=0
 PORTC=0
'---------------------------------------

Symbol SW1=PORTA.4
Symbol SW2=PORTA.5
Symbol B1=PORTC.0
Symbol B2=PORTC.1
Symbol B3=PORTC.2
Symbol B4=PORTC.3
Symbol B5=PORTC.4
Symbol B6=PORTC.5
Symbol B7=PORTC.6
Symbol B8=PORTC.7

Symbol B9=PORTB.0
Symbol B10=PORTB.1
Symbol B11=PORTB.2
Symbol B12=PORTB.3
Symbol B13=PORTB.4
Symbol B14=PORTB.5
Symbol B15=PORTB.6
Symbol B16=PORTB.7

sure var byte
pause 200
'-------------------------------------------------------------------------------

BASLA:
IF sw1=1 THEN 'butona basılmış ise
  TMR1H=0:TMR1L=0:T1CON=1
  WHILE sw1=1:WEND
  T1CON=0
  SURE.BYTE0=TMR1L
  SURE.BYTE1=TMR1H
  gosub ASAGIYAN
ENDIF 
'----------------------------
IF sw2=1 THEN 'butona basılmış ise
  TMR1H=0:TMR1L=0:T1CON=1
  WHILE sw2=1:WEND
  T1CON=0
  SURE.BYTE0=TMR1L
  SURE.BYTE1=TMR1H
  gosub YUKARIYAN
ENDIF 


GOTO BASLA
'------------------------------------------------------------------------------
ASAGIYAN:
PWM B1,10,SURE    
PWM B1,50,SURE
PWM B1,100,SURE 
PWM B1,150,SURE
PWM B1,200,SURE 
PWM B1,255,SURE
B1=1

PWM B2,10,SURE     
PWM B2,50,SURE
PWM B2,100,SURE 
PWM B2,150,SURE 
PWM B2,200,SURE
PWM B2,255,SURE
B2=1

PWM B3,10,SURE     
PWM B3,50,SURE
PWM B3,100,SURE 
PWM B3,150,SURE 
PWM B3,200,SURE
PWM B3,255,SURE
B3=1




YUKARIYAN:



RETURN


END
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Aşağıdaki algoritma ile ledlerin tuşa basılma hızına göre dimleyerek yanışı gerçekte tam olarak istediğim gibi çalışıyor fakat pwm aralarında tuşa yeniden basılıp basılmadığı kontrolini nasıl yapacağımı bilmiyorum. Ete hocam yardım eermisiniz lütfen.
BASLA:
IF sw1=1 THEN 'butona basılmış ise
WHILE sw1=1
PAUSE 50
SURE=SURE+1
WEND
lcdout $FE,2,"SURE=",DEC SURE
gosub ASAGIYAN

ENDIF 
'----------------------------
IF sw2=1 THEN 'butona basılmış ise

ENDIF 


GOTO BASLA
'------------------------------------------------------------------------------
ASAGIYAN:
PWM B1,10,SURE    
PWM B1,50,SURE
PWM B1,100,SURE 
PWM B1,150,SURE
PWM B1,200,SURE 
PWM B1,255,SURE
B1=1

PWM B2,10,SURE     
PWM B2,50,SURE
PWM B2,100,SURE 
PWM B2,150,SURE 
PWM B2,200,SURE
PWM B2,255,SURE
B2=1

PWM B3,10,SURE     
PWM B3,50,SURE
PWM B3,100,SURE 
PWM B3,150,SURE 
PWM B3,200,SURE
PWM B3,255,SURE
B3=1
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

PWM komutu ile bu işi yapamazsınız. Çünki komut bir kere başladımı araya girme şansınız yok.
Bunu yapmakiçin HPWM kullanmanız gerek. Yani sinyal geri planda oluşturulurken siz ön planda ne isterseniz yapabilirsiniz.

Ete

Powered by EzPortal