16F84 ile motsiklet hiz öçme

Başlatan mustafaaxu, 21 Ekim 2013, 11:29:50

mustafaaxu

DEĞERLİ ÜSTATLARIM..
İnşallah doğru yerde konuyu açmışızdır hata varsa affola
vespa px200E motosikletimin kilometre dişlisi devamlı aşınıyor
elimde bikaç tane  16F84 var 4 haneli göstergede hızı görebilirmiyim
tekerlege manyetik sensör koyacağım lastik çapını ölçtüm 136 cm
bazı çalışmalar yaptım ama yam sonuş alamadım
pota.4 girişine gelen pals dayısını kaydetsek sonra bunları -binler -yüzler -onlar -birler
diye çözümlesek ve port.b gönderip dört hane 7 seg displeyde yazdırabilirmiyiz.

binary dekade convert dönüştürücüyü başka projelerinizde rahatça kullanabilirsiniz
Sağolsun sayın TAGLİ üyemiz in çalışması BURAYI 2BAYT DÖNÜŞTÜRÜCÜ OLARAK her yerde kullanabilirsiniz


19F84 asm kodu
yardımcı olursanız sevinirim
;-----sayıcı--------Her pals TEMP ve TEMP1 içine yazılıyor--------------------------------------
COUNT                               
   INCF   TEMP,F              ;TEMP değerini 1 arttır
   BTFSC    STATUS,Z           ;   
   INCF    TEMP1,F      ;TEMP1 değerini 1 arttır

   MOVF    TEMP,W
   MOVWF   sayac0   
   MOVF    TEMP1,W
   MOVWF   sayac1   

;   movlw   b'00000000'       ;test için direk sayac0 icine yüklme
;   movwf   sayac0
;   movlw   b'00000001'       ;test için direk sayac1 icine yüklme
;   movwf   sayac1
;------binary dekade convert-----BURAYI 2BAYT DÖNÜŞTÜRÜCÜ OLARAK her yerde kullanabilirsiniz
                clrf            onlar           ;Onlar basamağı sayacı sıfırlanıyor
                clrf            yuzler          ;Yuzler basamağı sayacı sıfırlanıyor
                clrf            binler          ;Binler basamağı sayacı sıfırlanıyor

BINLER_HESAPLA
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfsc           STATUS,C        ;Sonuç eksili mi?
                goto            $+5             ;Değilse büyük byte işlenecek
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?)
                goto            BINLER_CIK_0    ;Demek ki döngü bitmis, (1000'in küçüğü) geri eklenecek
                decf            sayac1,F        ;sayac1 1 azaltılıyor
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi
                subwf           sayac1,F        ;W, sayacın büyük byte'ından çıkarıldı
                btfss           STATUS,C        ;Sonuç eksili mi?
                goto            BINLER_CIK_1    ;Evet ise döngü bitmiş, sayaca 1000 eklenecek
                incf            binler,F        ;Binler sayacı 1 arttırılıyor
                goto            BINLER_HESAPLA  ;Döngüye devam ediliyor
BINLER_CIK_1
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor
                btfsc           STATUS,C        ;Taşma var mı?
                incf            sayac1,F        ;Taşma varsa sayac1 1 arttırılacak
                movlw           b'00000011'     ;1000'in büyük byte'ı W'ye yüklendi
                addwf           sayac1,F        ;Sayacın büyük byte'ı eski haline getiriliyor
                goto            YUZLER_HESAPLA  ;Sonraki adıma geçiliyor
BINLER_CIK_0
                movlw           b'11101000'     ;1000'in küçük byte'ı W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

YUZLER_HESAPLA
                movlw           d'100'          ;100 W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfsc           STATUS,C        ;Sonuç eksili mi?
                goto            $+5             ;Değilse yüzler sayacı artar
                movf            sayac1,F        ;Eksili ise sayac1 test için kendi üzerine yazılıyor
                btfsc           STATUS,Z        ;sayac1 0 mıymış? (büyük byte da mı kurtarmadı?)
                goto            YUZLER_CIK_0    ;Demek ki döngü bitmis, 100 geri eklenecek
                decf            sayac1,F        ;sayac1 1 azaltılıyor
                incf            yuzler,F        ;Yüzler sayacı 1 arttırılıyor
                goto            YUZLER_HESAPLA  ;Döngüye devam ediliyor
YUZLER_CIK_0
                movlw           d'100'          ;100 W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

ONLAR_HESAPLA
                movlw           d'10'           ;10 W'ye yüklendi
                subwf           sayac0,F        ;W, sayacın küçük byte'ından çıkarıldı
                btfss           STATUS,C        ;Sonuç eksili mi?
                goto            ONLAR_CIK_0     ;Demek ki döngü bitmis, 10 geri eklenecek
                incf            onlar,F         ;Onlar sayacı 1 arttırılıyor
                goto            ONLAR_HESAPLA   ;Döngüye devam ediliyor
ONLAR_CIK_0
                movlw           d'10'           ;10 W'ye yüklendi
                addwf           sayac0,F        ;Sayacın küçük byte'ı eski haline getiriliyor

                movf            sayac0,W        ;Kalan değer W'ye alındı
                movwf           birler          ;Birler sayacı ayarlandı
                clrf            sayac0          ;Sonraki işlemler için sayac0 sıfırlanıyor

;---display secimi--------------------------------------------------

DISPLEY_SEC_YAZ

   BSF   PORTA, 0   
   BCF   PORTA, 1   ;display seç '00'( DISPLAY 0)
   BCF   PORTA, 2   
   BCF   PORTA, 3           

   MOVF   binler, W
   CALL   TABLO
   MOVWF   PORTB      ;yüzleri port b ye gönder
   CALL    gecikme    ;displey gecikme süresi
   
   BCF   PORTA, 0   
   BSF   PORTA, 1   ;display seç '00'( DISPLAY 1)
   BCF   PORTA, 2   
   BCF   PORTA, 3           

   MOVF   yuzler, W
   CALL   TABLO
   MOVWF   PORTB      ;yüzleri port b ye gönder
   CALL    gecikme    ;displey gecikme süresi
       
   BCF   PORTA, 0   
   BCF   PORTA, 1   ;display seç '01'( DİSPLAY 2)
   BSF   PORTA, 2   
   BCF   PORTA, 3

   MOVF   onlar, W
   CALL   TABLO
   MOVWF   PORTB      ;onları port b ye gönder
   CALL    gecikme    ;displey gecikme süresi
       
   BCF   PORTA, 0   
   BCF   PORTA, 1   ;display seç '10'( DİSPLAY 3)
   BCF   PORTA, 2   
   BSF   PORTA, 3

   MOVF   birler, W
   CALL   TABLO
   MOVWF   PORTB      ;birleri port b ye gönder
   CALL    gecikme    ;displey gecikme süresi
           
   BCF   PORTA, 0   
   BCF   PORTA, 1   ;DİSP TEMİZLE
   BCF   PORTA, 2   
   BCF   PORTA, 3

   DECFSZ  SAYAC, F          ;sayac 00 olana kadar  ekranı göster
   GOTO    DISPLEY_SEC_YAZ   ;sayac 00 olana kadar GÖSTER
;   CALL    DİSPLAYSÖNME      ;sayac 00 oldu 
   GOTO    START             ;goto start git
               
;-----------------------------------------------------------
;------display ortak anot tablosu-----------------------------
TABLO
   ADDWF   PCL,F
   RETLW b'11000000' ; 0
   RETLW b'11111001' ; 1
   RETLW b'10100100' ; 2
   RETLW b'10110000' ; 3
   RETLW b'10011001' ; 4
   RETLW b'10010010' ; 5
   RETLW b'10000010' ; 6
   RETLW b'11111000' ; 7
   RETLW b'10000000' ; 8
   RETLW b'10010000' ; 9
;-------------------------------------------------------------
DİSPLAYSÖNME
        movlw   d'75'
        movwf   SAYAC1
dona1         
        movlw   d'75'
        movwf   SAYAC2
dona2
        movlw   d'75'
        movwf   SAYAC3
dona3         
        decfsz  SAYAC3,f
        goto    dona3
        decfsz  SAYAC2,f
        goto    dona2
        decfsz  SAYAC1,f
        goto    dona1 
        return
;-------------------------------------------------------------
gecikme
        movlw   d'20'
        movwf   SAYACA
don1
        movlw   d'20'
        movwf   SAYACB
don2
       

erhanzeynel

Porta.4 ü dış tetiklemeli TMR0 olarak sayıcı modunda kullanmanız gerekecek. Datasheetten tmr0 fonksiyonuna bakınız ki kendi yazdığınız komutlarla çalışmanız her zaman daha rahat olur.

100ms de bir ölçüm güzel bir yenileme hızı verir diye düşünüyorum. Bu yüzden Program 100 ms boyunca ekran alt programında kalmalı, ardından TMR0 yazacını bir değişkene taşıyıp TMR0 a 0 değerini atamalı (yoksa 255'i aşınca kesmeye girer) TMR0 değerine göre hızı hesaplayıp burdaki gösterge altprogramına tabi tutulmalı.

Başla
         TMR0 aktif
         TMR0 = 0
döngü1
         gösterge alt programı
         100 ms dolmadıysa goto döngü1
turtemp = TMR0
TMR0 = 0

Hız hesapla
goto dongu1

end

100ms hesaplanırken dongu1 den end e kadar yazılan tüm satırlar dikkate alınmalıdır.

Ön bölücü değeri en küçükte kalmalı, yanlış hatırlamıyorsam 1/1 mümkündü. Tabi 100 ms de 255 takla atan bir teker icad etmediyseniz.

Kolay gelsin.


selimkoc

Timer0 sayısı ile ilgili aşağıdaki bloğumda ayrıntılı bilgi var.

elektrokod.wordpress.com

Devir hesaplarken ayrıca bir timer (timer1) kurup her dakikada (veya saniyede) timer0 değerini okutman gerekecek.

Tagli

#3
TMR0'ın harici sayıcı olarak kullanılması mümkün değil. Yani kullanılabilir ama hızı hesaplayabilmek için zamanın da tutulması lazım. Maalesef 16F84'te sadece 1 sayaç var, bu durumda TMR0'ın sensör darbelerini değil zamanı sayıyor olması gerekiyor. Sensör darbeleri RB0 harici kesmesi ile de sayılabilir. Ayrıca, verilen sayısal değerlere göre tekerlek saniyede yaklaşık 8 tur ancak atabilir. Bence PIC mümkün olduğunca yavaşlatılmalı. 32.768 kHz'lik saat kristali ile çalıştırılması bence uygun olacaktır.
Gökçe Tağlıoğlu