¾Ç¼º ±¤°í °Ô½Ã¹° ´ëÃ¥ÀÌ °­±¸µÉ ¶§±îÁö ÀϽà Áß´ÜÇÕ´Ï´Ù

2001/11/28 (12:43) from 128.134.56.194' of 128.134.56.194' Article Number : 3499
Delete Modify Ãʺ¸°ø´ë»ý (nmania@gwu.ac.kr) Access : 3630 , Lines : 455
¿Ö ÄÄÆÄÀÏÀÌ ¾ÈµÉ±î¿ä..?(mplab¿¡¼­¿ä)
picóÀ½ »ç¿ëÀÚ ÀÔ´Ï´Ù.
¹°·Ð mplabµµ ÷À¸·Î »ç¿ëÇØ ºÃ±¸¿ä.
picf873À¸·Î ¼¼±×¸àÆ® Á¦¾î Çϴ°ǵ¥ ÇÁ·Î±×·¥ ¼Ò½º¸¦ ´Ù¿î ¹Þ¾Ò´Âµ¥  ÀÌ»óÇÏ°Ô ¿¡·¯¸¸ ¶ß³×¿ä.. µµÀúÈ÷ ¾Ë ¼ö °¡ ¾ø½À´Ï´Ù.
¿°Ä¡ºÒ±¸Çϱ¸ ¼Ò½ºÄڵ带 ¿Ã¸³´Ï´Ù.
±×·³.. Á¦¹ß¿ä.. ¹°¾îº¼ ¼±¹èµµ ¾ø°í ³Ê¹« ´ä´äÇÕ´Ï´Ù..TOT
;********************************************************
;
;                 Ultrasonic Range Meter
;
;                                 Divice : PIC16F873
;                                 Author : Seiichi Inoue
;********************************************************

       list            p=pic16f873
       include         p16f873.inc
      __config _hs_osc & _wdt_off & _pwrte_on & _lvp_off

;****************  Label Definition  ********************
       cblock  h'20'
s_count                         ;Send-out pulse count adr
s_adj                           ;Adjustment data address
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

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

;****************  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

;*** Ultrasonic 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

;*** Capture 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
       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

;*** Display 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
       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
       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
       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

;*** Capture start
       clrf    tmr1h           ;Clear TMR1H register
       clrf    tmr1l           ;Clear TMR1L register
       clrf    ccpr1h          ;Clear CCPR1H register
       clrf    ccpr1l          ;Clear CCPR1L register
       movlw   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

;*** 40KHz pulse send ( 0.5 msec )
       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
       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

;*** Capture 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
       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

;***************  12 microseconds timer *****************
t12us
       goto   $+1
       goto   $+1
       goto   $+1
       goto   $+1
       nop
       return

;******************  Capture Process ********************
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"

division1                       ;( 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

division2                       ;( R = 0 )
       movfw   ccpr1h          ;Read CCPR1H
       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

division3                       ;( 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
       clrf    disp_h          ;Clear 100th digit

;*** 100th digit
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"

digit_h1                        ;( R > 0 )
       incf    disp_h,f        ;Increment 100th count
       goto    digit_h         ;Jump next

digit_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

digit_h3                        ;( R < 0 )
       movfw   p_counth        ;Read H counter
       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

;*** 10th digit
digit_t

;*** Range over check
       movfw   disp_h          ;Read 100th digit
       sublw   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
       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_u         ;Yes. "R = 0"
       btfsc   status,c        ;Result < 0 ?
       goto    digit_t1        ;No. "R > 0"
       goto    digit_t2        ;Yes."R < 0"

digit_t1                        ;( R > 0 )
       incf    disp_t,f        ;Increment 10th count
       goto    digit_t         ;Jump next

digit_t2                        ;( R < 0 )
       movlw   d'10'           ;Divide value
       addwf   p_countl,f      ;Return over sub value
       goto    digit_u         ;Jump to 1st digit pro

;*** 1st digit
digit_u
       movfw   p_countl        ;Read propagetion counter
       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
       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




Backward Forward Post Reply List
Untitled

±¹Á¦Å×Å©³ëÁ¤º¸¿¬±¸¼Ò
info@ktechno.co.kr