10 bit adc den 4 basamaklı ondalık sayıya...

Başlatan Dagci-85, 29 Ağustos 2006, 16:49:33

Dagci-85

Merhaba

Arkadaşlar 16f877 de 10 bit adc den okuduğum değeri nasıl bir yol izleyerek 4 basamaklı bir sayı elde edebilirim? Program yazarken asm. kullanıyorum. Mesela adc den 11 11110110 diye bir sayı okudum. Ben bu sayıyı nasıl bir yol izleyerek dısplayde gosterebilirim? 8 bıt olarak dıspleyde gösterebiliyorum ama diğer iki bit de araya girince nasıl yapacağımı bulamadım. Bana bu konuda yol gösterebilecek arkadaşların yardımını bekliyorum. Nasıl bir algoritma kurmalıyım ? Herkese teşekkürler

Eagle_Tim

Öncelikle bu sayıyı mı displaylerde göstermek istiyorsun yoksa bu sayının ifade ettiği voltaj değerini mi ?
Software and Hardware Design...

Dagci-85

sayıyı displeyde göstermek istiyorum. Mesela 11 11110110 sayısını displeyde 1014 diye nasıl görebilirim? 8 bitini kullanarak gösterebiliyorum. Yani okuduğum değeri displeye uyarlamayı biliyorum.Tek sorunum üst iki biti kullanmayı bilememem. Üst iki biti işlemin içine nasıl katarım?

Dagci-85

Benim aklıma şöyle bişey yapmak geldi...

Şimdi ben alt 8 biti basamaklarına ayırsam mesela sayısal değerim 246 olsun. 1 ler kaydedicisine 2, onlar 4 yüzlere 6 ... Alt sekiz biti bu şekilde hallettik diyelim....üst iki biti xxxxxx11 olursa 3 adet 255 i, xxxxxx10 olursa ikitane 255 i , xxxxxx01 olursa da 1 tane 255 i  yani birlere , onlara, yüzlere sırasıyla 5,5,2 sayılarını eklesem her dokuzu aştığında da bir üst basamağı 1 arttırsam... olabilir mi?

profahmet

bu yazılımı yıllar önce yapmışıtım. sana kısaca nasıl yapılacağını açıklayım.
8 bitlik ADC kullanırken en düşük 2 bit kullanılmaz. 10 bitlik ADC de ise
en yüksek 2 bit başka bir yere yazılır . ilk 8 bit ADRESL dier 2bit ADRESH a yazılır.
önce ADRESL daki 8 bitlik sayıyının basamaklarını ayırıp her basamağı ayrı bir RAM e kaydet örneğin (2) , (5) , (4)sayısını ele alalım.
(2) , yüzler hanesi olsun (5) onlar , (4) birler.
daha sonra ADRESH daki ilk iki biti test edersin 0. bit lojik 1 ise
ilk 8 bitlik sayının basamaklarını 2,5,6 ile sırasıyla toplayacan ve artan sayıyı 4. basamağa ekleyecen.
daha sonra ADRESH daki 1. bit lojik 1 ise önceden işlem yaptığım basamaktaki sayıları 5,1,2 ile toplayacan aynı şekilde artan sayıyı 4. basamağa ekle. ADRESH daki bitlerin ilk 2 tanesinden biri lojik 0 ise yani 1.bit 0 ise 2,5,6 ile veya 2.bit 0 ise 5,1,2 ile toplamayacaksın.

kolay gelsin...

Dagci-85

Teşekkür ederim, anladım. Aynen öyle yapacağım. tekrar teşekkürler :)

fatihgns

http://www.dattalo.com/technical/software/pic/bcd.txt

movlw    B'01000001' ; A/D ayarı
   movwf    ADCON0
   BSF   STATUS,RP0  ; Bank 1
   MOVLW    B'10001110' ;AN0/RA0 analog channel, other PORTA digital,right just
   MOVWF    ADCON1
   MOVLW    B'00000001' ;RA0 input
   MOVWF    TRISA
   CLRF    TRISB
   CLRF    TRISC
   CLRF    TRISD
   BCF    STATUS,RP0  ; Bank 0
   CLRF   PORTB


don
   bsf    ADCON0,GO ; A/D cevirmeye başla
Wait
   btfss    PIR1,ADIF ;islem bitene kadar bekle
   goto    Wait
   movf    ADRESH,W ;yaz A/D sonuç to PORTB
   movwf   BH
   BSF   STATUS,RP0  ; Bank 1
   movf    ADRESL,W ;yaz A/D sonuç to PORTB
   BCF    STATUS,RP0  ; Bank 0
   movwf   BL

   MOVF   BL,w
   MOVWF   NumL
   MOVF   BH,w
   MOVWF   NumH
   CALL   BCD


   MOVF   TenK,w
   MOVWF   sayi+4   

   MOVF   Thou,w
   MOVWF   sayi+3   

   MOVF   Hund,w
   MOVWF   sayi+2

   MOVF   Tens,w
   MOVWF   sayi+1

   MOVF   Ones,w
   MOVWF   sayi

   goto   don


; Binary-to-BCD.  Written by John Payson.
;
; Enter with 16-bit binary number in NumH:NumL.
; Exits with BCD equivalent in TenK:Thou:Hund:Tens:Ones.
;

BCD            ; Takes number in NumH:NumL
                               ; Returns decimal in
                               ; TenK:Thou:Hund:Tens:Ones
       swapf   NumH,w
       andlw   0x0F             ;*** PERSONALLY, I'D REPLACE THESE 2
       addlw   0xF0             ;*** LINES WITH "IORLW 11110000B" -AW
       movwf   Thou
       addwf   Thou,f
       addlw   0xE2
       movwf   Hund
       addlw   0x32
       movwf   Ones

       movf    NumH,w
       andlw   0x0F
       addwf   Hund,f
       addwf   Hund,f
       addwf   Ones,f
       addlw   0xE9
       movwf   Tens
       addwf   Tens,f
       addwf   Tens,f

       swapf   NumL,w
       andlw   0x0F
       addwf   Tens,f
       addwf   Ones,f

       rlf     Tens,f
       rlf     Ones,f
       comf    Ones,f
       rlf     Ones,f

       movf    NumL,w
       andlw   0x0F
       addwf   Ones,f
       rlf     Thou,f

       movlw   0x07
       movwf   TenK


       movlw   0x0A                             ; Ten
Lb1:
       addwf   Ones,f
       decf    Tens,f
       btfss   3,0
        goto   Lb1
Lb2:
       addwf   Tens,f
       decf    Hund,f
       btfss   3,0
        goto   Lb2
Lb3:
       addwf   Hund,f
       decf    Thou,f
       btfss   3,0
        goto   Lb3
Lb4:
       addwf   Thou,f
       decf    TenK,f
       btfss   3,0
        goto   Lb4

       retlw   .0

END

Dagci-85