adc den butona kaç defa basıldıgını sayan program

Başlatan dedim, 05 Temmuz 2015, 16:02:58

ete

Bırak isimli değişken sadece tuşun bırakılıp bırakılmadığını kontrol ettiğine göre onu kayıt etmenin bir faydası yok sana.
Ledleri flash yaptıran parametre kim? tabiiki SAY değişkeni. Peki ne zaman flash yapacak SAY=3 olunca.
O halde SAY=3 olunca bir kayıt almak en doğrusu. SAY=4 oluncada SAY=0 yapıldığı için bu noktada da bir kayıt almak gerekir.
SOnuçta  BASLA satırından evvel koyduğumuz SAY=ERead 10 satırı ile SAY değeri açılışta okunur.
Program Başla satırına gelince henüz tuşa basılmadan SAY=3 olduğu için önce orada led yakılır. Program 500 ms sonra  Wend satırından sonra Led'i toggle yaparak söndürür ve böylece led flash yapmaya devam etmiş olur taaki tuşa basıncaya kadar.

İşte Programın ayarlanmış hali,
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
TRISB=%11101111
       
Symbol LED=PORTB.4         

Output LED
Dim BIRAK As Byte
Dim  HAM  As  Word 
Dim say As Byte
PORTA=0                                                   
PORTB=0                                                 
DelayMS 250
SAY=ERead 10
IF SAY=255 then SAY=0 'önceden kayıt alınmamış ise okunan değer 255 olacaktır bu durumda SAY=0 olması gerekir.
IF SAY=3 then LED=1  'SAY=3 ise ledi yakıyoruz.
;-------------------------------------------------------------------------------
BASLA:
    T1CON=%00110001:TMR1H=$0B:TMR1L=$DC:PIR1.0=0  'TMR1 sayacı 500 ms de bir kesme yaratacak şekilde kuruldu
   
     While PIR1.0=0  'kesme bayrağı sıfır ise wend komutuna kadar olanları tekrarla
BIR:   
       ADCIN 0, HAM              'ADC den değer oku (buton basılı ise HAM>835 , basılı değil ise HM<835 olacaktır
       If HAM>835 Then        'butona basılmış ise
         If BIRAK=0 Then      'tusa ilk defa basılıyor ise         
           SAY=SAY+1:BIRAK=1  'say değerini artır bırak bayrağını set et.
           IF SAY=3 then Gosub KAYIT
           If say=4 Then      'say=4 olmuş ise           
             say=0:LED=0      'say=0 yap ve led yenıyorsa söndür.
             gosub KAYIT
           EndIf   
         EndIf 
         GoTo BIR             'tuş basılı durumda olduğu için BIR etiketine git
       EndIf                  'tus basılı olduğu müddetçe bırak=1 olacak ve say değeri bir kere artacaktır.
       BIRAK=0                'tus brakılınca program bu noktaya gelecek ve BIRAK=0 yaparak birdaha ki basılışta say değeri artacak
    Wend
'program 500 ms çalışarak yukarıdaki işleri yapacak. 500 ms sonra PIR1.0=1 olacak ve otomatikman alttaki satıra ulaşacaktır.
   If SAY=3 Then Toggle LED  'say=3 ise led, her 500 ms de bir yanacak bir sönecek
   GoTo BASLA
   
KAYIT:
EWrite 10,[SAY]:DelayMS 10
return   
End 

dedim

usta tesekkür ederim ilgilendigin için en azından eproma kayıt işini ögrendim sayıyorum kendımı

dedim

ete usta select case kullanarak aynı programı degişik gecıkme döngulerı kurarak calıstırabilirmiyim.

mesela  case 1 de 5 sanıye roleler acık durcak sonra kapancak. case 2 de 10 sanıye acık durcak sonra kapancak.case 3 de 15 sanıye acık durcak kapancak gibi yapılabilinirmi.yoksa select case basit menuler içinmi kullanılır.

ete

Elbette yapılabilir ama üzerinde epeyce düşünmek lazım. Zira timer döngüsü yalnızca 500 ms lik gecikme yaratıyor.
500 ms den büyük değerler için ayrıca bir sayac kullanmak gerekir.
Diyelimki 5 sn (5000 ms) lik gecikme yaratacaksın. SURE=5000 olacaktır. Bizim while wend döngüsü 500 ms yarattığına göre 5000/500=10 defa kesme yaratırsan 5000 ms ye ye ulaşırsın demektir bu. Buradan SURE=SURE/500 diyeceksin demektir.
Her while ...wend döngüsünden sonra KES=KES+1 diye sayacaksın ve IF KES<SURE then BASLA_BIR  diyeceksin.
BASLA_BIR de döngüyü yeniden kurduğun yer olacak. KES=SURE  olunca (yani 10 defa kesme oluşunca);
   If SAY=3 Then Toggle LED  'say=3 ise led, her 500 ms de bir yanacak bir sönecek
   GoTo BASLA
satırlarını çalıştıracaksın.
Ben yalnızca gecikmeyi nasıl sağlayacağını anlattım. Sen Select Case kullanarak farklı gecikmeler elde edip programı While wend döngüsüne yönlendirmen gerekiyor. Biraz karmaşık bir iş ama zor değil üzerinde çalışman gerekiyor.


Ete


dedim

timer de kurmus oldugun rakamlarla kesmenın süresinimi  belırlemıs oluyoruz ete usta bu yazmıs oldugun rakamların dısında kendımde denemeler yapıp kesme süresini uzatıp yada kısalta bilirmiyim

ete

Önceki mesajımda sürenin neye göre ve nasıl hesaplandığını anlatmıştım. Anlamamışsın anlaşılan.
4 Mhz de 1 işlemci puls'i 1us süre sağlar. Yani TMR1 sayacı nın her sayması 1us dir.
TMR1 sayacı 0 dan başlayıp 65535'e gelinceye kadar saydığında geçecek süre 65535us yada 65,535ms dir. Bu süre, sayac 1/1 bölme oranı ile sayarsa  geçerlidir. Bu sayac için 1/2 , 1/4 ve 1/8 bölme oranları kullanılabiliyor. TMR1 kesmesini aktif etsen de etmesende sayac 65535 den sonra saymaya devam ederse Kesme bayrağını Set eder oda PIR1.0 bitidir.
Bu durumda bana lazım olan süreyi bilirsem sayacı sınırlar içinde kalmak şartı ile istediğim değer için kullanabilirim.
Önce maksimum süreye bir bakalım. Nasıl sağlanır bu? sayacı sıfırdan başlatıp 65535 e kadar saydırırsam ve bölme oranınıda 1/8 olarak alırsam bana maksimum gecikmeyi sağlar. buda 65535 x 8=524.280 us yada 524,28 ms dir.

Diyelimki bana 100 ms lazım. Önce bu değeri us cinsine çeviririz buda 100.000 us ederki bu 16 bitlik olan TMR1 in limitini (65535) aşan bir değer. O halde bölücü de kullanmam gerekiyor. Şayet bu sayıyı 2 ye bölersem (1/2 bölücü) 50.000 değerini bulurum ki bu sınırlar dahilindedir. Demekki 100 ms gecikme için 1/2 bölme kullanarak işimi halledebileceğim.
Sayac sıfırdan başlarsa 65535 x 2=131.070 us lik gecikme yaratır. Bana 100.000 gerekiyor o halde 65535-50.000=15535 kadar bir fazlalığım var. Bunu sayacı başlatma değeri olarak alırsam fazlalık kalmaz. Zira bu değerden başlayan sayac 65535'e geldiğinde tam tamına 50.000 (aslında 50.000x2=100.000) saymış olacaktır. Bu durumda TMR1 e verilecek ön yükleme değerim 15535 olacaktır. Aslında çıkartmayı 65536 dan çıkartarak buluyoruz. Çünki sayılacak sayılarda 65535 de sayılacak rakamdır. Bunu aşınca 65536 gelecektir. Bu durumda fark 15.536 olarak bulunur. HEX karşılığı  $3CB0 olup TMR1H=$3C ve TMR1L=$B0 şeklinde sayaca bu değer verilir.

Bir örnek daha yapalım bana 180 ms lazım. Bu 180.000 us eder. Limit aşılmış durumda 1/2 bölücü kullansam 90.000 bulurum buda limit dışı. O halde bir sonraki bölücü olan 1/4 kullanırım. Bu durrumda 45.000 bulurum ki bu limit dahilindedir.
65536-45000=20536 bulunurki buda hex olarak $5038 dir. Bu değer Timer1 e ön yükleme değeri olarak verilip sayac 1/4 bölme oranı ile çalıştırılarak istenilen gecikme elde edilir.

Hesaplardan anlayacağın gibi maksimum gecikme 524.280us oalrak elde edilebiliyor. Hesap kolaylığı açısından bu süreyi 500.000 olacak şekilde ayarlarsan ve her süre bitiminde başka bir KES sayacı çalıştırırsan daha fazla gecikmeler elde edebilirsin demiştim. 10 defa kesme oluşturursan 500ms x 10=5000ms ederki buda 5 sn demektir. Uzun gecikmelerin elde edilmeside bu şekilde olur.

Ete


dedim

ete usta timer en fazla 65535 sayabiliyor bunu anladım.65536 oluncada kesme bayragı biti 1 oluyor bunuda anladım.anlamadıgım asagıda yazılı olan hex sayılar bu sayıları  örnek verecek olursak 15.536 bulunurki buda hex olarak $3CB0 dir.burdakı 15.536 nın hex karsılıgını nasıl buluyorsun.bunun için program varmıdır. TMR1H=$3C VE TMR1L=$B0 SEKLİNE GELDİGİNİ nasıl buluyorsun.buraya  normal olarak rakamlar yazmak ıstesek olurmu olmaz ıse bu hexlerı nasıl buldugunu anlatabılırsen sevınırım

ete

Windows hesap makinası ile bir çok masaüstü hesap makinası sayıların hex karşılığını vermektedir. Onlara bakıyorum.
$0BDC sayısında hangi sayının TMR1L hangisinin TMR1H olacağına ise şöyle karar veriyorum.
$0BDC sayısının $DC kısmı (sağ taraftaki 2 digit)  o sayının LSB yani LOW kısmıdır. Kalan ise (sol taraf) $0B ise sayının HIGH kısmıdır.
TMR1L TMR1 sayacının LOW kısmını ifade ediyor. O halde bu $DC ye eşitlenmeli, TMR1H ise sayacın HIGH tarafını ifade ediyor. O halde $0B buraya eşitlenmelidir diyorum. Hepsi bu. Biraz incelesen sende farklı düşünmezsin ama yanlış yerlerde dolaşıyorsun sanırım.

Ete

dedim

az önce hesap makınası (wındows için)ile denedımde ustam aynen anlattıgın gibi  ben az bucuk tabırı caiz ise at gözlugu ile bakıyormusum.denemeler yapabılırım artık

Powered by EzPortal