Autor Tema: medir distancias con IR  (Leído 2286 veces)

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

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
medir distancias con IR
« en: 04 de Octubre de 2008, 13:41:12 »
Hola a todos... trato de hacer una rutina para que el bot haga un "mapa" del espacio circundante midiendo distancias; la idea es que haga un giro sobre si mismo y cada 15º haga una medición de distancia, osea: mide distancia, gira 15º, mide distancia, gira 15º.... eso repetido 24 veces para completar los 365º.

Para medir distancias uso un detector de obstáculos IR, lo que hago en cada medición es enviar 5 ráfagas de 20 pulsos, la primera rafaga son pulsos de 21 uS (unos 47 Khz), la siguiente le añado 1 uS... así hasta llegar a los 26 uS (38 Khz); en definitiva empiezo con frecuencias alejadas de los 38 Khz con lo que tiene poco alcance y voy acercándome a los 38 Khz, con lo que va aumentando el alcance, en el momento que detecte algo pues ya se la distancia aproximada del objeto.

Entonces son 3 bucles anidados, el primero de 24 ciclos correspondiente a los 24 giros de 15º, dentro uno de 5 ciclos que son las 5 distancias testeadas, si detecta algo sale del bucle y pasa al siguiente giro; el tercer bucle de 20 ciclos son los 20 pulsos que forman la rafaga.

Esto es lo que tengo por ahora:
Código: [Seleccionar]

movlw d'24'
movwf raf

rafaga
movlw d'5'
movwf med

medida
movlw d'20'
movwf pul
movf med,W

pulso
bsf PORTA,3 ;enciende led
addwf PCL,F
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
btfss PORTA,4 ;lee A4, aqui está el receptor IR
goto detecta                ;si detecta obstáculo ir a subrrutina
bcf PORTA,3 ;apaga led
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop

decfsz pul, f
goto pulso

decfsz med, f
goto medida

gira
gira_iz d'100',d'100' ;gira 15º ... esto es una macro
decfsz raf, f
goto    rafaga

goto $

detecta
bcf PORTA,3 ;apaga led

;POR DETERMINAR

goto    gira


Tengo varias dudas:
-Para ir aumentando la duración del pulso, lo que hago es usar el PCL, primero le añado 5, con lo que salta 5 lineas, en cada vuelta le añado 1 menos con lo que salta 4,3,2... lineas, osea en cada vuelta el pulso es 1 instrucción más largo, como uso el reloj interno a 4 Mhz, osea 1 Mips, esto es 1 uS más largo; este sistema no lo he usado nunca y no sé si es correcto... creen que esto puede funcionar?

-En realidad me gustaría hacer la medición en 10 pasos, quitando 1 uS de la parte "on" del pulso y en la siguiente vuelta quitarlo de parte "of", tal y como está ahora solo quita en la parte "on", pero no sé como hacer para que en una vuelta quite solo de un lado y en la siguiente solo del otro....

-No tengo determinado como guardar los datos una vez que un objeto es detectado, lo único que se me ocurre con mis pocos conocimientos es crear 24 variables y en cada una de ellas poner la distancia, pero seguro que hay otras formas... alguna sugerencia?

-Una vez que tenga todos los datos nosé como comparar variables en ASM... como sé cual es mayor o menor??

Como ven mis conocimientos de ASM son muy básicos y tengo grandes dudas, así que cualquier sugerencia u orientación se agradece...

Saludos.

Desconectado arcachofo

  • PIC16
  • ***
  • Mensajes: 126
    • Foro para usuarios Linux.
Re: medir distancias con IR
« Respuesta #1 en: 09 de Octubre de 2008, 03:45:40 »
Bueno... ahí sigo dándole vueltas a esto... a ver si alguien resuelve este misterio...

estoy probando a mandar la señal IR por pwm, escribí una rutina y va bien, he cambiado la manera de cargar los valores en algunos registros y ahora el alcance del detector es la mitad..., no lo entiendo porque los valores que cargo son los mismos.. para que entendais el tema os muestro el código:
Código: [Seleccionar]
; ------------------------- Configura PWM -------------------------------
; -----------------------------------------------------------------------

BANKSEL PR2
movlw d'28' ;cargamos el valor del período en PR2
movwf PR2
BANKSEL CCPR1L
movlw d'14' ; cargamos valor del duty en CCPR1L
movwf CCPR1L
movlw b'00001100' ;cargamos setup módulo PWM en CCP1CON
movwf CCP1CON


esa es la configuración del pwm.. funciona bien.. alcance: unos 2m

ahora la modificación que hice:

Código: [Seleccionar]
; ------------------------- Configura PWM -------------------------------
; -----------------------------------------------------------------------
movlw d'28'
movwf per
movlw d'14'
movwf dut
BANKSEL PR2
movf per,W ;cargamos el valor del período en PR2
movwf PR2
BANKSEL CCPR1L
movf dut,W ; cargamos valor del duty en CCPR1L
movwf CCPR1L
movlw b'00001100' ;cargamos setup módulo PWM en CCP1CON
movwf CCP1CON


El resto del programa está exactamente igual.
Tambien funciona, pero el alcance es de solo 1m... se supone que los valores cargados son los mismos y debería funcionar exactamente igual... no??