TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: tapi8 en 27 de Julio de 2006, 12:39:11

Título: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 27 de Julio de 2006, 12:39:11
bueno primero pedir perdon por estar siempre preguntando.estoy haciendo un programa para que un pequeño robot me entienda por la voz unas instrucciones:adelante,atras, izquierda y derecha la verdad me parecia facil pero a medida que hago cosas se me va complicando y necesito que mientras tengo el motor andando BSF PARTB 0 tambien me atienda una BTFSS para chequear el micro,gracias por anticipado.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: aitopes en 27 de Julio de 2006, 13:12:40
Hola!

Mira...dos instrucciones a la vez con un solo nucleo de proceso imposible.. :(

Pero mediante interrupciones podes lograr algo que se parezca un poco.  :mrgreen:

Saludos.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 27 de Julio de 2006, 16:39:54
bueno primero pedir perdon por estar siempre preguntando.estoy haciendo un programa para que un pequeño robot me entienda por la voz unas instrucciones:adelante,atras, izquierda y derecha la verdad me parecia facil pero a medida que hago cosas se me va complicando y necesito que mientras tengo el motor andando BSF PARTB 0 tambien me atienda una BTFSS para chequear el micro,gracias por anticipado.

Hacer un bsf y un btfss sobre el mismo puerto, uno inmediatamente después del otro no es buena idea.  Sobre todo en los 16F y 12F que no tienen los latchs y más pensando en un funcionamiento a alta frecuencia.

Como bien te dijo aitopes no se puede hacer 2 instrucciones en el mismo exacto momento.  Tal vez estas buscando la solución al problema por donde no debes.

¿Qué es lo que pretendes hacer?
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 28 de Julio de 2006, 05:55:57
cuando digo chequear el <micro> me refiero a un microfono pequeño que lleva y que estaria conectado en PORTA,0
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 28 de Julio de 2006, 09:47:57
cuando digo chequear el <micro> me refiero a un microfono pequeño que lleva y que estaria conectado en PORTA,0

Es que no has aclarado bien tu punto.

Tu quieres por un lado leer un pin y por el otro manejar un motor?  Esto es perfectamente posible, debieras hacer 2 rutinas donde ambas se llamen continuamente.  Se llamará más seguido a la que tenga que atenderse más rapido ya que en un motor no tiene sentido que le cambies los pulsos cada ciclo de instrucción.

Tu quieres hacer 2 cosas a la vez, lo cual en esto del firmware no significa que sean 'en simultáneo' sino que en realidad las haces tan rápido que parece que son en simultáneo .  Lo mismo ocurre con las pcs monomicro: 'parece' que ejecuta muchos programas al mismo tiempo pero en realidad atiende a uno por vez tan rápidamente que parece que lo hace en simultáneo.

Es esto lo que quieres hacer??
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 28 de Julio de 2006, 11:43:54
primero gracias por contestar tan rapido.quiero hacer un programa que entienda palabras dichas por mi mediante un micrfono, en principio parecia relativamente facil pero en cuanto empece a escribir codigo la cosa se va complicando,ademas es el promer programa que hago. cuando el motor este activado o los motores (lleva dos) si yo le mando cambiar de direccion tamien tiene que hacerlo creo que debera ser mediante una interrupcion.esta interrupcion la tendria siempre activada?.encuanto le llegara sonido por el microfono pararia lo que esta haciendo y atenderia esa señal que le entra por RA0 que es donde esta conectado el micro?.y en 16f84a puedo meter mas interrupciones porque tengo dos bumpers que si choca contra algo tambien tiene que parar y ademas un detector de ultrasonidos.pero en principio me preocupa el programa de la voz.gracias por atenderme
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 28 de Julio de 2006, 12:22:07
primero gracias por contestar tan rapido.quiero hacer un programa que entienda palabras dichas por mi mediante un micrfono, en principio parecia relativamente facil pero en cuanto empece a escribir codigo la cosa se va complicando,ademas es el promer programa que hago. cuando el motor este activado o los motores (lleva dos) si yo le mando cambiar de direccion tamien tiene que hacerlo creo que debera ser mediante una interrupcion.esta interrupcion la tendria siempre activada?.encuanto le llegara sonido por el microfono pararia lo que esta haciendo y atenderia esa señal que le entra por RA0 que es donde esta conectado el micro?.y en 16f84a puedo meter mas interrupciones porque tengo dos bumpers que si choca contra algo tambien tiene que parar y ademas un detector de ultrasonidos.pero en principio me preocupa el programa de la voz.gracias por atenderme

Ahora comprendo, dejame darte mis apreciaciones al respecto

1) Me parece muy ambicioso para ser un primer proyecto

2) Yo que tu estudiaría bien como funciona una interrupción.  Una cosa es tener activada una interrupción y otra es el flag de la misma.  No se a que te refieres con dejar siempre la interrupción activada ni porque dices que lo debes hacer por interrupción.  Si tu manejas un motor de continua con un sentido para un lado o para otro, no veo la necesidad de usar interrupciones para esto ya que el cambio de dirección se producirá en momentos muy separados

3) La parte de la deteccion de los bumpers y todo eso, tampoco hace falta que sea por interrupción.  Estamos hablando de que el micro responde en microsegundos y los motores en milisegundos.  No notarás diferencia. 


Saludos
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: Nocturno en 28 de Julio de 2006, 12:31:13
Opino como Maunix, el reconocimiento de voz es una pasada para ser tu primer intento. Y aunque fueras un picmaniaco experimentado, me parece complicado acometerlo con un 16F84.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: BrunoF en 28 de Julio de 2006, 14:35:59
Bueno, yo no postee para no desanimarlo, pero la verdad que hacer reconocimiento de voz con un PIC es algo que me resulta a mi parecer, muy dificil y complejo.

Especialmente cuando uno ve que programas de reconocimiento de voz que vienen para las PC necesitan aun que uno les hable durante horas para configurarlo y que el programa reconozca los patrones de la voz de la persona que lo utilizara y sabiendo que requieren de muchos MB de programacion logica y para almacenamiento posterior ya que estos programas aprenden cuanto uno mas los usa.
La verdad que detectar los patrones, asilar ruidos del medio ambiente, y encima en tiempo real...y con tan poca memoria RAM y ROM y poca capacidad de procesamiento de señales analogicas, me parece sinceramente, un proyecto demasiado ambicioso para mi.
Pero no nos hagas caso, y tu dale para adelante. Que asi surgen los grandes inventos y revoluciones.
Saludos y especialmente, ánimo!! :mrgreen:

Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: aitopes en 28 de Julio de 2006, 15:07:41
Acabo de comprar un telefono movil marca Motorola, modelo MPX220, y descubro maravillado que el muy gracioso me reconoce la voz para activar aplicaciones o discar numeros SIN NECESIDAD DE QUE LO ENTRENE....
Por supuesto, el procesador del coso ese es mucho mas potente que un PIC, pero me parecio un gran adelanto el poder salterme el entrenamiento. Segun el manual, se puede entrenar para mejorar aun mas el reconocimiento.....espectacular!  8)

Saludos.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: Nocturno en 28 de Julio de 2006, 15:30:38
Sí, nada más lejos de mi intención que desanimar al nuevo compañero. Pero precísamente me parece contraproducente que intente saltar un muro tan alto en su primer intento. Creo que la clave de que se anime es ir superando pequeñas barreras cada vez mayores.

Mi Nokia N70 también reconoce la voz sin entrenamiento; es acojonante.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 28 de Julio de 2006, 17:16:41
vereis yo no pretendo hacer programas tan ambiciosos como los de los moviles, el mio pretende ser una pequeña trampa para que parezca que los reconoce que me supongo que los de los moviles tambien iran un poco por ahi.
os explico.yo calculo que una silaba tarda 300ms en decirse,de esto no estoy seguro pero da igual de momento.hago un delay con ese tiempo y voy chequeando cuanto tiempo el microfono recibe señal
             300ms==girar izquierda==left
             600ms==atras pasa dos veces por delay
             900ms==adelante tres delay
             1200ms==derecha tres tambien pero habria que decirlo un poco despacio
no se si esto resultara pero voy a ver si lo consgo,incluso se podrian hacer un par de ellas mas
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: BrunoF en 28 de Julio de 2006, 19:01:32
Bien, pero entonces vas a necesitar filtrar la señal de entrada a la banda de frecuencia de la voz humana, e incluso filtrandola, probablemente el medio ambiente haga que se ejecuten comandos al azar de manera bastante seguida. No se que opina el resto.
Saludos.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: Nocturno en 29 de Julio de 2006, 02:06:48
Pues sí, imagino que por muchos filtros que le pongas, lo mismo se enciende cuando pase un coche, o cuando suene el teléfono.
De todas formas, por probar no se pierde nada.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 29 de Julio de 2006, 05:35:51
bueno veo que os interesais por el tema yo creo que por logica la cosa deberia funcionar mas o menos otra cosa es el microfono, en el robot para el que hacia el programa el microfono es tan malo que ni de coña, de hecho ahi lo trae para hacerlo parar o andar mediante una señal sonora(palmada, silvido etc) y hace algun tiempo haciendo pruebas con el si la tele estaba un poco alta le hacia mas caso a la tele que a mi incluso la recomendacion de los que lo hicieron era ponerle unas tiras de fixo encima. alguien me decia por ahi que me mire lo de las interrupciones y tiene razon es lo que menos controlo.bueno estoy recien salido de una operacion y esperando otra asi que hay veces que tengo pocas ganas de ponerme con el tema pero algo ire haciendo.el microfono habra que buscar algo que discrimine unas ciertas frecuencias.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: aitopes en 29 de Julio de 2006, 09:09:44
Hola Tapi8!

Me gusta ver ese entusiasmo.
Si queres reconocer comandos por voz, seguramente va a hacer falta algo mas que medir la intensidad o duracion de los comandos. No conozco el tema, pero el sentido comun me dice que debe ser necesario hacer un analisis de las frecuencias a travez del tiempo del comando.
Cada comando esta compuesto por fonemas, cada uno con sus caracteristicas espectrales. Para reconocer "derecha", habria que ver cuales son los fonemas implicados, y el PIC deberia buscar en una tabla o memoria externa las coincidencias con fonemas conocidos para saber que comando estas diciendo.
Se me ocurre (yo tambien soy un principiante...) que la capacidad de un PIC (no se un dsPic) es insuficiente para una tarea semejante.
Igualemente, todo lo que estas haciendo te va a servir, y mucho, para aprender, que es lo importante.

Saludos, y adelante!
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 29 de Julio de 2006, 09:48:00
bueno os voy a poner el programa no creo que este bien a la primera pero es un punto de paratida
      RB0= MOTOR 1 adelante
      RB1= MOTOR 2 adelante
      RB3= MOTOR 1 atras
      RB4= MOTOR 2 atras
      RA0= ENTRADA MICROFONO (micro)
INICIO
           BTFSS       PORTA,0            chequea micro si 1 o 0
           GOTO        INICIO              si 0 va inicio
           CALL         DELAY               300ms esto no es seguro
           BTFSC       PORTA,0            si 0 solo una silaba LEFT va a la izquierda
           GOTO        ATRAS               si 1 salta al siguiente moviniento
           BSF           PORTB,0            SOLO UNA SILABA GIRA IZQUIERDA
ATRAS
           CALL         DELAY               espera 300ms
           BTFSC       PORTA,0           chequea micro
           GOTO        ADELANTE
           MOVLW      0CH                 si el micro 0 activa M1 y M2 atras
           MOVWF      PORTB
ADELANTE
           CALL         DELAY             
           BTFSC       PORTA,0
           GOTO        DERECHA
           MOVLW      03H                 activa M1 y M2 ADELANTE
           MOVWF      PORTB
DERECHA
           CALL         DELAY
           BTFSC       PORTA,0
           GOTO        GIRODER
           BSF           PORTB,1          activa M2 adelante
GIRODER
           CALL         DELAY
           BTFSC       PORTA,0
           GOTO        GIROIZ
           MOVLW      09H
           MOVWF      PORTB           M1 adelante M2 atras da vueltas en redondo derecha
GIROIZ
           CALL         DELAY           
           BTFSS       PORTA,0         chequeo a 1 y no a 0 porque al ser la ultima da igual. creo
           GOTO        END
           MIVLW       05H               
           MOVWF      PORTB          M1 adelante M2 atras gira en redondo izquierda
           end


bueno como ya dije no pretendo que funcione a la primera solo es para ver si podroa ser viable
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 29 de Julio de 2006, 12:27:07
gracias por los animos aitopes. yo tambien creo que esto del reconocimiento de voz debe ser mas complicadopero quien sabe esto con vuestra ayuda creo que va a funcionar.
voy a hacer unas aclaraciones sobre el progreama anterior obvie algunas cosas como configurar puertos y algunas mas.si deciros que el robot para el que esta hecho es un triciclo con dos ruedas motrices en paralelo atras y una rueda loca delante,cada rueda trasera lleva un motorcillo de dc,quiero decir que toda la direccion del robot depende de estos motores
               

                                                          0 rueda loca




                                              0--M2           0--M1
                                           

se supone que los ceros son las ruedas lo digo porque quedo bastanae mal
                                           


                                 
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 09 de Agosto de 2006, 07:16:12
bueno sigo con el programilla este y aunque estoy de medias vacaciones le estuve dando un repaso  y queria hacer alguna comprobacion y me he dado cuenta que no tengo un compilador-simulador de asembler tengo el CCS pero creo que este no vale, hay alguno que se pueda integrar en el proteus? o alguno que traiga ya todo de serie compilador y simulador. Despues cuando empiece el curso lo probare en el taller del instituto de F.P. si es que me dejan.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 09 de Agosto de 2006, 08:27:47
bueno sigo con el programilla este y aunque estoy de medias vacaciones le estuve dando un repaso  y queria hacer alguna comprobacion y me he dado cuenta que no tengo un compilador-simulador de asembler tengo el CCS pero creo que este no vale, hay alguno que se pueda integrar en el proteus? o alguno que traiga ya todo de serie compilador y simulador. Despues cuando empiece el curso lo probare en el taller del instituto de F.P. si es que me dejan.

Si, el MPLAB IDE de Microchip.  Trae un editor de texto, simulador y ensamblador.  Además es gratis.

Clickea aquí: MPLAB IDE (http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en019469&part=SW007002)
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 09 de Agosto de 2006, 14:13:06
gracias por responder y por la informacion y por la rapidez ya veo que tu no estas de vacaciones o son vacaciones activas.Ya me baje el MPLAB creo que ya lo habia bajado en otra ocasion pero desde que estoy en el foro bajo tantas cosas y soy tan desordenado que a veces no se para lo que son. De esta vez le he puesto yo un nombre a la carpeta a ver si asi me aclaro gracias de nuevo
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 09 de Agosto de 2006, 15:51:34
gracias por responder y por la informacion y por la rapidez ya veo que tu no estas de vacaciones o son vacaciones activas.Ya me baje el MPLAB creo que ya lo habia bajado en otra ocasion pero desde que estoy en el foro bajo tantas cosas y soy tan desordenado que a veces no se para lo que son. De esta vez le he puesto yo un nombre a la carpeta a ver si asi me aclaro gracias de nuevo

Los que están de vacaciones son nuestros compañeros foristas de españa!!  Los de argentina seguimos dándole duro al trabajo  :? :?
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: the real PHLAKO en 10 de Septiembre de 2006, 04:08:54
huyyyyy, seria un magno proyecto el de capturar voz, ve los datasheet de los grabadorres de vos tipo ISD4000 series, yo tengo uno por ak y lo incluire en un proyecto, pero ahora tengo problemas con otra parte de este, pero viendo el diagrama de blokes puesdes aclarar el funcionamiento :)

chaos :)

PD1 veo caras conocidas por ak :)

PD2 no me corre la emulacion de I2C :(
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 11 de Septiembre de 2006, 15:55:33
PD1 veo caras conocidas por ak :)

Así, es... habemos muchos que somos de abmos foros :) :) 

No te será tan fácil escabullirte  :D :D :D

Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 14 de Septiembre de 2006, 14:37:37
hola the real phlako no creo que este programa se le pueda llamar de reconocimiento de voz solo es una chorrada que se me ocurrio, pero me haria ilusion que funcionara aunque fuera con limitaciones no se que quieres que te explique? algo sobre el programa? el circuito todavia no lo monte ,estoy esperando que empiece el curso de F.P. para probarlo y empieza el 28 de este mes tampoco hice todavia la simulacion en proteus y no se si habra que corregir alguna cosa
un saludo tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: recuperarusuario en 14 de Septiembre de 2006, 17:39:00
Microchip vende una librería de reconocimiento del habla (de la que hay una versión demo descargable) para el dsPIC30F5011 y otros, el enlace es http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en023596 y según parece hay que hablarle en inglés USA.

También hay otros IC de reconocimiento del habla (RH) como el HM2007 de HMC de y el MSM6679 de OKI (de esto hay info en www.alldatasheet.com)

Por último también he visto un módulo de RH con la referencia RSC36.

Yo no empezaría a generar código de RH sin antes haber grabado varios wav con las órdenes que se pretende reconocer (cinco o seis), analizar cómo varían su frecuencia e intensidad y montar una tabla con esos datos. Por otra parte habría que convertir la señal analógica que capta el micro en señal digital y por último compararla con las de la tabla del principio (Ahora sí que hará falta parir código). En fín, un trabajo duro. Mucha suerte.

Saludos, cordiales.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: J1M en 14 de Septiembre de 2006, 18:12:22
Hola, tema complicadillo aunq no imposible!, este año para la práctica de una asignatura hicimos un 'pequeño' programa para el reconocimiento de voz mediante matlab. Como punto de partida tendrás que tomar varias muestras de cada uno de las ordenes, en nuestro caso pretendiamos reconocer los números del 0 al 9, con nuestras voces y con las de los compañeros de clase, los porcentajes de reconocimiento no quedaron muy allá, pero sirvió como punto de partida para hacer algo mas gordo, nosotros utilizamos metodos sencillos, como es el cálculo de la energía, y la correlación, ambos pueden ser 'fácilmente' implementados en un PIC... Como te decía para empezar deberías tomar varias muestras, segundo paso es hacer que esas muestras tengan media nula y varianza unidad... para evitar problemas con que se hable mas fuerte o cerca del micro, una vez tengas las muestras acondicionadas, calculas el valor medio de los estadisticos que vas a usar, en este caso el de la energía y la correlación. Una vez tienes estos dos parámetros para cada uno de los comandos ya puedes almacenarlos en el PIC y empezar a procesar... la señal analógica que introduzcas al PIC tendrás que muestrearla a la misma frecuencia que has muestreado anteriormente las muestras valga la redundancia... Una vez muestreada la señal tendrás en la memoria del PIC una ristra de datos, en primer lugar deberías detectar el principio y el fín del comando y rechazar el resto, a continuación tendrás que procesar esos datos válidos como antes, es decir, haces que su media sea nula y que la varianza sea la unidad, seguidamente calculas la energia y la correlación, y con esto habrás reducido la señal de entrada a dos valores, solo resta comparar estos dos valores con cada uno de los otros valores que obtuviste para las muestras, quien mas se le aproxime debería ser el comando que has dicho...

Esto es un método bastante bastante sencillo y con un grado de acierto entre el 70-80% mas menos. Siempre puedes complicarlo todo lo que quieras, jugando con la FFT y demás artilugios matemáticos, detectando fonemas, etc. La verdad es que el campo del reconocimiento de voz es algo muy interesante! Animo pq aunq parezca complicado es un sistema relativamente sencillito de reconocimiento se puede implementar ;) Ahora eso sí, es muy probable que necesites un PIC mas 'gordo' que el 16F84.

Saludos, suerte y adelante!
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 15 de Septiembre de 2006, 05:26:24
bueno como bien deciis tanto recuperarusuario como J1M los programas de reconocimiento de voz son asi de complicados y un 16f84a no tendria capacidad para eso, eso tendria facil solucion, un PIC mas grande que cuesta 2 o 3 euros, el otro problema es que yo tampoco tengo conocimientos ni capacidad para hacer un programa tan complicado y eso tiene peor solucion jejejeje.Por eso queria hacer que funcionara de alguna manera este.
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 15 de Septiembre de 2006, 08:22:27
bueno como bien deciis tanto recuperarusuario como J1M los programas de reconocimiento de voz son asi de complicados y un 16f84a no tendria capacidad para eso, eso tendria facil solucion, un PIC mas grande que cuesta 2 o 3 euros, el otro problema es que yo tampoco tengo conocimientos ni capacidad para hacer un programa tan complicado y eso tiene peor solucion jejejeje.Por eso queria hacer que funcionara de alguna manera este.

tapi8 si te dicen que es complicado hacerlo con un microcontrolador poderoso, más lo será aún hacerlo con uno menos poderoso!

Por ejemplo, si quiero hacer unos cálculos matemáticos con un dspic y que me demore poco tiempo, para hacer lo mismo con un 16f84 puede ser tan complicado que tal vez necesitaría varios pics de estos o hasta cabe la posibilidad (muy probable) de que sea imposible.

A menudo hacer un software que cumpla las mismas funciones que otro con un pic más modesto requiere habilidades mayores.  Se debe recurrir a muchos artiligios y reutilización rutinas, de posiciones de memoria y un sin fin de cuestiones.

Un proyecto mal definido y evaluado de entrada lleva al fracaso y eso es muy frustrante.  Es mejor detenerse un tiempo a razonar mejor el problema, ver qué cosas hacen falta , qué cosas uno las tiene (conocimientos , materiales, tiempo, etc) y qué cosas no.  A partir de ahí ver si realmente se puede o no hacer el proyecto, por más que sea un hobby.

Saludos
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 15 de Septiembre de 2006, 13:11:30
gracias por el consejo maunix y se que estas en lo correcto con tu consejo, pero se que no me va a frustrar el que no me funcione. A mi edad (44) ya no se lleva eso, y por otro lado estoy aprendiendo cosas que no se aprenden leyendo programas sino escribiendolos.
Quisiera saber tu opinion sobre el concepto del programa, esto es, mientras un pin reciba un 1 logico este se puede medir en tiempos y a cada cierto tiempo le correspondera ejecutar una instruccion.
En el codigo que escribi en este mismo hilo hay fallos, por ejemplo creo que al final de cada etiqueta tendria que llevar un GOTO INICIO tampoco se si el tiempo para cada silaba (300ms) esta bien pero como la prueba del programa no la voy a hacer hasta finales de este mes o principios del siguiente no me corre mucha prisa
gracias por anticipado tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 15 de Septiembre de 2006, 13:20:44
gracias por el consejo maunix y se que estas en lo correcto con tu consejo, pero se que no me va a frustrar el que no me funcione. A mi edad (44) ya no se lleva eso, y por otro lado estoy aprendiendo cosas que no se aprenden leyendo programas sino escribiendolos.
Quisiera saber tu opinion sobre el concepto del programa, esto es, mientras un pin reciba un 1 logico este se puede medir en tiempos y a cada cierto tiempo le correspondera ejecutar una instruccion.
En el codigo que escribi en este mismo hilo hay fallos, por ejemplo creo que al final de cada etiqueta tendria que llevar un GOTO INICIO tampoco se si el tiempo para cada silaba (300ms) esta bien pero como la prueba del programa no la voy a hacer hasta finales de este mes o principios del siguiente no me corre mucha prisa
gracias por anticipado tapi8

Me gustaría echarte una mano, al menos en la parte del movimiento del robot o de ejecutar varias instrucciones "como si fuese al mismo tiempo". 

Te propongo que tu problema se resuelva por partes, es decir, primero logres que el robot se mueva fiablemente y luego vemos como se mete lo del reconocimiento de voz ( si se puede.. claro está).

Saludos
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 15 de Septiembre de 2006, 16:28:08
 
aqui mando un programa con alguna posibilidad (no muchas por lo que parece) de funcionar



LIST     P=16F84A
include  <16f84a>
   _conf_CP_OFF&_XT_OSC&_WDT_OFF_PWRT_ON&_LVP_OFF&_BODEN_OFF
   
pdel o   equ      0x0c
pdel 1   equ      0x0d

      ORG      0x0
      goto   inicio
      ORG      0x5
inicio
      bsf      STATUS,RP0
      movlw   0B00001
      movwf   TRISA
      movlw   0B00000000
      movwf   TRISB
      bcf      STATUS,RP0
      clrf   PORTA
      clrf   PORTB
IZQUIERDA
      btfss   PORTA,0
      goto   IZQUIERDA
      CALL   DELAY
      btfsc   POTRA,0
      goto   ATRAS
      bsf      PORTB,0
       goto   IZQUIERDA
ATRAS
      CALL   DELAY
      btfsc   PORTA,0
      goto   ADELANTE
      movlw   0x00C
      movwf   PORTB
      goto   IZQUIERDA
ADELANTE
      CALL   DELAY
      btfsc   PORTA,0
      goto   DERECHA
      movlw   0x03
      movwf   PORTB
      goto   IZQUIERDA
DERECHA
      CALL   DELAY
      btfsc   PORTA,0
      BSF      PORTB,1
DELAY
      movlw   156
      movwf   pdel0
Ploop1   movlw   213
      movwf   pdel1
Ploop2   clrwdt
pdel1L1   goto   pdel2L2
pdel2L2
      decfsz   pdel1,1
      goto   Ploop2
      decfsz   pdel0,1
      goto   Ploop1
pdelL3   GOTO   PDELl4
pdelL4   clrwdt
      return
      
      END
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 15 de Septiembre de 2006, 17:00:27
tapi8, el tema puntual es que quisiera comprender bien que pretendes hacer con ese software. a eso apuntaba mi pregunta en el post anterior.

Creo que el paso de partida es ese. 
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 16 de Septiembre de 2006, 06:34:33
perdona maunix ni siquiera habia leido tu antarior post, este lo hice en el mplab que te pedi un dia atras y me cuesta trabajo manejarlo, de hecho ya no fui capaz de simularlo, tampoco le puse comentarios pero es muy parecido( con alguna correccion y algo menos extenso )que otro que esta un poco mas atras en este mismo hilo.
Lo unico que pretendo es ir midiendo cuanto tiempo entra señal por RA0, de 200 en 200ms que es lo que en un principio deberia durar una silaba(esto no lo se ni se como lo voy a calcular) pero algo se nos ocurrira. A partir de que sea una silaba dos o tres se iran activando los motores que estan conectados en el puerto B.
Con respecto a hacer andar el robot creo que sera casi imposible es de estos de coleccion que parece que no funcionan casi nunca y en el mio ademas vino algun circuito medio roto y otros me los rompieron unos crios jugando con el, no trae esquemas, y el microfono que trae no valdria para esto por ser muy malo.
Este programa lo quiero probar en una protoboard con unos simples leds simulando el movimiento de los motores, un microfono algo bueno y un LM567 que lei por este mismo foro que es un discriminador de frecuencias(de esto no tengo ni idea asi que espero algun asesoramiento)
gracias por anticipado y sobre a ti Maunix por la lata que estoy dando.
Un saludo tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 20 de Septiembre de 2006, 08:24:38
tapi8 según veo en tu código, tu primero sensas la presencia de señal en un pin y luego activas el motor X milisegundos

A priori, sin simular tu software, debiera funcionar. 

Según entiendo quieres medir si la señal está presente por 200mseg, por 400mseg, por 600mseg? ¿es eso?

Si es así, yo no metería un bucle de tiempo, yo que tú programaría un timer para que encienda su flag cada 10mseg.  Contaría cada ese tiempo si hay presencia de señal en el pin donde sensas sonido.  Cada vez que sensas señal incrementas la cuenta de una variable , cuando no hay señal vas al bucle de decisión de qué dirección tomar.

Si la variable llega a 20, entonces han pasado 200mseg.  Si la variable llega a 40 han pasado 400mseg.

En ese bucle verificas el valor si es <= 20, <= 40, <= 60 .  En función de eso decides a qué dirección se moverá el motor.  Luego haces la variable del contador 0 y vuelves a contar.

Saludos


Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 21 de Septiembre de 2006, 10:50:47
bueno Maunix gracias por contestar y FELICIDADES porque creo que estas de cumpleaños o vas a estar.
si tu crees que va a funcionar me sien to mas aliviado. Estas en lo cierto con lo de ir sensando el tiempo de 200 en 200ms creo que tambien en lo de la variable, e ir cogiendolos de 10en 10 o a lo mejormas nolo se pero creo que es una gran idea porque discimanaria mejor unas palabreas de otras y creo que esto sera muy importante me pondre a trabajar en esto, a ver por dondeempiezo, algo se me ocurrira.

Maunix si esto funciona seremos los padres del "PEOR PROGRAMA DERECONOCIMIENTO DEVOZ DELAHISTORIA DE LOS PICs" a que mola?
un saludo tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 21 de Septiembre de 2006, 15:52:33
bueno Maunix gracias por contestar y FELICIDADES porque creo que estas de cumpleaños o vas a estar.
si tu crees que va a funcionar me sien to mas aliviado. Estas en lo cierto con lo de ir sensando el tiempo de 200 en 200ms creo que tambien en lo de la variable, e ir cogiendolos de 10en 10 o a lo mejormas nolo se pero creo que es una gran idea porque discimanaria mejor unas palabreas de otras y creo que esto sera muy importante me pondre a trabajar en esto, a ver por dondeempiezo, algo se me ocurrira.

Maunix si esto funciona seremos los padres del "PEOR PROGRAMA DERECONOCIMIENTO DEVOZ DELAHISTORIA DE LOS PICs" a que mola?
un saludo tapi8

Jeje, yo digo que va a funcionar la rutina de medición de ancho de pulsos, no dije que funcione el reconocimiento de voz!!!   :mrgreen: :mrgreen: :mrgreen:

Creo que para animarme o aventurarme a un tema así me debería poner a estudiar muy en profundo el tema.  Haciendo simples pruebas con mi guitarra de las señales generadas por un simple tono (y sus armónicos) realmente me ha asustado así que me parece que meterse en un tema así no es tan simple como parece.

Ni hablar cuando la persona te cambia de tono de voz jeje.

Saludos
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 25 de Septiembre de 2006, 13:44:49
bueno Maunix estoy empezando a hacer el programa como me has dicho tu, empece a mirar como funciona el TMR0 y vaya follon, asi que te voy a hacer unas preguntas.
1ª/ para configurar el OPTION REGISTER lo hago como con ptrp registro cualquiera?
         
         movlw      aqui pongo los bits a configurar
         movwf      option reg
2ª/ para calcular el tiempo de 10ms use la formula

        T=CI*TMR0*DF
       
Donde T=10ms, CI=1MH, df=i/256 le puse la maxima division y para esto si lo hice bien me da para el TMR0=3.90625 que aproximare a 4.este es el valor a meter en el TMR0?
3ª/ cuando se me desborde el TMR0 para saberlo tengo que hacer un btfss en el TOIF del regitro INTCON? este registro tambien lo tendre que estudiar

Mira si no funciona por lo menos voy a aprender un monton que falta me hace
un saludo tapi8


Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 25 de Septiembre de 2006, 14:59:01
bueno Maunix estoy empezando a hacer el programa como me has dicho tu, empece a mirar como funciona el TMR0 y vaya follon, asi que te voy a hacer unas preguntas.
1ª/ para configurar el OPTION REGISTER lo hago como con ptrp registro cualquiera?
         
         movlw      aqui pongo los bits a configurar
         movwf      option reg
2ª/ para calcular el tiempo de 10ms use la formula

        T=CI*TMR0*DF
       
Donde T=10ms, CI=1MH, df=i/256 le puse la maxima division y para esto si lo hice bien me da para el TMR0=3.90625 que aproximare a 4.este es el valor a meter en el TMR0?
3ª/ cuando se me desborde el TMR0 para saberlo tengo que hacer un btfss en el TOIF del regitro INTCON? este registro tambien lo tendre que estudiar

Mira si no funciona por lo menos voy a aprender un monton que falta me hace
un saludo tapi8




1) Sí, así es, es un registro como cualquier otro. 

2)

Si usas un XTAL de 4MHz, tu ciclo de instrucción será de 1useg.

Usando el prescaler en 1:256, y sabiendo que el máximo valor que puede tomar el TMR0 es 255 (por ser de 8 bits) el cálculo sería

Tmax = 256 * 256 * 1u[seg]  = 65535 useg = 65.635 mseg.

Ahora bíen para hacer al reves, para saber 'cuantos pasos' del timer deberán pasar para que hayan transcurrido 10mseg (10000 microsegundos) hacemos lo siguiente.

Tdeseado = 256 * TMR0 * 1u[seg]

TMR0 =10000 u[seg] / (256 * 1u[seg]) =  39,0625 --> tomamos 39

Como el TMR0 es un timer cuyo flag se activa por rebasamiento, para que el flag se encienda cada 10mseg, deberemos cargar en el 256-39 = 217. 

Al llegar a 256 el TMR0 se hace 0 pero enciende su flag.


3) Sí, tal cual, verificas que se ponga encendido el FLAG.  Luego haces 0 el flago,  incrementas la cuenta de tu variables, vuelves a cargar el TMR0. 





Por último si quieres mayor precisión para medir los 10mseg, puedes usar un prescaler más chico 1:32 por ejemplo con lo cual ganarás en precisión, de todas formas no creo que sea tan crítico para tu aplicación.

Saludos
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 26 de Septiembre de 2006, 09:35:32
bueno gracias de nuevo aunque voy a dejar de dartelas porque me estas metiendo en unos follones jeje. Una pregunta solo (de momento) que se me olvido ayer. Para trabajar con el TMR0 tengo que cambiar la entrada RA0 por RA4 no?

un saludo tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 26 de Septiembre de 2006, 10:17:47
bueno gracias de nuevo aunque voy a dejar de dartelas porque me estas metiendo en unos follones jeje. Una pregunta solo (de momento) que se me olvido ayer.
jeje, y bueno, así irás conociendo poco a poco muchas formas de hacer lo mismo , algunas son más eficientes que otras.  Ya podrás sacar tus propias conclusiones.

Para trabajar con el TMR0 tengo que cambiar la entrada RA0 por RA4 no?

Si lo usas como 'timer' con base de tiempo en el cristal interno no te hace falta, si lo quieres usar como contador o timer con base de tiempo externa, debes tener libre el pin que está asignado a él.

En tu caso creo lo mejor es usarlo como timer con base de tiempo el cristal interno.

Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 26 de Septiembre de 2006, 13:44:51
te refieres a tomarlo sin ser ese el tiempo que en realidad entra señal por el pon y hacer comparaciones cada vez que se produzca la interrupcion? creo que te entiendo,
otra cosa estoy mirando el registro intcon para configurarlo. Tengo que poner a 1 TOIE y tambien GIE? o solo TOIE?.Como creo que solo hay que poner 1 0 2 bits a 1 lo puedo hacer con un BSF en vez de configurarlo entero como el options.
Un comentario sobre otro tema no se si para ti o para el moderador.Buscando estos dias entre los ejemplos que hay en este subforo no vi ninguno sobre robotica yo tengo unos pocos de un curso de el robot que monte, estan comprobados, o eso dice, si os parece interesante los puedo ir subiendo

salu2 tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 26 de Septiembre de 2006, 15:02:17
te refieres a tomarlo sin ser ese el tiempo que en realidad entra señal por el pon y hacer comparaciones cada vez que se produzca la interrupcion? creo que te entiendo,

Asi es, si sigue activo el pin incrementas la cuenta.  Cuando está desactivado te fijas qué valor acumuló y de ahí sabras cuantos mseg transcurrieron.

otra cosa estoy mirando el registro intcon para configurarlo. Tengo que poner a 1 TOIE y tambien GIE? o solo TOIE?.Como creo que solo hay que poner 1 0 2 bits a 1 lo puedo hacer con un BSF en vez de configurarlo entero como el options.

Ambos.  El GIE es una máscara general que habilitará o deshabilitará TODAS las interrupciones de una sola vez, pero no habilitará las interrupciones que no estén específicamente habilitadas. 

Me explico:

Si GIE = 1,  T0IE = 0  : no hay interrupción posible de ejecutarse

Si GIE = 1,  T0IE = 1  : ocurrirá una interrupción si se activa el flag T0IF.

Si GIE = 0,  T0IE = 1  : no habrá interrupción por más que esté activo el flag T0IF.


Un comentario sobre otro tema no se si para ti o para el moderador.
Buscando estos dias entre los ejemplos que hay en este subforo no vi ninguno sobre robotica yo tengo unos pocos de un curso de el robot que monte, estan comprobados, o eso dice, si os parece interesante los puedo ir subiendo

Fijate en la sección de proyectos, creo que hay algo de información interesante.  Y si quieres aportar tu información puedes abrir un nuevo hilo.

Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 23 de Enero de 2007, 07:00:26
       bunas a todos de nuevo.


    he estado un poco liado esta temporada y ahora que tengo mas tiempo voy a ver si acabo esto que empece hace ya algun tiempo he estado repasando el hilo y como me dice Maunix se como se hace pero no tengo un ejemplo practico en el que basarme pero habra que discurrir un poco.
    me he comprado un microfono que me han garatizado que tiene calidad suficiente para el experimento.
 
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 23 de Enero de 2007, 14:51:09
Bueno tapi8 , cuéntanos como sigues avanzando y si puedo te seguiré dando una mano.

Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 19 de Marzo de 2007, 08:45:15
   
   buenas a todos de nuevo. creo que por fin esta semana voy a poder ponerme en contacto con un amigo del instituto de F.P. para ver si me dejan hacer algunas pruebas. que facil es comunicarse con alguien de argentina, colombia o venezuela y que dificil hacerlo con alguien que vive en tu misma ciudad. no se si me dejara porque como fuimos compañeros de estudios y me conoce no querra que sus alumnos me vean trabajando y cojan malos habitos laborales je je je. hasta que haga unas primeras pruebas no quiero seguir comiendome el coco porque si no funciona lo dejo y ya esta. lo que si si funcionara creo que podria conseguir que en vez de las 4 palabras entendiera hasta 16 o inluso 20. pero bueno hasta que haga las pruebas nada.os tendre informados.


       saludos tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 19 de Marzo de 2007, 10:34:55
Buenísimo! qué viejos estos post y todavía los recuerdo! el tema del control por voz  :) :) :)

Estaré  muy contento si te funciona lo que esperas te funcione  :) :)
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 20 de Marzo de 2007, 16:11:00

  buenas a todos de nuevo, y a ti maunix gracias:
 
 bueno os voy a explicar algo en relacion a esto que se me ocurrio esta mañana mientras trabajaba, como en el trabajo apenas tengo que pensar, me dedique a hacerme pajas mentales sobre este tema:
Hace un mes o algo asi intente sin mucho exito probar esto en el proteus, como no sabia como simularlo invente un circuito para tratar de hacerlo.Hice lo siguiente puse un pulsador para reemplazar lo que seria el microfono aumente la temporizacion a 1 seg. y si todo fuera bien los cuatro leds que puse en RB0, RB1, RB2, y RB3 deberian simular la secuencia de los motores del robot. El experimento fue un fracaso por diversos motivos ahora bien vosotros creeis que tiene utilidad que con un solo pulsador se le puedan dar a cualquier pic u otra cosa varias ordenesdependiendo del tiempo que este pulsado? que un sensor, final de carrera etcsegun el tiempo que este activado o desactivado el pic haga cosas diferentes?.
los sensores en general solo nos dan un cambio de estado un 1 0 un 0 pero si ese 1 o 0 dura 1 ms haria una cosa lo que qisieramos si durara 2 otra y asi sucesivamente casi si limite.
bueno pensarlo y a ver si os parace que pueda tener alguna utilidad.



saludos a todos tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: tapi8 en 22 de Marzo de 2007, 15:37:01

   buenas otra vez.
   voy a explicaros un poco mas esto del ultimo post. supongamos que tenemos 3 motores con inversion de giro y sus tipicas botoneras: paro, giro derecha e izqierda. se necesitan 3*3=9 botones, pues bueno creo que con este progama se lograria que con un solo pulsador se harian todas las funciones.
se le daria por ejemplo 2 seg de tiempo al bucle de tiempo y 2 seg pulsado seleccionaria motor 1, 4 seg motor 2, 6 seg motor 3. y enotro bucle este aun no esta acabado pero acabare de hacerlo, 2seg PARO, 4 seg GIRO DERECHA, 6seg GIRO IZQUIERDA.
como pienso hacer que reconozca 16 palabras es haciendo combinaciones de dos grupos de cuatro separados por un 0 vamos a llamarle X a la unidad de tiempo que esta a 1 la entrada y nos quedarian estas combinaciones:
X0X                                   1 orden (cualquiera)
X0XX                                 otra cosa
X0XXX
X0XXXX
XXOX
XXOXX
XXOXXX
XX0XXXX
XXX0X
XXX0XX
XXX0XXX
XXX0XXXX
XXXX0X
XXXX0XX
XXXX0XXX
XXXX0XXXX


bien esto nos daria 16 ordenes diferentes bien por voz, o por pulsador. creo que para que una persona maneje un pulsador asi lo pasaria mal, habria que traer a los telegrafistas del antiguo oeste. pero y si estes codigos, ordenes los enviara una maquina, un pic por ejemplo a otro pic, entonces los tiempos que en principio los aumentabamos, ahora podriamos rebajarlos hasta la unidad de ejecucion de instruccion. por ejenplo dos robots se podrian dar ordenes entre ellos. ordenes concretas que el que las recibe ejecutaria al momento.

 bueno contestarme para ver si os parece que esto tiene logica o estoy agilipollado.

salu2 tapi8
Título: Re: ejecutar dos instrucciones al mismo tiempo
Publicado por: maunix en 23 de Marzo de 2007, 10:46:44
Dicho de otra forma quieres controlar la acción de tus motores, por una modulación de ancho de pulso que es la que se produce en los botones.

Tu software 'mide' el ancho de esos pulsos (en pasos de 2 segundos) y actúa en consecuencia.  El control por ancho de pulsos es muy usado en varias aplicaciones, aunque los lapsos son más pequeños.

Es perfectamente viable.

Eso está claro, lo que sigo con muchas dudas es con el tema de que por hacer esas lectura uno interprete 'palabras'... pero, ya lo hemos hablado en otros posts anteriores y no tiene sentido volver a hacerlo ahora.  :)