Autor Tema: Ayuda con Codigo Sensor ultrasonico  (Leído 9853 veces)

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

Desconectado ECHEARANJUEZ

  • PIC10
  • *
  • Mensajes: 14
Ayuda con Codigo Sensor ultrasonico
« en: 20 de Abril de 2013, 20:35:33 »
Tengo este codigo tomado de el libro: "microcontrolador pic16f84 desarrollo de proyectos 2da edicion" que según el libro hace funcionar el sensor srf04.


El caso es que tengo un sensor hc-sr04 y no encontre ninguna diferencia con el mencionado en el libro asi que supuse que debia funcionar, en este momento creo que en el codigo hay algo mal.

TEXTUALMENTE EL LIBRO DICE ASI: La tecnica de programacion consiste en mandar un impulso a nivel alto de disparo con una duracion minima de 10us . Despues se lee el pulso que sale por la patilla ECO del sensor y se mide su longitud, que es proporcional a la distancia.

Simulando el circuito en proteus noto que el disparo no siempre se da cuando debe darse osea despues de recibir el eco (o solo hace el disparo inicial) otra cosa que noto es que en proteus no logro conseguir que la lcd muestre mas de 15cm.

Ahora en el circuito fisico la Lcd solo me muestra algo que segun el programa no deberia mostrar (distancia=0cm) y no hace nada mas

dejo el codigo por si alguien me puede ayudar.

Citar
;********************************** Sensor_ Ultrasonido_01.asm **************************
;
;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.          www.pic16f84a.com
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================
;
; Programa para un medidor de distancias hasta un objeto utilizando sensor por ultrasonido
; SRF04.
;
; Para el control del sensor en primer lugar se genera un  pulso de 10 µs a nivel alto por
; la línea RA3 que se conecta a la entrada de disparo del sensor. Seguidamente se espera a
; que en el sensor se ponga un nivel alto en la salida ECO que se conecta a la línea RA4 y
; se utilizan las interrupciones por desbordamiento del Timer 0 para medir el tiempo que
; está en alto el pulso. Seguidamente se visualiza en el módulo LCD el valor de la distancia
; hasta el objeto expresada en centímetros.
;
; Por cada centímetro de distancia al objeto el SRF04 aumenta 60 µs la anchura del pulso.
; En este programa la distancia mínima que se puede medir es 3 cm y la máxima 250 cm.
;
; ZONA DE DATOS **********************************************************************


; PIC16F887 Configuration Bit Settings

#include "p16F887.inc"

; CONFIG1
; __config 0xEFF1
 __CONFIG _CONFIG1, _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_ON & _FCMEN_ON & _LVP_OFF
; CONFIG2
; __config 0xFFFF
 __CONFIG _CONFIG2, _BOR4V_BOR40V & _WRT_OFF



   CBLOCK  0x0C
   Distancia                  ; Se expresará en centímetros.
   ENDC

#DEFINE  Disparo   PORTC,5   ; Disparo para iniciar la medida.
#DEFINE  Eco      PORTC,4         ; Pulso cuya anchura hay que medir.

MIN_DISTANCIA      EQU   .3
MAX_DISTANCIA      EQU   .250
TMR0_Carga60micros   EQU d'256'-d'27'; Valor obtenido experimentalmente con la
                           ; ventana Stopwatch para una interrupción del
; Timer 0 cada 60 µs.  Si no mide correctamente por las tolerancias de los componentes habrá
; que hacer un ajuste fino de este valor, comprobándolo sobre las condiciones reales.
;
; ZONA DE CÓDIGOS ********************************************************************

   ORG    0
   goto   Inicio
   ORG   4
   goto   ServicioInterrupcion

Mensajes
   addwf   PCL,F
MensajeDistancia
   DT "   Distancia: ", 0x00
MensajeCentimetro
   DT " cm", 0x00
MensajeDistanciaMenor
   DT "Dist. MENOR de:", 0x00
MensajeDistanciaMayor
   DT "Dist. MAYOR de:", 0x00


Inicio
    banksel TRISA   ;Pasamos al banco 1
    MOVLW B'00010000'  ; RC4  COMO ENTRADA
    MOVWF TRISC
    CLRF  TRISB      ;configura PORTB todo como salida
    CLRF  TRISE        ; PUERTO A COMO SALIDA
    CLRF  TRISA         ;PUERTO C COMO SALIDA
    CLRF  TRISD
    banksel  ANSELH   ;volvemos al banco 0
    CLRF     ANSELH          ;ENTRADAS DIGITALES
    CLRF   ANSEL
    BANKSEL PORTA
    CLRF PORTA
    CLRF PORTB
    CLRF PORTC
    CLRF PORTD
   call   LCD_Inicializa
   bsf      STATUS,RP0
   bcf      Disparo
   bsf      Eco
   movlw   b'00000000'            ; Prescaler de 2 para el TMR0.
   movwf   OPTION_REG
   bcf      STATUS,RP0
   bcf      Disparo               ; Inicializa línea de disparo en bajo.
Principal
   clrf   Distancia            ; Inicializa el registro.
   bsf      Disparo               ; Comienza el pulso de disparo.
   call   Retardo_20micros      ; Duración del pulso.
   bcf      Disparo               ; Final del pulso de disparo.
Espera_Eco_1
   btfss   Eco                  ; Si ECO=0, espera el flanco de subida de la señal
   goto   Espera_Eco_1         ; de salida del sensor.
   movlw   TMR0_Carga60micros      ; Ya se ha producido el flanco de subida.
   movwf   TMR0               ; Carga el Timer 0.
   movlw   b'10100000'            ; Autoriza interrupción del TMR0 (T0IE).
   movwf   INTCON
Espera_Eco_0
   btfsc   Eco                  ; Espera flanco de bajada de la señal de la salida
   goto   Espera_Eco_0         ; del SRF04.
   clrf   INTCON               ; Se ha producido el flanco de bajada. Prohíbe interrup.
   call   Visualiza            ; Visualiza la distancia.
   call   Retardo_2s            ; Espera un tiempo hasta la próxima medida.
Fin   goto   Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Se ejecuta debido a la petición de interrupción del Timer 0 cada 60 µs que es el incremento
; de la anchura de pulso por centímetro de distancia medido. La variable "Distancia" contiene el
; valor de la distancia expresada en centímetros.
;
ServicioInterrupcion
     movlw   TMR0_Carga60micros      ; Carga el Timer 0.
   movwf   TMR0
   movlw   .1                  ; Se utiliza instrucción "addwf", en lugar de "incf"
   addwf   Distancia,F            ; para posicionar flag de Carry.
   movlw   MAX_DISTANCIA         ; En caso de desbordamiento carga su máximo valor.
   btfsc   STATUS,C
   movwf   Distancia
   bcf      INTCON,T0IF
   retfie

; Subrutina "Visualiza" -----------------------------------------------------------------
;
; Visualiza la distancia expresada en centímetros. Se hace de manera que cuando haya que
; visualizar un número mayor de 99 las decenas siempre se visualicen aunque sean cero.
; Y cuando sea menor de 99 las decenas no se visualicen si es cero.
;
; Si la distancia es menor de 3 cm o mayor de 250 cm aparece un mensaje de error.
;
Visualiza
   call   LCD_Borra            ; Borra la pantalla anterior.
   movlw   MIN_DISTANCIA         ; Va a comprobar si es menor del mínimo admisible.
   subwf   Distancia,W            ; (W) = (Distancia) - MIN_DISTANCIA
   btfss   STATUS,C            ; ¿C=1?, ¿(W) positivo?, ¿(Distancia) >= MIN_DISTANCIA?
   goto   DistanciaMenor         ; No ha resultado menor, y salta al mensaje de error.
   movf   Distancia,W            ; Va a comprobar si es mayor del máximo admisible.
   sublw   MAX_DISTANCIA         ; (W)=MAX_DISTANCIA-(Distancia)
   btfsc   STATUS,C            ; ¿C=0?, ¿(W) negativo?, ¿MAX_DISTANCIA < (Distancia)?
   goto   DistanciaFiable         ; No, la medida de la distancia entra dentro del rango.
;
DistanciaMayor
   movlw   MAX_DISTANCIA         ; La distancia es mayor que el máximo.
   movwf   Distancia
   movlw   MensajeDistanciaMayor
   goto   VisualizaDistancia
;
DistanciaMenor
   movlw   MIN_DISTANCIA         ; La distancia es menor del mínimo fiable.
   movwf   Distancia
   movlw   MensajeDistanciaMenor
   goto   VisualizaDistancia
DistanciaFiable
   movlw   MensajeDistancia
VisualizaDistancia
   call   LCD_Mensaje
   movlw   .5                  ; Centra la medida de la distancia en la segunda línea
   call   LCD_PosicionLinea2      ; de la pantalla.
   movf   Distancia,W
   call   BIN_a_BCD            ; Lo pasa a BCD.
   movf   BCD_Centenas,W         ; Primero las centenas.
   btfss   STATUS,Z            ; Si son cero no visualiza las centenas.
   goto   VisualizaCentenas
   movf   Distancia,W            ; Vuelve a recuperar este valor.
   call   BIN_a_BCD            ; Lo pasa a BCD.
   call   LCD_Byte            ; Visualiza las decenas y unidades.
   goto   Visualiza_cm
VisualizaCentenas
   call   LCD_Nibble            ; Visualiza las centenas.
   movf   Distancia,W            ; Vuelve a recuperar este valor.
   call   BIN_a_BCD            ; Lo pasa a BCD.
   call   LCD_ByteCompleto      ; Visualiza las decenas (aunque sea cero) y
Visualiza_cm                  ; unidades.
   movlw   MensajeCentimetro
   call   LCD_Mensaje
   return

   INCLUDE  <RETARDOS.INC>
   INCLUDE  <LCD_8BIT.INC>
   INCLUDE  <LCD_MENS.INC>
   INCLUDE  <BIN_BCD.INC>


   END

;   ===================================================================
;     Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
;     E. Palacios, F. Remiro y L. López.          www.pic16f84a.com
;      Editorial Ra-Ma.  www.ra-ma.es
;   ===================================================================


« Última modificación: 20 de Abril de 2013, 21:05:14 por ECHEARANJUEZ »

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con Codigo Sensor ultrasonico
« Respuesta #1 en: 20 de Abril de 2013, 21:54:50 »
Yo estoy usando el HC-SR04 en CCS C y anda bien.
No encuentro el modelo en ISIS, cual estas usando??
No se si exactamente es igual al SRF04, este ultimo tiene cuatro cables tambien??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado ECHEARANJUEZ

  • PIC10
  • *
  • Mensajes: 14
Re: Ayuda con Codigo Sensor ultrasonico
« Respuesta #2 en: 20 de Abril de 2013, 22:45:18 »
para simularlo en proteus estoy utilizando el equivalente al srf04  mostrado en esta pagina. http://www.thob.org/articulo/circuito_simulador_srf04_para_proteus-742690.html

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con Codigo Sensor ultrasonico
« Respuesta #3 en: 20 de Abril de 2013, 23:12:49 »
Entonces te recomiendo que uses un sonar real, eso ni se aproxima a la realidad.
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado ECHEARANJUEZ

  • PIC10
  • *
  • Mensajes: 14
Re: Ayuda con Codigo Sensor ultrasonico
« Respuesta #4 en: 21 de Abril de 2013, 11:33:34 »
Si ya lo probe en el montaje fisico, pero no anda. Me muestra algo que no deberia mostrar. (0cm) en ninguna parte del programa veo porque mostraria eso

Desconectado MGLSOFT

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Ayuda con Codigo Sensor ultrasonico
« Respuesta #5 en: 21 de Abril de 2013, 14:41:14 »
Como lo conectaste ??
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado rotting79

  • PIC12
  • **
  • Mensajes: 91
...On November 2nd, a PIC10 became self-aware and decided our fate in __delay_us ( 1 ); ...


 

anything