Autor Tema: Midiendo el tiempo  (Leído 1990 veces)

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

Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Midiendo el tiempo
« en: 22 de Junio de 2013, 06:11:26 »
Bueno estoy con un proyecto con el PIC 16f876a,  que tengo apalancado, en los pequeños proyectos que he realizado hice una temporización de tiempo mediante bucles anidados, en el que se me va decrementando el valor de varios contadores hasta llegar a 0.
Hasta ahi todo Ok.
para este tipo de proyecto no me sirve, porque la tarea de la cpu, y el recorrido de las instrucciones estara descargando en otra tarea.
Queria saber si se puede hacer de otra forma mas eficiente. ya que la cpu va a estar en otra tarea, y simultaneamente hacer un contador interno de tiempo que no consuma instrucciones

Le pongo un ejemplo:


Iniciar Contador de tiempo
Iniciar variables a 0     ----> comprobar si tension RA = 4 v y Activar Rb0 en caso afirmativo si no bucle   ---> si RB0(ON) ¿preguntar a pasado 30seg?

si es Si  (entra en opcion1) si es NO (Entra en Opción 2)

La cuestión esque tengo que tener un control del tiempo desde que se alimenta el PIC por primera vez y si lo quiero hacer por bucles anidados decremendando el tiempo no podria hacerlo y comprobar la tensión de RA0 por el conversor A/D. ¿Hay alguna manera de llevar un control de tiempo independiente sin descargar en la tarea de la cpu?

Muchas gracias por adelantado.


Desconectado ppyote

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 929
Re: Midiendo el tiempo
« Respuesta #1 en: 22 de Junio de 2013, 07:54:50 »
Usa los timmers del pic,es en lo único que te puedo ayudar pues de ensamblador se muy poco
puedes mediante interrupciones del timmer incrementar la variable,una vez haya incrementado el valor,que el micro continúe con la labor necesaria
hasta que obtengas el tiempo deseado, dependiendo de la condición de las entradas, reseteas los contadores o inicias una acción
PPyote... siempre estareis en mi corazon.... Te quiero Hermano...

Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Re: Midiendo el tiempo
« Respuesta #2 en: 22 de Junio de 2013, 08:29:45 »
Se refiere que use los los registro de TMR0 o TMR1?
Cuando se produzca una interrupción por desbordamiento del TMR0 el programa abandona temporalmente lo que estaba haciendo para atender la subrutina de interrupción¿ no hay ningun ejemplo grafico por ahi? jeje

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Midiendo el tiempo
« Respuesta #3 en: 22 de Junio de 2013, 08:56:11 »

Citar
¿ no hay ningun ejemplo grafico por ahi? jeje

Si claro, aqui tienes ejemplos con TIMER0, TIMER1 y TIMER2

http://www.todopic.com.ar/foros/index.php?topic=24720.0

En estos ejemplos estan con interrupcion, creo recordar, si te interesa tambien los puedes usar sin interrupcion, chequeando el flag correspondiente en el programa.

Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Re: Midiendo el tiempo
« Respuesta #4 en: 22 de Junio de 2013, 09:56:38 »
Muchas gracias, voy hacer algunas pruebas ya  comento...

Por lo que he visto por encima me surgen un par de preguntas:
1º cuando hay un desbordamiento de TMR, se produce una interrupción. para declarar en ASM hay que declararla justo debajo de la instrucción org 0x04? como en este caso? o vale cualquier otro sitio?

;**** Vector de Interrupcion ****
   org   0x04      ; Atiendo Interrupcion.-
   goto   ISR
 2º  En este ejemplo, Cuando se produce la interrupción, entra en la rama del codigo de ISR, cuando  este, ejecuta toda las operaciones de ISR, ¿a donde sale, al inicio del programa, o sigue por donde estaba antes del desbordamiento?


Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Midiendo el tiempo
« Respuesta #5 en: 22 de Junio de 2013, 14:05:10 »
Citar
para declarar en ASM hay que declararla justo debajo de la instrucción org 0x04? como en este caso? o vale cualquier otro sitio?

Cuando se produce la interrupcion el programa va a 0X04 (esto lo hace el hardware del PIC), puedes hacer la rutina de interrupcion ahi mismo o en otra parte del programa, si lo haces en otra parte lo tienes que enviar mediante un goto ISR.

Citar
2º  En este ejemplo, Cuando se produce la interrupción, entra en la rama del codigo de ISR, cuando  este, ejecuta toda las operaciones de ISR, ¿a donde sale, al inicio del programa, o sigue por donde estaba antes del desbordamiento?

Cuando sale va a donde estaba cuando se produjo la interrupcion, es como si la interrupcion fuera un programa paralelo al principal que no tiene nada que ver con el resto, por eso fijate que al entrar en ISR se guardan los registros (W, STATUS y a veces alguno mas) que durante la ejecucion de la interrupcion se van a ver afectados, y al salir se vuelven a restaurar con el valor que tenian en el programa principal antes de entrar en ISR.

Desconectado isfan

  • PIC16
  • ***
  • Mensajes: 145
Re: Midiendo el tiempo
« Respuesta #6 en: 22 de Junio de 2013, 14:12:50 »
Muchas gracias por el cable, me fue de gran utilidad, y espero que a mas gente en un futuro.


 

anything