no se si entendi bien. voy a colocar un programa base
#include <18f4550>
Librerias
//funciones para la interrupcion
timer_0()
{ ////los numeros (1,2,3) son referencia para poder explicar la duda
timer_desactivado();
1.-) Bit_clear (INTCON,2); // Limpio el bit;
2.-) Set_RTCC (255); //Permite el conteo de pulsos // los 255 es una referencia para el ejemplo, es //puede cambiar de acuerdo al numero de pulsos que se necesti para llegar a los grados deseados por el usuario;
3.-) While (!toif); // Continua leyendo hasta que la bandera sea = 1;
}
main()
{
configuracion de puertos
configurarion de contadores
form (;
{
//programacion de otras rutinas por ejemplo recibir la cantidad de grados deseados
// por el ususario;
// Se hace el calculo del valor que debe ir al codigo ( 2.-) Set_RTCC (255)
para llegar a los grados deseados
// se activa los motores
// activo el timer_activo; () permite verificar si el llego el pulso en un tiempo prudencial de los contrario desactiva el sistema;
}
}
como puedes ver es dificil llevar un seguimeinto de los pulsos;
Me escribes en la ultima parte :
"Lo que puedes hacer es utilizar el concepto de Timeout, osea activar el motor y esperar un tiempo máximo a que ocurra la interrupción que indica que ha terminado el giro, si esto no ocurre entonces abortar todo el proceso he indicar al usuario que ha ocurrido un problema."
// realmente no comprendo el concepto de timerout en una interrupcion del timer, ya que si activo el motor debo leer el encoder, no se realmente si me estoy complicando en el programa, pero esto lo estoy haciendo por seguridad de la antena en caso de una falla y para alertar al usuario de la misma.
// como lograr un timerout (muevo la antena, pero a la vez estoy leyendo el encoders) , es decir (el codigo (1.-)Set_RTCC (255); ) se encuentra calculado para recibir una cierta cantidad de pulsos, miestras esta haciendo el conteo se puede hacer una interrupción durante ese codigo, en caso de que no llegue a los pulsos deseades?
Porque este codigo ((1.-)Set_RTCC (255)
, siempre va a esperar hasta que lleguen todos los pulsos, me gustario mejorar esta parte del codigo, porque quiero que verifique que son los grados deseados por el usuario y si realmente llegaron todos los pulsos, no que se quede esperando.
lo ideal seria es que despues de un tiempo prudencial si los pulsos no llegan , enviar una señal "falla en la antena" y a su vez indicarle al usuario los grados en que quedo la antena.
Suky, traté de analizar tu respuesta pero me llego a la misma duda que tenia anteriormente.
Este es el codigo por interrupcion
#include 18f4550
librerias
//funciones
timer_activo()
{
////rutinas
}
timer_desactivado()
{
// permite cancelar el timer_activo();
}
#INT_EXT
EXT_ISR()
{float dato_pulso;
Ocurre la interrupción
dato_pulso = dato_pulso + 0.001;
// timer_desactivado();
if (dato_del_usuario == dato_pulso )
{ //detener los motores
}
// se activa un timer_activo(); //conteo del tiempo en tarda la interrucpion (si se sobrepaso del tiempo desactiva todo el sistema)
// continua el conteo de acuerdo al numero de interrupciones
}
main ()
{dato_pulso = 0;
//configurarción de puertos;
// configurarion de interrupciones;
for (;
{
/// En esta parte del programa recibo la cantidad de grados
// hago los calculos de cuantos pulsos se necesita para lograr los pulsos deseados
// Programación que permite saber el sentido del motor
// Activo los motores (automaticamente se genera una interrupcion)
// sin embargo el programa tiene un timer que permite saber si hubo una interrupción, es decir, si llegan los
// pulsos en un tiempo prudencial , que de ser así no existe problema, pero si es lo contrario le indica al usuario que la antena no se movio por que no hubo una interrupción y cancela todo el sistema (energia o la alimentación de los motores y por supuesto del mismo micro para evitar un corto y la unica forma de restaurar el sistema es que un tecnico vaya hasta la antena y verifique motores, encoder, y los circuitos).
// nota: El pic ya sabe que cada pulsos que llegue, es equivalente a 0.001°.
}
}