Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas a todos
Voy a tratar de usar las interrupciones en un 16f877 y necesito un poco de ayuda, alguien conoce de algun link o manual en el que pueda informarme de en primer lugar en que consisten las interrupciones en un PIC y en segundo lugar como aplicarlas con CCS.
Es decir segun el manual de CCs he visto algunas intrucciones relativas a esto, pero no están nada claras, lo que yo conozco a nivel mas interno respecto a otros sistemas (que me imagino que serán portables) es que cuando realizas una interrupcion internamente en el micro el programa salta a una direccion fisica y real determinada y apartir de ahí empiezas a picar el codigo, si te lo haces todo en lenguaje maquina tienes que guardar el estado de los flag anterior al salto, bla bla bla... ahora leo que existen varios tipos de instrucciones sobre interrupciones en el ccs, entiendo que al igual que en otros sistemas las interrupciones podrian ser por flanco ascendente, descendente, temporizadas (y en determinados sistemas por cambio de flanco), en fin esto me imagino es igual pero es a muy groso modo, me ha parecido entender que en CCS existen ¿instrucciones para programar interrupciones de contador?, bueno hasta ahora lo que habia usado siempre para realizar un conteo es programar una interrupcion por flanco, y una vez hecho el salto a partir de esa direccion de memoria picar un incremento a una variable (la de conteo o contador) y volver a la direccion anterior al salto (asegunrandome de dejar todos los flag como estaban antes del salto) ahora con los PIC no se muy claro como iria ¿existe una instruccion especifica que realiza todo esto en el CCS? o existe alguna entrada hardware que se le pueda asignar esta funcion mientras el programa sigue corriendo, imagino que nó, que sea cual sea el metodo, el programa se parará hará el conteo y continua... en fin lo que estoy probando es hacer un conteo dentro de un recorrido determinado y ademas quiero implementar una señal NOT (Negative OverTravel) y POT (Positive OverTravel) es decir finales de carrera mediante interrupcion, es decir simplificando más necesito un contador por flanco y dos interrupciones de libre programacion por Flanco. o en su defecto tres de estas.
Como es evidente que no estoy muy puesto en el tema, no quiero aburrir a nadie y por eso solicito algun link o manual donde esto se explique con mas o menos detalle y a ser posible acompañado de ejemplos.
SALUDOS Y GRACIAS
Asias a los dos.
NO, no me he debido de expresar bien, si yo me referia que si hago por programa SIN interrupciones este contador la posibilidad de saltarme una maquina es directamente proporcional al ciclo de programa, además tendria que meter las lecturas de las marcas en un lazo y confiar en que no esté mal hecho, Por ejemplo en el mismo programa tengo una secuencia en la que segun una condicion ejecuto unos diez pasos donde hago pausas de 250 ms entre cada uno es decir 2,5 seg, asi que si esa condicion se cumple es muy probable que aparezca la marca en ese momento no detectandola, ahora bien si lo hago por interrupcion ya se yo que no hay problema pues esté donde esté saltaré a la interrupcion.
Gracias, probare con lo que me comentais para usar las interrupciones, en primer lugar comenzaré por la de RB que es la que necesito, la del timer la dejaré para cuando éstas estén controladas para hecharle un ojillo.
En cuanto a que vienen en el manual de CCS, ya lo comentaba yo, pero la verdad el manual no es mas que un listado de instrucciones deslocalizadas que yo almenos no consigo aclararme del todo
Lo que tienes que hacer es un programa "pseudo multitarea". El que hagas unas pausas de n milisegundos NO significa que tengas que dejar de procesar el resto del programa. Solo tienes que suspender por n milisegundos los procesos que quieras, pero seguir conprobando las entradas y los demás procesos que no has suspendido.
Si tienes práctica con C puedes ver los fuentes de mi programa LaserGame:
http://heli.xbot.es/Laser_game/lasergame2.htm
Verás que, aunque tiene muchas temporizaciones para diversos usos, nunca se detiene en un bucle temporizando, los temporizadores corren el una interrupción y en main, si no han terminado de contar, no proceso las líneas correspondientes, pero siempre proceso todo lo demás, control de teclado, comunicaciones etc.
Que dificil es editar con prisas, ya me he liado con los botones de editar y he duplicado el post!!
Lo que tienes que hacer es un programa "pseudo multitarea". El que hagas unas pausas de n milisegundos NO significa que tengas que dejar de procesar el resto del programa. Solo tienes que suspender por n milisegundos los procesos que quieras, pero seguir conprobando las entradas y los demás procesos que no has suspendido.
Si tienes práctica con C puedes ver los fuentes de mi programa LaserGame:
http://heli.xbot.es/Laser_game/lasergame2.htm
Verás que, aunque tiene muchas temporizaciones para diversos usos, nunca se detiene en un bucle temporizando, los temporizadores corren el una interrupción y en main, si no han terminado de contar, no proceso las líneas correspondientes, pero siempre proceso todo lo demás, control de teclado, comunicaciones etc.
Pero en un PIC se pueden hacer programas multitarea???
Pero en un PIC se pueden hacer programas multitarea???
Sí y no,
Es un recurso de programación (un árbol de estados), se programa un bucle principal que controle el estado de cada uno de los "hilos" de programación y los hilos no pueden detener nunca el programa.
Un ejemplo (en pseudocódigo C) :
int state1, state2, state3;
void main()
{
state1=0;
state2=0;
state3=0;
while(1) //Para que el programa no termine
{
Hilo1();
Hilo2();
Hilo3();
//(...)
}
}
void Hilo1()
{
switch(state1)
{
case 0: // estado de reposo
if(cambio a estado 1)
{
Operacion1(); //Operaciones que tiene que hacer el hilo1 en el estado 1
state1=1;
}
else if(cambio a estado 2)
{
Operacion2(); //Operaciones que tiene que hacer el hilo1 en el estado 2
state1=2;
}
break;
case 1:
if(cambio a estado 0)
{
Operacion0(); //Operaciones que tiene que hacer el hilo1 en el estado 1
state1=0;
}
else if(cambio a estado 2)
{
Operacion2(); //Operaciones que tiene que hacer el hilo1 en el estado 2
state1=2;
}
break;
case 2:
if(cambio a estado 0)
{
Operacion0(); //Operaciones que tiene que hacer el hilo1 en el estado 1
state1=0;
}
else if(cambio a estado 1)
{
Operacion1(); //Operaciones que tiene que hacer el hilo1 en el estado 2
state1=1;
}
break;
//(...)
default: // error
Error(1);
}
}
//(...)
A partir de esta forma de programación se pueden crear hilos y subhilos de funcionamiento, y todos los estados y subestados que nos hagan falta (y que el micro soporte). Sobretodo en las funciones "Operacion" no se debe nunca detener el hilo del programa, para no relantizar el mismo.
S2
Ranganok Schahzaman