Autor Tema: Ayuda con TMR0  (Leído 8275 veces)

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

Desconectado glibrera

  • PIC10
  • *
  • Mensajes: 13
Ayuda con TMR0
« en: 15 de Julio de 2008, 12:33:44 »
Hola Gente, este es mi primer post, soy lector del foro y me ha servido de mucho.
Hace bastante que programo Pics pero nunca utilice el TMR0 y no encuentro un ejemplo claro, por lo menos para lo que necesito hacer.
Si alguien me puede tirar un ejemplito se lo agradecería de corazón.
Uso el PIC16F628 con un Crystal de 20Mhz, necesito medir el paso de un objeto por dos sensores (phototransis), para que tengan una idea, el objeto demora en pasar entre sensor y sensor unos 500ms o menos y estoy haciendo la detección con un bucle con pauseus=10 pero se me escapa.
Me han comentado que use el TMR para detectar el paso por el primer sensor y comenzar un contador que solo se detenga al activarse el segundo sensor y luego obtenga el tiempo transcurrido (como un cronometro) en una variable.
Tengo conectado un sensor a cada pin del Pic.

Espero alguien me pueda pasar algún ejemplo de como hacer esto.
Utilizo PicBasic con el Microcode Studio.

Esto es lo que tengo:

Loop:
    IF PORTA.1=1 THEN ' comienza contador
        ok=1
        cuenta=0
    endif
    IF PORTA.2=1 THEN ' detiene contador
        ok=0
        gosub mostrarcuenta
        pause 1000
    endif   
 
    if ok=1 then
        cuenta=cuenta + 1
        if cuenta=999 then
            GOSUB BORRAR
            HIGH PORTA.0
            HIGH PORTA.3
            HIGH PORTB.7
            high PORTB.6
            pause 500
            LOW PORTA.0
            LOW PORTA.3
            LOW PORTB.7
            LOW PORTB.6
            gosub Reset
        endif
    endif   

    pauseus 9

goto loop


Saludos y Gracias.



Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Ayuda con TMR0
« Respuesta #1 en: 15 de Julio de 2008, 13:01:04 »
Lo que necesitas es configurar el TIMER0 o el TIMER1 como contador, de modo que en lugar de contar el tiempo, cuente el paso de los objetos, tendrías primero que revisar bien los dataseets del PIC y mojarte en el modo en que trabajan, para que puedas comprender cualquier ayuda que te podamos dar por acá.

Saludos
Reinier

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Ayuda con TMR0
« Respuesta #2 en: 15 de Julio de 2008, 15:25:11 »
Glibrera, bienvenido al foro!

Reinier, no entiendo tu respuesta. Según lo que menciona glibrera, me parece que necesita es un temporizador.
Lo digo por esto:
Me han comentado que use el TMR para detectar el paso por el primer sensor y comenzar un contador que solo se detenga al activarse el segundo sensor y luego obtenga el tiempo transcurrido (como un cronometro) en una variable.

Ahora bien, de que se tiene que empapar del funcionamiento del timer leyendo la datasheet, de eso no hay duda.
Glibrera, creo que vas a tener que usar código ensamblador insertado en basic, porque creo recordar que Pic Basic Pro no tiene funciones para manejo de temporizadores. Así que tendrías que usar las directivas ASM, ENDASM.
Así:
Código: FreeBasic
  1. '
  2. 'codigo en Basic
  3. '
  4. ASM
  5. ;
  6. ;codigo en assembler
  7. ;
  8. ENDASM
  9. '
  10. 'Sigue el código en Basic
  11. '
Revisa la datasheet para que veas cómo configurar el timer. Eso tendrás que hacerlo en ensamblador.

Cuando detectes el primer sensor (lo haces mediante código BASIC) insertas código assembler para iniciar el timer.
Luego cuando detectes el otro sensor nuevamente en ensamblador ves el valor del timer y lo guardas en una variable.
Esa variable la puedes declarar en Basic y luego en ensamblador la usas con un "_" delante.
Por ejemplo, declaras:
Código: FreeBasic
  1. tiempo Var BYTE
Y luego en ensamblador usarías "_tiempo".

Ok espero esto te ayude.
Un cordial saludo, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Ayuda con TMR0
« Respuesta #3 en: 15 de Julio de 2008, 16:05:28 »
Entonces tendría que utilizar los módulos de captura, digo si persigue que su sistema sea rápido, y por supuesto si BASIC no tiene funciones para manejar estos periférico una de cuatro:

Lo hace en en ensamblador y BASIC
Se escribe sus propias funciones en BASIC
Se cambia de compilador
O hace todo en ASM (esta es la que menos recomiendo)

Desconectado glibrera

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con TMR0
« Respuesta #4 en: 15 de Julio de 2008, 16:14:54 »
Gracias por las respuestas!, pensé que desde Basic podía utilizar los timers sin problemas :(...
Estaba pensando si no me conviene utilizar una interrupción (ONINTERRUP o algo así) para inicio y fin de un contador.
Al activarse sensor, activa interrupción y salta a un loop que almacene incrementalmente en una variable el numero de vueltas, al volver a activarse la interrupción (el otro sensor) sale del loop y muestra el resultado de la variable, para este caso los sensores irían en paralelo ya que trabajarian con un solo pin del pic.
Se podrá hacer algo asi?.

Gracias! :)

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Ayuda con TMR0
« Respuesta #5 en: 15 de Julio de 2008, 16:15:01 »
Buena idea, yo votaría por la primera opción, si es que ya el tiene experiencia con el basic, pues dice que tiene tiempo programando PICs.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Ayuda con TMR0
« Respuesta #6 en: 15 de Julio de 2008, 16:24:31 »
Pues si, con interrupciones es la mejor forma de trabajar para hacer una detección eficaz del momento exacto en que se activa el sensor.
Entonces podrías habilitar la interrupción por cambio en RB4:RB7, ya que son dos sensores distintos.
Y tendrás que meterle código ensamblador a tu programa, o como te mencionó reinier, hacer tus propias funciones en basic, trabajando con código basic pero a bajo nivel.
No olvides subir tus avances a ver qué tal vas...
Un saludo, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado reiniertl

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1187
Re: Ayuda con TMR0
« Respuesta #7 en: 15 de Julio de 2008, 16:35:42 »
Si el PIC solo lo vas a utilizar para atender a estos dos sensores y nada más, bueno no es que no sirva, pero yo no apostaría por una solución de esas, creo que vale la pena utilizar IT+TIMER o CCP+IT, aunque ello implique hacer mis propias funciones en BASIC, que si no tiene las funciones creo que se puedan hacer sin tener que ir a morir con el señor ASM, porque seguro que al menos puedes leer y escribir cualquier dirección de la RAM del PIC, y por supuesto cambiar el bit que quieras a un byte, luego entonces con un datasheet en la mano y el compilador de BASIC en la otra te haces la función o subrutina que te guste más.

Saludos
Reinier

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Ayuda con TMR0
« Respuesta #8 en: 15 de Julio de 2008, 16:53:41 »
Gran Reinier, totalmente de acuerdo. Mejor imposible.  :lol:
A ver qué resuelve hacer glibrera al respecto.
Saludos, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado glibrera

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con TMR0
« Respuesta #9 en: 15 de Julio de 2008, 16:58:01 »
Muchas Gracias, realmente conocen mucho del tema!, voy a realizar algunas pruebas para ver si lo puedo hacer con la ultima opcion del amigo Reinier.

Saludos!.

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ayuda con TMR0
« Respuesta #10 en: 15 de Julio de 2008, 18:16:34 »
Normalmente no me suelo meter por medio cuando se trata un lenguaje que no domino.
Pero este lenguaje si no recuerdo mal, hace un uso un tanto particular de las interrupciones, cuando se produce una interrupción en la mayoría de lenguajes de alto nivel se termina de ejecutar la instrucción maquina y luego se salta a la rutina de interrupciones, pero en este Basic al parecer lo que hace es terminar la sentencia Basic, la cual puede estar compuesta de muchas instrucciones maquina antes de saltar a tal rutina. Esto puede falsear el contador del timer utilizado. No es fácil lograr utilizar las interrupciones de una forma adecuada en este lenguaje. El lenguaje tiene una gran cantidad de funciones muy variadas, puede que ya tenga alguna que haga esto sin necesidad de utilizar las interrupciones.

Y todos los lenguajes suelen admitir el nombre de los registros internos del PIC, me extraña que este no los admita para cambiar o leer valores directamente sin necesidad de utilizar líneas en Assembler. De todas formas seguiré el hilo, ya que tengo especial interés en ver como se desarrolla, así que suerte.
Saludos desde Granada, España.

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Ayuda con TMR0
« Respuesta #11 en: 15 de Julio de 2008, 18:54:48 »
El maestro dogflu tiene toda la razón.
Pic Basic Pro termina la instrucción basic y luego va a la rutina de interrupción, si lo haces por interrupción con basic. Lo más probable es que eso no te sirva, ya que debes medir un tiempo corto, así que la exactitud es un factor crítico.
Retomo entonces la idea de usar el mismo basic pero haciendo uso de código ensamblador, así puedes ser más preciso; pero haciendo uso de interrupción en ensamblador deberás guardar los registros de estado, contador de programa, etc... y después retornarlos cuando termine la interrupción. El manual de Pic Basic Pro trae un ejemplo de cómo hacerlo. El detalle es que quizá al final tengas más código en ensamblador que en basic.

En cuanto a esto:
Y todos los lenguajes suelen admitir el nombre de los registros internos del PIC, me extraña que este no los admita para cambiar o leer valores directamente sin necesidad de utilizar líneas en Assembler.
Es totalmente cierto. Si quieres usar los registros del pic los puedes usar tal cual, en basic o en ensamblador. El detalle de la línea es cuando son variables que se van a usar tanto en basic como en código ensamblador.

Tal vez a glibrera le convendría más cambiar de compilador por uno más poderoso que te permita hacer uso eficaz de las interrupciones.
Un cordial saludo, nos leemos!  :mrgreen:
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado glibrera

  • PIC10
  • *
  • Mensajes: 13
Re: Ayuda con TMR0
« Respuesta #12 en: 16 de Julio de 2008, 10:09:01 »
Muchas gracias por el dato!, yo pensé que al detectar la interrupción directamente saltaba a "x" rutina, pero si es como uds. dicen, no me sirve utilizar interrup en Basic, ya que los tiempos son muy criticos en este proyecto, voy a tener que aprender asm o bien buscar alguna forma para hacerlo en Picbasic sin usar interrup. :?
Saludos!

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Ayuda con TMR0
« Respuesta #13 en: 16 de Julio de 2008, 10:22:54 »
En Basic sin interrupciones no creo que sea posible. Ahora bien, cuando dices: "no me sirve utilizar interrupciones en Basic", creo que ahí estás en un error. A lo que hizo alusión el maestro dogflu es a cómo trata las interrupciones el Pic Basic Pro. Hay otros compiladores de basic más potentes que hacen un mejor uso de las interrupciones. Yo te aconsejaría cambiarte de compilador. Porque en assembler tienes más precisión, pero se te va a complicar más todo a la hora de enviar a LCD, o cualquier otra interfaz que quieras hacer.
Probablemente el maestro dogflu podría decirnos si el PSI permite las interrupciones mejor que el PBP, ya que el es ducho en ese soft.
O tal vez te convendría el mikroBasic... le he dado una mirada y se ve muy bueno.
Saludos, nos leemos!  :mrgreen:
« Última modificación: 16 de Julio de 2008, 16:36:26 por firepic »
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3549
Re: Ayuda con TMR0
« Respuesta #14 en: 16 de Julio de 2008, 16:30:48 »
Hay muchos lenguajes de alto nivel que hacen un trato adecuado a las instrucciones y el Basic del PSI se encuentra entre ellos, incluyendo la famosa instrucción Basic “Save System” que guarda los valores intermedios de todos los registros internos de operación del compilador.
Saludos desde Granada, España.