اطلاعیه

Collapse
No announcement yet.

تحلیل برنامه ی اسمبلی فاصله یاب التراسونیک

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    تحلیل برنامه ی اسمبلی فاصله یاب التراسونیک

    Ultrasonic Range Meter
    برنامه زیر برنامه اسمبلی یک فاصله یاب الترا سونیک توسط میکرو pic نوع pic16f873 میباشد کی میتونه خط به خط این برنامه رو برام توضیح بده / بسیار ممنون میشم چون اسمبلی کار نکردم ولی این پروژه رو برداشتم که با اسمبلی هست

    
    کد:
    Device : PIC16F873
    Author : Seiichi Inoue
    ……………………………………………………………………………………………………………………………………………
    list p=pic16f873
    include p16f873.inc
    config _hs_osc & _wdt_off & _pwrte_on & _lvp_off
    errorlevel -302 ;Suppress bank warning
    ……………………………………………………Label Definition…………………………………………
    cblock h'20
    s_count ;Send-out pulse count adr
    s_adj ;Adjustment data address
    37
    s_adj_count ;Rotate value save adr
    s_digit ;Digit cont work address
    g_time1 ;Guard timer address 1
    g_time2 ;Guard timer address 2
    p_countl ;Propagation L cnt adr
    p_counth ;Propagation H cnt adr
    digit_cnt ;Digit counter head adr
    disp_ha ;Digit head address
    disp_u ;1st digit address
    disp_t ;10th digit address
    disp_h ;100th digit address
    seg7_ha ;7 segLED table head adr
    seg70 ;Pattern 0 set adr
    seg71 ;Pattern 1 set adr
    seg72 ;Pattern 2 set adr
    seg73 ;Pattern 3 set adr
    seg74 ;Pattern 4 set adr
    seg75 ;Pattern 5 set adr
    seg76 ;Pattern 6 set adr
    seg77 ;Pattern 7 set adr
    seg78 ;Pattern 8 set adr
    seg79 ;Pattern 9 set adr
    seg7a ;Pattern A set adr
    seg7b ;Pattern B set adr
    endc
    38
    ra1 equ h'01' ;RA1 port designation
    ra2 equ h'02' ;RA2 port designation
    ra3 equ h'03' ;RA3 port designation
    ra5 equ h'05' ;RA5 port designation
    ccp1 equ h'02' ;CCP1(RC2) designation
    seg7_0 equ b'01000000' ;-gfedcba Pattern 0
    seg7_1 equ b'01111001' ; Pattern 1
    seg7_2 equ b'00100100' ; Pattern 2
    seg7_3 equ b'00110000' ; Pattern 3
    seg7_4 equ b'00011001' ; Pattern 4
    seg7_5 equ b'00010010' ; Pattern 5
    seg7_6 equ b'00000010' ; Pattern 6
    seg7_7 equ b'01111000' ; Pattern 7
    seg7_8 equ b'00000000' ; Pattern 8
    seg7_9 equ b'00010000' ; Pattern 9
    seg7_a equ b'01111111' ; Detect error
    seg7_b equ b'00100011' ; Illegal int
    ……………………………………………………………Program Start…………………………………………
    org 0 ;Reset Vector
    goto init
    org 4 ;Interrupt Vector
    goto int
    39
    ………………………………………………………Initial Process…………………………………………
    init
    Port initialization………
    bsf status,rp0 ;Change to Bank1
    movlw b'00000001' ;AN0 to input mode
    movwf trisa ;Set TRISA register
    clrf trisb ;RB port to output mode
    movlw b'00000100' ;RC2/CCP1 to input mode
    movwf trisc ;Set TRISC register
    sUltrasonic sending period initialization (Timer0………
    movlw b'11010111' ;T0CS=0,PSA=0,PS=1:256
    movwf option_reg ;Set OPTION_REG register
    bcf status,rp0 ;Change to Bank0
    clrf tmr0 ;Clear TMR0 register
    sCapture mode initialization (Timer1………
    movlw b'00000001' ;Pre=1:1 TMR1=Int TMR1=ON
    movwf t1con ;Set T1CON register
    clrf ccp1con ;CCP1 off
    A/D converter initialization………
    movlw b'01000001' ;ADCS=01 CHS=AN0 ADON=ON
    40
    movwf adcon0 ;Set ADCON0 register
    bsf status,rp0 ;Change to Bank1
    movlw b'00001110' ;ADFM=0 PCFG=1110
    movwf adcon1 ;Set ADCON1 register
    bcf status,rp0 ;Change to Bank0
    sDisplay initialization (Timer2………
    movlw disp_u ;Set digit head address
    movwf disp_ha ;Save digit head sddress
    movlw h'0a' ;"Detect error" data
    movwf disp_u ;Set 1st digit
    movwf disp_t ;Set 10th digit
    movwf disp_h ;Set 100th digit
    movlw d'3' ;Digit counter
    movwf digit_cnt ;Set digit counter
    movlw seg70 ;Set 7seg head address
    movwf seg7_ha ;Save 7seg head address
    movlw seg7_0 ;Set 7segment pattern 0
    movwf seg70 ;Save pattern 0
    movlw seg7_1 ;Set 7segment pattern 1
    movwf seg71 ;Save pattern 1
    movlw seg7_2 ;Set 7segment pattern 2
    movwf seg72 ;Save pattern 2
    movlw seg7_3 ;Set 7segment pattern 3
    movwf seg73 ;Save pattern 3
    movlw seg7_4 ;Set 7segment pattern 4
    41
    movwf seg74 ;Save pattern 4
    movlw seg7_5 ;Set 7segment pattern 5
    movwf seg75 ;Save pattern 5
    movlw seg7_6 ;Set 7segment pattern 6
    movwf seg76 ;Save pattern 6
    movlw seg7_7 ;Set 7segment pattern 7
    movwf seg77 ;Save pattern 7
    movlw seg7_8 ;Set 7segment pattern 8
    movwf seg78 ;Save pattern 8
    movlw seg7_9 ;Set 7segment pattern 9
    movwf seg79 ;Save pattern 9
    movlw seg7_a ;Set 7segment pattern A
    movwf seg7a ;Save pattern A
    movlw seg7_b ;Set 7segment pattern B
    movwf seg7b ;Save pattern B
    movlw b'00011110' ;OPS=1:4,T2=ON,EPS=1:16
    movwf t2con ;Set T2CON register
    bsf status,rp0 ;Change to Bank1
    movlw d'157' ;157x64=10048usec
    movwf pr2 ;Set PR2 register
    bsf pie1,tmr2ie ;TMR2IE=ON
    bcf status,rp0 ;Change to Bank0
    Interruption control………
    movlw b'11100000' ;GIE=ON,PEIE=ON,T0IE=ON
    42
    movwf intcon ;Set INTCON register
    wait
    goto $ ;Interruption wait
    ……………………………………………Interruption Process………………………………………
    int
    movfw pir1 ;Read PIR1 register
    btfsc pir1,ccp1if ;Capture occurred
    goto capture ;Yes. "Capture
    btfsc pir1,tmr2if ;TMR2 time out
    goto led_cont ;Yes. "LED display
    movfw intcon ;Read INTCON register
    btfsc intcon,t0if ;TMR0 time out
    goto send ;Yes. "Pulse send
    ……………………………………………Illegal interruption………………………………………
    illegal
    movlw h'0b' ;Set Illegal disp digit
    addwf seg7_ha,w ;Seg7 H.Adr + digit
    movwf fsr ;Set FSR register
    movfw indf ;Read seg7 data
    movwf portb ;Write LED data
    bcf porta,ra1 ;RA1=ON
    bcf porta,ra2 ;RA2=ON
    bcf porta,ra3 ;RA3=ON
    43
    goto $ ;Stop
    ……………………………………END of Interruption Process………………………………
    int_end
    retfie
    …………………………………………Pulse send-out Process………………………………………
    send
    bcf intcon,t0if ;Clear TMR0 int flag
    clrf tmr0 ;Timer0 clear
    Received Pulse detection check………
    movfw portc ;Read PORTC register
    btfsc portc,ccp1 ;Detected
    goto detect_off ;Yes. Detected
    movlw h'0a' ;"Detect error" data
    movwf disp_u ;Set 1st digit
    movwf disp_t ;Set 10th digit
    movwf disp_h ;Set 100th digit
    Receive pulse detector off………
    detect_off
    bcf porta,ra5 ;Set detector OFF
    44
    Capture start………
    clrf tmr1h ;Clear TMR1H register
    clrf tmr1l ;Clear TMR1L register
    clrf ccpr1h ;Clear CCPR1H register
    clrf ccpr1l ;Clear CCPR1L register
    smovlw b'00000101' ;CCP1M=0101(Capture
    movwf ccp1con ;Set CCP1CON register
    bsf status,rp0 ;Change to Bank1
    bsf pie1,ccp1ie ;CCP1 interruptin enable
    bcf status,rp0 ;Change to Bank0
    bcf pir1,ccp1if ;Clear CCP1 int flag
    sKHz pulse send ( 0.5 msecij………
    movlw d'20' ;Send-out pulse count
    movwf s_count ;Set count
    s_loop
    call pulse ;Call pulse send sub
    decfsz s_count,f ;End
    goto s_loop ;No. Continue
    Get adjustment data………
    bsf adcon0,go ;Start A/D convert
    ad_check
    btfsc adcon0,go ;A/D convert end
    goto ad_check ;No. Again
    45
    movfw adresh ;Read ADRESH register
    movwf s_adj ;Save converted data
    movlw d'5' ;Set rotate value
    movwf s_adj_count ;Save rotate value
    ad_rotate
    rrf s_adj,f ;Rotate right 1 bit
    decfsz s_adj_count,f ;End
    goto ad_rotate ;No. Continue
    movfw s_adj ;Read rotated value
    andlw b'00000111' ;Pick-up 3 bits
    addlw d'54' ;(0 to 7) + 54 = 54 to 61
    movwf s_adj ;Save adjustment data
    sCapture guard timer ( 1 milisecound………
    movlw d'2' ;Set loop counter1
    movwf g_time1 ;Save loop counter1
    g_loop1 movlw d'124' ;Set loop counter2
    movwf g_time2 ;Save loop counter2
    g_loop2 nop ;Time adjust
    decfsz g_time2,f ;g_time2 - 1 = 0
    goto g_loop2 ;No. Continue
    decfsz g_time1,f ;g_time1 - 1 = 0
    goto g_loop1 ;No. Continue
    Receive pulse detector on………
    46
    bsf porta,ra5 ;Set detector ON
    goto int_end
    …………………………………………Pulse send-out Process………………………………………
    pulse
    movlw b'00010000' ;RC4=ON
    movwf portc ;Set PORTC register
    call t12us ;Call 12usec timer
    clrf portc ;RC4=OFF
    goto $+1
    goto $+1
    nop
    return
    ……………………………………………microseconds timerwx………………………………………
    t12us
    goto $+1
    goto $+1
    goto $+1
    goto $+1
    nop
    return
    ……………………………………………………Capture Process………………………………………………
    47
    capture
    bcf pir1,ccp1if ;Clear CCP1 int flag
    clrf p_countl ;Clear L count
    clrf p_counth ;Clear H count
    clrf ccp1con ;CCP1 off
    division
    movfw s_adj ;Read adjustment data
    subwf ccpr1l,f ;Capture - adjust
    btfsc status,z ;Result = 0
    goto division2 ;Yes. "R = 0
    btfsc status,c ;Result < 0
    goto division1 ;No. "R > 0
    goto division3 ;Yes."R < 0
    sdivision1 ;( R > 0
    movlw d'1' ;Set increment value
    addwf p_countl,f ;Increment L count
    btfss status,c ;Overflow
    goto division ;No. Continue
    incf p_counth,f ;Increment H count
    goto division ;Jump next
    sdivision2 ;( R = 0
    movfw ccpr1h ;Read CCPR1H
    48
    btfss status,z ;CCPR1H = 0
    goto division1 ;No. Next
    movlw d'1' ;Set increment value
    addwf p_countl,f ;Increment L count
    btfss status,c ;Overflow
    goto digit_set ;Jump to digit set
    incf p_counth,f ;Increment H count
    goto digit_set ;Jump to digit set
    sdivision3 ;( R < 0
    movfw ccpr1h ;Read CCPR1H
    btfss status,z ;CCPR1H = 0
    goto division4 ;No. Borrow process
    goto digit_set ;Jump to digit set
    division4
    decf ccpr1h,f ;CCPR1H - 1
    movlw d'255' ;Borrow value
    addwf ccpr1l,f ;CCPR1L + 255
    incf ccpr1l,f ;CCPR1L + 1
    goto division1 ;Next
    ……………………………………………………Digit Set Process…………………………………………
    digit_set
    clrf disp_u ;Clear 1st digit
    clrf disp_t ;Clear 10th digit
    49
    clrf disp_h ;Clear 100th digit
    th digitwjj………
    digit_h
    movlw d'100' ;Divide value
    subwf p_countl,f ;Digit - divide
    btfsc status,z ;Result = 0
    goto digit_h2 ;Yes. "R = 0
    btfsc status,c ;Result < 0
    goto digit_h1 ;No. "R > 0
    goto digit_h3 ;Yes."R < 0
    sdigit_h1 ;( R > 0
    incf disp_h,f ;Increment 100th count
    goto digit_h ;Jump next
    sdigit_h2 ;( R = 0
    movfw p_counth ;Read H counter
    btfss status,z ;H counter = 0
    goto digit_h1 ;No. Next
    incf disp_h,f ;Increment 100th count
    goto digit_t ;Jump to 10th digit pro
    sdigit_h3 ;( R < 0
    movfw p_counth ;Read H counter
    50
    btfss status,z ;H counter = 0
    goto digit_h4 ;No. Borrow process
    movlw d'100' ;Divide value
    addwf p_countl,f ;Return over sub value
    goto digit_t ;Jump to 10th digit pro
    digit_h4
    decf p_counth,f ;H counter - 1
    movlw d'255' ;Borrow value
    addwf p_countl,f ;L counter + 255
    incf p_countl,f ;L counter + 1
    goto digit_h1 ;Next
    th digitwj………
    digit_t
    Range over check………
    movfw disp_h ;Read 100th digit
    ssublw d'9' ;9 - (100th digit
    btfsc status,z ;Result = 0
    goto digit_t0 ;Yes. "R = 0
    btfsc status,c ;Result < 0
    goto digit_t0 ;No. "R > 0
    movlw h'0a' ;"Detect error" data
    movwf disp_u ;Set 1st digit
    51
    movwf disp_t ;Set 10th digit
    movwf disp_h ;Set 100th digit
    goto int_end
    digit_t0
    movlw d'10' ;Divide value
    subwf p_countl,f ;Digit - divide
    btfsc status,z ;Result = 0
    goto digit_t1 ;Yes. "R = 0
    btfsc status,c ;Result < 0
    goto digit_t1 ;No. "R > 0
    goto digit_t2 ;Yes."R < 0
    sdigit_t1 ;( R >= 0
    incf disp_t,f ;Increment 10th count
    goto digit_t ;Jump next
    sdigit_t2 ;( R < 0
    movlw d'10' ;Divide value
    addwf p_countl,f ;Return over sub value
    goto digit_u ;Jump to 1st digit pro
    st digitw………
    digit_u
    movfw p_countl ;Read propagetion counter
    52
    movwf disp_u ;Save 1st count
    goto int_end
    ……………………………………………LED display control…………………………………………
    led_cont
    bcf pir1,tmr2if ;Clear TMR2 int flag
    movfw digit_cnt ;Read digit counter
    movwf s_digit ;Save digit counter
    decfsz s_digit,f ;1st digit
    goto d_check1 ;No. Next
    bsf porta,ra1 ;RA1=OFF
    bsf porta,ra2 ;RA2=OFF
    bcf porta,ra3 ;RA3=ON
    goto c_digit ;Jump to digit cont
    d_check1
    decfsz s_digit,f ;10th digit
    goto d_check2 ;No. 100th digit
    bsf porta,ra1 ;RA1=OFF
    bcf porta,ra2 ;RA2=ON
    bsf porta,ra3 ;RA3=OFF
    goto c_digit ;Jump to digit cont
    d_check2
    bcf porta,ra1 ;RA1=ON
    bsf porta,ra2 ;RA2=OFF
    53
    bsf porta,ra3 ;RA3=OFF
    c_digit
    decf digit_cnt,w ;Digit count - 1
    addwf disp_ha,w ;Digit H.Adr + count
    movwf fsr ;Set FSR register
    movfw indf ;Read digit
    addwf seg7_ha,w ;Seg7 H.Adr + digit
    movwf fsr ;Set FSR register
    movfw indf ;Read seg7 data
    movwf portb ;Write LED data
    decfsz digit_cnt,f ;Digit count - 1
    goto int_end ;Jump to interrupt end
    movlw d'3' ;Initial value
    movwf digit_cnt ;Set initial value
    goto int_end ;Jump to interrupt end
    ……………………………………………………………………………………………………………………………………………
    END of Ultrasonic Range Meter
    ……………………………………………………………………………………………………………………………………………
    end

    #2
    پاسخ : تا حالا با اسمبلی و کلا با pic کار نکردم ایا میتونم این پروژه رو بسازم و بفهمم؟

    به جاش تا دلت بخواد من با اسمبلی کار کردم
    فقط برادر من یه خورده بیشتر در مورد سنسورت توضیح بده تا منم بتونم کمکت کنم
    مثلا کدوم پین آی سی رو به کدوم قسمت سنسور دوست داری بزنی - خودت می خوای از چه آی سی ای استفاده بنماییpic16f877 هم بهتره و هم راحت تر گیر میاد و سنسور انتخابیت چطور کار می کنه و ...
    ***
    من ول کردم، می خوام ببینم که شما هم ول می کنین یا نه!

    دیدگاه


      #3
      پاسخ : تا حالا با اسمبلی و کلا با pic کار نکردم ایا میتونم این پروژه رو بسازم و بفهمم؟

      سلام مهندس از این لینک پروژه رو دانلود کردم:
      http://elecdl.com/electronic/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%BE%D8%A7%DB%8C%D8%A7%D9%86-%D9%86%D8%A7%D9%85%D9%87-%D9%81%D8%A7%D8%B5%D9%84%D9%87-%D8%B3%D9%86%D8%AC-%D8%A7%D9%88%D9%84%D8%AA/

      دیدگاه


        #4
        پاسخ : تا حالا با اسمبلی و کلا با pic کار نکردم ایا میتونم این پروژه رو بسازم و بفهمم؟

        نوشته اصلی توسط amin7023
        سلام مهندس از این لینک پروژه رو دانلود کردم:
        http://elecdl.com/electronic/%D8%AF%D8%A7%D9%86%D9%84%D9%88%D8%AF-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D9%BE%D8%A7%DB%8C%D8%A7%D9%86-%D9%86%D8%A7%D9%85%D9%87-%D9%81%D8%A7%D8%B5%D9%84%D9%87-%D8%B3%D9%86%D8%AC-%D8%A7%D9%88%D9%84%D8%AA/
        خوب
        اولین کاری که باید بکنی اینه که سسه تا پورت برای نمایش فاصله کنار بذاری
        اگر از 877 استفاده می کنی، از پورتای b c d استفاده کن.
        فرض می کنیم که خروجی سنسورت کاملا درست کار می کنه و نیازی به رگولیت کردن نداره(اگر نیاز داشته باشه هم سخت افزاری می تونی درستش کنی و هم با برنامه آی سی)
        حالا به یه برنامه نیاز داری که ورودی آنالوگ 10 بیتی میکرو رو به یه عدد سه تا بایت مجزا تبدیل کنه تا بتونی نمایش بدی.
        البته با یه پتانسیومتر باید خروجی سنسور رو طوری تنظیم بکنی که عدد مبدل آنالوگت یه نسبت ده تایی با واحد طول مورد نظرت داشته باشه
        مثلا 1024 = 10.24m به صورت تقریبی مییشه این کار رو انجام داد.
        یه تابع احتیاج داری که عدد بین 0 تا 9 موجود در اون سه بایتی رو که گفتم رو به فرمت سون سگمنت تبدیل کنه. دونه به دونه این عملیات رو به صورت دستی باید بنویسی، در ادامه توضیح می دم.
        پس تا اینجا شد که عدد وارد میشه، دو تا بایت مربوط به adc با تابع تبدیل به سه تا بایت میشه که هرکدوم یه عدد بین 0 تا 9 رو دارن، مثل این مثال:
        ADC Registery:00000000-00001001 --> 000000000-00000001-00000111
        تو مثال بالا، ارقام عدد 17 از هم جدا شدن، برای این کار باید صد تا صد تا اول از عدد کم کنی تا کمتر از ضد بشه و تعداد مراحلت رو تو بایت صدگان بریزی و باقیمانده رو ازش ده تا ده تا کم کنی و تعداد مراحل در بایت دهگان و باقیمانده در بایت یکان - برای کم کردن صد تا صد تا از دستور زیر:
        clrf 0x7e ;sadgan
        ;repeated 9 times;;;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;;2;;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;3;;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;;4;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;;5;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;;6;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;;7;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;;8;;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ;;;;;;;;;9;;;;;;;;
        bsf status,5
        movlw 100
        subwf ADRESL
        btfsc STATUS,0
        call f1
        ------------------------------------
        f1:
        bcf status,5
        incf ADRESH
        decsfz ADRESH
        goto f1_1
        return
        f1_1:
        incf 0x7e
        dec ADRESH
        bsf status,5
        addwf ADRESL
        RETURN

        خوب
        غول کار همین بود که همش ه تکرار شده بود
        حالا داخلADRESL اون باقیمانده هست که باز هم به همین صورت دهگان رو محاسبه می کنی، چون فقط یه رجیستر داری کار خیلی راحت تره و بعد هم یکان
        فعلا همین رو هضم کنید تا به ادامش برسیم
        موفق باشید
        ***
        من ول کردم، می خوام ببینم که شما هم ول می کنین یا نه!

        دیدگاه


          #5
          پاسخ : تا حالا با اسمبلی و کلا با pic کار نکردم ایا میتونم این پروژه رو بسازم و بفهمم؟

          ممنون
          :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow: :wow:

          دیدگاه


            #6
            پاسخ : تا حالا با اسمبلی و کلا با pic کار نکردم ایا میتونم این پروژه رو بسازم و بفهمم؟

            نوشته اصلی توسط x.m.k
            خوب
            اولین کاری که باید بکنی اینه که سسه تا پورت برای نمایش فاصله کنار بذاری
            اگر از 877 استفاده می کنی، از پورتای b c d استفاده کن.
            فرض می کنیم که خروجی سنسورت کاملا درست کار می کنه و نیازی به رگولیت کردن نداره(اگر نیاز داشته باشه هم سخت افزاری می تونی درستش کنی و هم با برنامه آی سی)
            حالا به یه برنامه نیاز داری که ورودی آنالوگ 10 بیتی میکرو رو به یه عدد سه تا بایت مجزا تبدیل کنه تا بتونی نمایش بدی.
            البته با یه پتانسیومتر باید خروجی سنسور رو طوری تنظیم بکنی که عدد مبدل آنالوگت یه نسبت ده تایی با واحد طول مورد نظرت داشته باشه
            مثلا 1024 = 10.24m به صورت تقریبی مییشه این کار رو انجام داد.
            یه تابع احتیاج داری که عدد بین 0 تا 9 موجود در اون سه بایتی رو که گفتم رو به فرمت سون سگمنت تبدیل کنه. دونه به دونه این عملیات رو به صورت دستی باید بنویسی، در ادامه توضیح می دم.
            پس تا اینجا شد که عدد وارد میشه، دو تا بایت مربوط به adc با تابع تبدیل به سه تا بایت میشه که هرکدوم یه عدد بین 0 تا 9 رو دارن، مثل این مثال:
            ADC Registery:00000000-00001001 --> 000000000-00000001-00000111
            تو مثال بالا، ارقام عدد 17 از هم جدا شدن، برای این کار باید صد تا صد تا اول از عدد کم کنی تا کمتر از ضد بشه و تعداد مراحلت رو تو بایت صدگان بریزی و باقیمانده رو ازش ده تا ده تا کم کنی و تعداد مراحل در بایت دهگان و باقیمانده در بایت یکان - برای کم کردن صد تا صد تا از دستور زیر:
            clrf 0x7e ;sadgan
            ;repeated 9 times;;;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;;2;;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;3;;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;;4;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;;5;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;;6;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;;7;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;;8;;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ;;;;;;;;;9;;;;;;;;
            bsf status,5
            movlw 100
            subwf ADRESL
            btfsc STATUS,0
            call f1
            ------------------------------------
            f1:
            bcf status,5
            incf ADRESH
            decsfz ADRESH
            goto f1_1
            return
            f1_1:
            incf 0x7e
            dec ADRESH
            bsf status,5
            addwf ADRESL
            RETURN

            خوب
            غول کار همین بود که همش ه تکرار شده بود
            حالا داخلADRESL اون باقیمانده هست که باز هم به همین صورت دهگان رو محاسبه می کنی، چون فقط یه رجیستر داری کار خیلی راحت تره و بعد هم یکان
            فعلا همین رو هضم کنید تا به ادامش برسیم
            موفق باشید
            سلام دوست عزیز
            شما میتونید از یک ساب روتین تقسیم استفاده کنید و کار رو خیلی ساده تر کنید ، هم برای خودتون هم برای CPU ، لینک زیر یک تقسیم 16 بیتی است که آقای طراح در فروم AVR گذاشته بودند ، من زبان اسمبلی AVR رو به PIC تبدیل کردم و خیلی هم خوب کار میکنه ، وقت CPU رو کمتر میگیره ، چون من با 35 دستور PIC16 تبدیلش کردم توPIC16,18,12 میشه ازش استفاده کرد اگه خواستی بگو تا 8 بیتی و 32 بیتی اش رو هم بذارم
            http://s3.picofile.com/file/7667721177/div16.txt.html

            Good Luck

            دیدگاه


              #7
              پاسخ : تا حالا با اسمبلی و کلا با pic کار نکردم ایا میتونم این پروژه رو بسازم و بفهمم؟

              متشکرم

              دیدگاه

              لطفا صبر کنید...
              X