Sayma işlemi

Başlatan pcb, 14 Aralık 2006, 15:45:22

pcb

16F877 ile pals ler arası süreyi ekranda yazdırmak istiyorum.  İstenilen bir anda bir buton vasıtası ile buton a basıldıktan sonraki ilk pals den itibaren süre olarak saymaya başlayacak ve diğer bir buton ile durdurulacak ekranda yazdırılacak. Ekranda yazdırmayı, buton yapımını biliyorum ancak saydırma işini bir türlü anlayamadım. 16f877 deki kristal kullanılarak yapılan TRM0 ile kesme yapılan bir program ama nasıl ibir yol uygulanacak bilmiyorum.
Basit bir program ile arkadaşlar yardımcı olursa kendim geliştirebilirim.
Yardımlarınız için teşekkür ederim

cuneytsezmis1

sürenin ölçüsü ne olacak mikro sn mi?......dk mı? belirtirsen daha iyi netice alabilirsin.

mytap

TMR0 artan yönde sayan 8 bitlik özel bir yazmaçtır. Dahili olarak cristalin frekansına bağlı bir sayma işlemi yapar. Harici olarakda Porta.4 numaralı pini yani TOCKI ile sayma işlemi yapılabilir. TRM0 max değerine yani 8 bit 255 decimal değerine ulaştığında kesme yaratır ve programın başında belirtilen etikete dallanır. Burda sayma işlemini yeniden yaptırmak için INTCON.1 registerinin set edilmiş bayrağını sıfırlamak gerekir.  Buyazmacı isteğe göre saydırmakda mümküdür. İstenilirse dahili yada harici olarak ayarlanabilir. Ayar modunu bilindiği üzere OPTION_REG ile belirlenir.

Sorunda anlayamadığım nokta palsler arası saydırma işlemi dediğiniz ne oluyor? MCU 'ya harici bir kaynaktan pulsmu geliyor gelen pulsların low yada high geçiş aralarındaki zamanımı bulacaksın yoksa sadece TMR0 ile bi zamanlayıcımı yapmak istiyorsun?

Açıklarsan bir kod örneği yazılabilir
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

pcb

Dış kaynak tan gelen bir pals var bu pals ın başlamasıyla birlikte işlemci mikro sn olarak saymaya başlayacak, sayma başlama ve durdurma işlemi bir er buton ile olacak. Bana lazım olan pals ın yükselen kenarından itibaren durdurma butonuna basıncaya kadar olan sürenin ekranda yazması.
Yardımlarınız için teşekkürler.

mytap

Harici bir kaynak ise TOCKI yani PORTA.4 pinini kullanacaksın. Yükselen kenarda sayma işlemini başlatmak için OPTION_REG in 5.bitini 1 yapacaksın.  Fakat böyle bir uygulama için TMR0 ' ı kullanmak işleri biraz karıştırır. Bunun yerine PORTB.0 kesmesi kullanılması daha mantıklı geliyor.
BASLA:
IF START_BUTON=0 THEN START
FOR A= 1 TO 10           ;MCU yu biraz bekletiyoruz
NEXT A
GOTO BASLA

START:
ON INTERRUPT GOTO RB0_INT
OPTION_REG.6 =1 ; kesme yükselen kenarda aktif   
INTCON=%11010000  ; kesmeler aktif
IF STOP_BUTON=0 THEN HESAP
GOTO START

DISABLE
RB0_INT:
COUNT=PORTB.0,100,HAM_PULS ; 100ms pulsları aldık değişkenin içne yolladık
IF STOP_BUTON=0 THEN HESAPLA ; Stop tuşuna basıldı ise hesaplamaya git
SAYI=SAYI+1 ; Burda STOP butonuna basıncaya kadar kaç kere 100 ms geçtiğini buluyoruz (isteğe göre zaman daraltılabilir)
GOTO RB0_INT

HESAPLA:
TOPLAM_PULS=HAM_PULS * SAYI ; Toplam pulslar ms cinsinden artık elimizde

LCDOUT DEC,TOPLAM_PULS ; pulsların ms cinsinden değeri
LCDOUT DEC,HAM_PULS ; 100ms deki pulsların değeri
LCDOUT DEC,SAYI ; Kaç tane 100 ms olduğu

INTCON.1=0  ; Kesme işimiz bitti set edilmiş bayrak silindi
RESUME        ; Geldiğin yere dön
ENABLE         ; kesmeler yeniden aktif

GOTO BASLA  ;En başa dön


codu acele ile yazdım belki bi sorun vardır. Aklıma gelen yöntem bu oldu.
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

XX_CİHAN_XX

b0 kesmesını yukselen kenar olarak ayarlayıp aktıf edecen ve aynı zamanda tmr0 kesmesıde aktıf edılmelı.
Bir tanede sayac regısterın olacak yada surenın uzunluguna gore bırkac tanede sayac regısterıne ıhtıyac duyabılırsın.B0 kesmesı geldıgı anda tmr0 clear ve sayac clear edılecek(bu temızleme ıslemı pals ile birlikte gelen ilk kesmede ve sadece bıur sefer yapılmalı)stop butonuna basılana kadar tmr0 her tasma verdıgınde sayacı 1 artıracaksın.Bu arada palsleri saymak istersen ayrı bır sayac regısterı ılede her b0 kesmesı geldıgınde plas sayacını artırabılırsın.stop butonuna basıldıgında ise şöyle bir formul ile süreyi tespit edebilirsin.
(zaman sayacı x 255 + tmr0 degeri) x tmr0 sayma zamanı
tmr0 sayma zamanını ıstedıgın hassaslıga gore optıon reg den bolenını gırerek ayarlıyabılırsın.
mytap arkadasımızın kodları konusunda bişi diyemem basic den pek anlamam. Kolay gelsin...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

ulaser84

mytap dostum prgramda ufak bir hata olarak şunu gördüm.sayı değişkeni (muhtemelen word) max değeri aştığı an stop butonuna basılırsa hesap için gereken değer süremizden kısa olacaktır.burada 65535 sayısı oluştuğu an program hesaplamaya giderse daha iyi olur.onun dışında arkadaşımızın istediği algoritmaya uygun bir çözüm.saygılar iyi çalışmalar

mytap

Alıntı yapılan: "ulaser84"mytap dostum prgramda ufak bir hata olarak şunu gördüm.sayı değişkeni (muhtemelen word) max değeri aştığı an stop butonuna basılırsa hesap için gereken değer süremizden kısa olacaktır.burada 65535 sayısı oluştuğu an program hesaplamaya giderse daha iyi olur.onun dışında arkadaşımızın istediği algoritmaya uygun bir çözüm.saygılar iyi çalışmalar

bu kodlardaki SAYI değişkeni startla birlikte PORTB.0 pinini okuyor ve stopa basıncaya kadar, kaç tane 100ms geçtiğini bulmak için düşündüğüm küçük bi oyundu. Zaman daraltılmasından kastım Portb.0 pinindeki, 100ms okuma suresi olan Counterın süresini kısaltabilirizdi. Burda ben mantığı anlatmak için yada aklıma gelen ilk şeyi vurgulaman için yazdım.

Sizin fikriniz ise Word max olana kadar MCU stop tuşuna basınca hesap için bu sürenin bitmesini beklemesi gerekir ben burda 100ms gibi zaman aralığında hesaplatmayı planlamıştım. Sizin fikrinize göre stop tuşuna basıldıktan sonra hesap için beklenilecek süre gayet açıktır;

65535 X 100ms= 65535000ms dir. Biraz uzun bi zaman sanırım  8O
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

ulaser84

evet word*100 ms sonundaki süre uzun bir süre 65 dk yapıyor.byte değişkeni bile yeterli gelir. :)

pcb

yardımlarınız için teşekkür ederim.

mytap

Burda anlatmak istediğim SAYI değişkeni zamanlama ile bi alakası doğrudan yok sadece programda kaç tane 100ms olduğunu bulmak için. Counter 100ms istenilirse 1ms olarak ayarlanabilir. Böylelikle tam bir sayac olabilir. Yani bunda anlaşalım artık. SAYI bir belirleyici değişken, yani daha nasıl anlatabilirim bilemiyorum
-------------------------------------------------------- hayırlı günler, iyi çalışmalar..  --------------------------------------------------------

ulaser84

yok hocam siz doğru anlatıyorsunuz.burada benim aklıma takılan şey sayacın max değer aldığı an otomatik hesaplamaya gitmesi.tabi buna pratik olarak gerek yok.çünkü ölçüm süresi oldukça uzun.bi an aklıma sayacın alacağı max değerden sonra (0 değeri) ve bu anda stop aktif olursa,sayac küçük bir değer alacaktır.yani benimkisi biraz paranoya :) .programda bi mantık hatası yok yani.