Autor Tema: modificar medidor de distancia ultrasonico  (Leído 3067 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado luarken

  • PIC10
  • *
  • Mensajes: 28
modificar medidor de distancia ultrasonico
« en: 31 de Marzo de 2008, 04:27:33 »
hola a todos tengo un problemita

necesito contruir un detector de nivel para tanque de agua

y kiero que a cierto nivel bajo ensienda una bomba y cuando este lleno este se apaque,

tengo el programa de lo que es un medidor de distancia


pero quiero ver si me ayudan para agregarle codigo para hacer esas interrupciones !!


gracias



;********************************************************
;
;          Ultrasonic Range Meter Version 2
;
;                                 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 time counter
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

;*** Pulse sending ( 0.5 msec )
        bsf     portc,4         ;Start sending
        movlw   d'100'          ;Set send-out timer
        movwf   s_count         ;Set count
s_loop
        nop                     ;Time adjust
        nop                     ;Time adjust
        decfsz  s_count,f       ;End ?
        goto    s_loop          ;No. Continue
        bcf     portc,4         ;Stop sending

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

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

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: modificar medidor de distancia ultrasonico
« Respuesta #1 en: 31 de Marzo de 2008, 05:13:03 »
necesito contruir un detector de nivel para tanque de agua
y kiero que a cierto nivel bajo ensienda una bomba y cuando este lleno este se apaque,
tengo el programa de lo que es un medidor de distancia
pero quiero ver si me ayudan para agregarle codigo para hacer esas interrupciones !!

Hola buenos dias, segun sus necesidades no veo la necesidad de usar un medidor de distancia por ultrasonico solo le bastaria con 2 sensores uno para indicar el nivel bajo y otro para el nivel alto y cuando el nivel bajo este activado manda a prender la bomba y cuando el nivel alto se active manda apagar la bomba y de esta manera tendria su proyecto y ahoraria tanto dinero como tiempo y le aseguro que cumpliria la misma funciono.

En este caso lo que si le recomiendo es que use unos sensores adecuados a las dimensiones del tanque en el cual va hacer el control.

Ahora y es obligatorio hacerlo por sensor de distancia ultrasinico ya no queda de otro pero como le comente para lo que necesita se le haria mas caro y tardaria un poco mas de tiempo en hacer el codigo pero igual seria algo relativamente rapido.

Saludos y espero que mis comendarios se sirvan.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado luarken

  • PIC10
  • *
  • Mensajes: 28
Re: modificar medidor de distancia ultrasonico
« Respuesta #2 en: 31 de Marzo de 2008, 14:07:10 »
Hola buenos dias, segun sus necesidades no veo la necesidad de usar un medidor de distancia por ultrasonico solo le bastaria con 2 sensores uno para indicar el nivel bajo y otro para el nivel alto y cuando el nivel bajo este activado manda a prender la bomba y cuando el nivel alto se active manda apagar la bomba y de esta manera tendria su proyecto y ahoraria tanto dinero como tiempo y le aseguro que cumpliria la misma funciono.

En este caso lo que si le recomiendo es que use unos sensores adecuados a las dimensiones del tanque en el cual va hacer el control.

Ahora y es obligatorio hacerlo por sensor de distancia ultrasinico ya no queda de otro pero como le comente para lo que necesita se le haria mas caro y tardaria un poco mas de tiempo en hacer el codigo pero igual seria algo relativamente rapido.

Saludos y espero que mis comendarios se sirvan.
[/color]

si lo pense hacer de la forma que me dices, pero no me lo permitieron tiene que ser mas complejo q como me dises,  y por eso pense con
un tipo de circuito ultrasonico!!!!!

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: modificar medidor de distancia ultrasonico
« Respuesta #3 en: 31 de Marzo de 2008, 14:40:43 »
ok ya entiendo pero igual debes saber las dimensiones del tanque y la mas importante la altura ya que es el nivel a medir, esto te lo digo porque puede ser que el sensor que eligas no alcance la distancia que quieres medir.

por ejemplo este sensor de distancia atraves de ultrasonico solo alcanza a medir hasta 3 metros y si tu tanque tiene una distacia de altura mayor logico que tendras problema por eso te recomiendo que fijes bien las cosas y luego elijas los componentes a usar en tu control de nivel

SENSOR ULTRASONICO DE DISTANCIA PING))) DE PARALLAX
« Última modificación: 31 de Marzo de 2008, 14:45:45 por ASTROCAR »
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado luarken

  • PIC10
  • *
  • Mensajes: 28
Re: modificar medidor de distancia ultrasonico
« Respuesta #4 en: 31 de Marzo de 2008, 17:29:11 »
si ya habia bisto este sensor muchas gracias

lo que necesito es ver si puedo implementar algo para hacer que mediante las medidas que tome de distancia

condicionar en el programa para que a siertas distancias prenda o apague la bomba que llene el tanque o deposito


es simplemente un proyecto escolar , no es pra un trabajo con el q lucre!!!!!!!!!!!

Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: modificar medidor de distancia ultrasonico
« Respuesta #5 en: 01 de Abril de 2008, 15:03:20 »
ok , listo puedes tener el control del nivel del tanque en un lcd y lo de activar la bomba es lo de menos solo tienes que fijar a que distacion del fondo del tanque prendes la bomba y a que distancia la apagas y listo lo demas es llegar eso al codigo del pic que hasta ahora no nos has dicho que lenguaje usas para programar los pic.

saludos
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado luarken

  • PIC10
  • *
  • Mensajes: 28
Re: modificar medidor de distancia ultrasonico
« Respuesta #6 en: 01 de Abril de 2008, 17:40:51 »
el ejemplo que encontre esta arriba y tengo todos los componentes que este muestra..

es en ensamblador!


Desconectado ASTROCAR

  • PIC24F
  • *****
  • Mensajes: 664
Re: modificar medidor de distancia ultrasonico
« Respuesta #7 en: 01 de Abril de 2008, 18:40:37 »
perfecto entonce manos a la obra que te para entonce.
EL APRENDER ES NADA; MEJOR ES COMPARTIR EL APRENDIZAJE

Desconectado luarken

  • PIC10
  • *
  • Mensajes: 28
Re: modificar medidor de distancia ultrasonico
« Respuesta #8 en: 03 de Abril de 2008, 05:47:27 »
que parte del codigo se tiene q modificar para cambiar los display de 7 segmentos x un lcd 16x2???


 

anything