Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ADC ADRESH ve ADRESL

Başlatan ido2323, 05 Ocak 2015, 18:18:41

ido2323

ADRESH ve ADRESL  kayıtçılarına 10 bitlik değerin en büyük iki değeri ADRESH kayıtçısının 1. ve 0. bitine gelecek şekilde 660(decimal) değeri yazılmıştır. Bu değeri basamaklarına ayırıp onlar birler yüzler binler şeklinde LCD de gösterebilirim, fakat 18f4550'de bir kayıtçı 255 değerinden fazla alamaz.

Peki nasıl bir yol izlemeliyim? ne yapmalıyım?

Kabil ATICI

#1
bintodec çeviri örnekler var. Bunlar doğrudan 2 veya 3 baytlık değişkenin onluk sayı sistemine çeviriyor.
Buna benzen en son 24 bitlik bir sayı onluk sisteme çevirmiştim. (işlemci farklı)

http://www.piclist.com/techref/microchip/math/radix/b2bu-10b4d-eag.htm
şunu bir incele...

hatta başka örnekler istersen
http://www.piclist.com/techref/microchip/math/radix/index.htm
ambar7

ido2323

#2
teşekkürler ambar hocam, çok güzel anlatmış

mesaj birleştirme:: 05 Ocak 2015, 19:26:04

işte vitamin;
;Takes hex number in NumH:NumL  Returns decimal in ;TenK:Thou:Hund:Tens:Ones
;written by John Payson

;input
;=A3*163 + A2*162 + A1*161 + A0*160
;=A3*4096 + A2*256 + A1*16 + A0
NumH            EQU AD3M        ;A3*16+A2
NumL            EQU AD3L	;A1*16+A0
;share variables
;=B4*104 + B3*103 + B2*102 + B1*101 + B0*100
;=B4*10000 + B3*1000 + B2*100 + B1*10 + B0
TenK            EQU LOOPER      ;B4
Thou            EQU D2		;B3
Hund            EQU D1		;B2
Tens            EQU R2		;B1
Ones            EQU R1		;B0

	swapf	NumH,w	;w  = A2*16+A3
        andlw   0x0F     ;w  = A3		*** PERSONALLY, I'D REPLACE THESE 2
        addlw   0xF0	;w  = A3-16	*** LINES WITH "IORLW b'11110000B' " -AW
        movwf   Thou	;B3 = A3-16
        addwf   Thou,f	;B3 = 2*(A3-16) = 2A3 - 32
        addlw   .226	;w  = A3-16 - 30 = A3-46
        movwf   Hund	;B2 = A3-46
        addlw   .50	;w  = A3-46 + 50 = A3+4
        movwf   Ones	;B0 = A3+4

        movf    NumH,w	;w  = A3*16+A2
        andlw   0x0F	;w  = A2
        addwf   Hund,f	;B2 = A3-46 + A2 = A3+A2-46
        addwf   Hund,f	;B2 = A3+A2-46  + A2 = A3+2A2-46
        addwf   Ones,f	;B0 = A3+4 + A2 = A3+A2+4
        addlw   .233	;w  = A2 - 23
        movwf   Tens	;B1 = A2-23
        addwf   Tens,f	;B1 = 2*(A2-23)
        addwf   Tens,f	;B1 = 3*(A2-23) = 3A2-69 (Doh! thanks NG)

        swapf   NumL,w	;w  = A0*16+A1
        andlw   0x0F	;w  = A1
        addwf   Tens,f	;B1 = 3A2-69 + A1 = 3A2+A1-69 range -69...-9
        addwf   Ones,f	;B0 = A3+A2+4 + A1 = A3+A2+A1+4 and Carry = 0 (thanks NG)

        rlf     Tens,f	;B1 = 2*(3A2+A1-69) + C = 6A2+2A1-138 and Carry is now 1 as tens register had to be negitive
        rlf     Ones,f	;B0 = 2*(A3+A2+A1+4) + C = 2A3+2A2+2A1+9 (+9 not +8 due to the carry from prev line, Thanks NG)
        comf    Ones,f	;B0 = ~(2A3+2A2+2A1+9) = -2A3-2A2-2A1-10 (ones complement plus 1 is twos complement. Thanks SD)
;;Nikolai Golovchenko [golovchenko at MAIL.RU] says: comf can be regarded like:
;;      comf Ones, f
;;      incf Ones, f
;;      decf Ones, f
;;First two instructions make up negation. So,
;;Ones  = -1 * Ones - 1 
;;      = - 2 * (A3 + A2 + A1) - 9 - 1 
;;      = - 2 * (A3 + A2 + A1) - 10
        rlf     Ones,f	;B0 = 2*(-2A3-2A2-2A1-10) = -4A3-4A2-4A1-20

        movf    NumL,w	;w  = A1*16+A0
        andlw   0x0F	;w  = A0
        addwf   Ones,f	;B0 = -4A3-4A2-4A1-20 + A0 = A0-4(A3+A2+A1)-20 range -215...-5 Carry=0
        rlf     Thou,f	;B3 = 2*(2A3 - 32) = 4A3 - 64

        movlw   0x07	;w  = 7
        movwf   TenK	;B4 = 7

;B0 = A0-4(A3+A2+A1)-20	;-5...-200
;B1 = 6A2+2A1-138	;-18...-138
;B2 = A3+2A2-46		;-1...-46
;B3 = 4A3-64		;-4...-64
;B4 = 7			;7
; At this point, the original number is
; equal to TenK*10000+Thou*1000+Hund*100+Tens*10+Ones 
; if those entities are regarded as two's compliment 
; binary.  To be precise, all of them are negative 
; except TenK.  Now the number needs to be normal- 
; ized, but this can all be done with simple byte 
; arithmetic.

        movlw   .10	;w  = 10
Lb1:			;do
        addwf   Ones,f	; B0 += 10
        decf    Tens,f	; B1 -= 1
        btfss   3,0
	;skip no carry
         goto   Lb1	; while B0 < 0
	;jmp carry
Lb2:			;do
        addwf   Tens,f	; B1 += 10
        decf    Hund,f	; B2 -= 1
        btfss   3,0
         goto   Lb2	; while B1 < 0
Lb3:			;do
        addwf   Hund,f	; B2 += 10
        decf    Thou,f	; B3 -= 1
        btfss   3,0
         goto   Lb3	; while B2 < 0
Lb4:			;do
        addwf   Thou,f	; B3 += 10
        decf    TenK,f	; B4 -= 1
        btfss   3,0
         goto   Lb4	; while B3 < 0

        retlw   0

sayment

unsigned int degisken;
degisken = ((ADRESH<<8)+ADRESL);

RaMu

Alıntı yapılan: sayment - 05 Ocak 2015, 20:30:10
unsigned int degisken;
degisken = ((ADRESH<<8)+ADRESL);


Konu ASM.

------------------------------------------------------

Daha önce sanada kodlarını gönderdiğim
aşağıdaki linkde bahsettiğim gibide yapabilirsin,
istersen 32 64 128 bit sayı için olan versiyonlarınıda aynı mantıkla yazabilirsin
ve çok kullanışlı bir algoritmadır;
https://www.picproje.org/index.php/topic,54453.msg416026.html#msg416026
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sayment


ido2323

#6
Hayırlı akşamlar hocam 2 baytlık sayıyı 5 digit ile ayırdım sıkıntı yok on numara çalışıyor. Birler, onlar, yüzler, binler ve onbinler şeklinde 0-9 a kadar sayı alacak şekilde lm35 den gelen veriyi okuyor fakat ufak bir sıkıntım var bunları karakter lcd de göstermek için nasıl bir çevrim yapmalıyım? örnek;

"birler" değişkeninin 00000001 buluyorum; lcd de göstermek için 00110001 formuna çevirmeliyim.

Bu işin bir püf noktası var mı?

birde bu pic serisinde bölme ve çarpma işlemlerini anlatan bir kaç örnek lazım varsa memnun olurum, teşekkürler

Kabil ATICI

0x30 ile topla (sıfır sayısının ASCII karşılığı)
ambar7

ido2323

Ellerinize sağlık buda tamam sıra rotary encoder