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
vcs, en un pic hay varios tipos de interrupciones:
- Interrupción externas: generalmente el puerto RB0
- Interrupción de teclado: generalmente el puerto RB4-8
- Interrupción de Timers: por desbordamiento de un contador.
- Interrupción de USART: cada vez que se transmite/recibe un byte por puerto serie, I2C,...
- Interrupción de entrada analógica: cuando se ha terminado de hacer la conversión de un valor en el ADC.
- ...
Por lo que parece tu lo que necesitas es una interrupción provocada por un cambio de estado en un pin (o en 3) por lo que te recomendaría que usaras la interrupción de teclado y la definieras según necesitaras (flanco de subida o flanco de bajada).
S2
Ranganok Schahzaman
¿Que diferencia existe entre la externa y la de teclado?
Es decir cada una de mis interrupciones serán independiente al resto y ademas por topografia del sistema nunca se daran al mismo tiempo, cada una tendrá su propio sensor, cuando se active una de ellas ha de incrementar un contador, lo que sucede es que esta señal será activada por una fotocelula cromatica o un inductivo al paso por una determinada marca, pero esta marca va a toda leche por eso he de asegurar su lectura mediante una interrupcion, por otro lado los finales de carrea al tratarse de seguridades al igual que la marca han de ser por interrupcion de esa forma si mi movil se sale del recorrido esperado mediante la interrupcion haré una parada de emergencia y que solo permita mover en el sentido contrario para llevar de nuevo al movil a su recorrido nominal, por ejemplo podria usar la externa para el contador y las de final de carrera mediante la de teclado (supongo), en todos los caso supongo que lo que se hace es un salto a una parte de codigo y luego vuelta al principal por donde lo dejara.
La externa se produce sólo por la línea RB0.
La de teclado se produce por cualquiera de las líneas RB4 a RB7
Muy rápido tiene que ir para ganar a un micro a 20MHz.
S2
Ranganok Schahzaman
LAs interrupciones en C de CCS se usan así:
//=============================================================================
// interrupcion de cambio de estado del puerto B
#int_RB
RB_isr()
{
static int8 Encoder;
Encoder=input_b (); // Lee todas las entradas de encoder a la vez
}
//=============================================================================
// interrupcion cada 6.55 ms
#int_TIMER0
TIMER0_isr()
{
// output_low(PIN_B0); // Test de velocidad poner en tris_b salida
PosicionI+=PulsosI; // para 7,2 V de bateria = 5,5 V motor = 5Khz encoder
VelocidadI=PulsosI*2; // Para 5khz * 4 cuenta 131 pulsos en 6.55 ms
PulsosI=0; // El rango va de +262 a -262 pulsos aprox.
PosicionD+=PulsosD;
VelocidadD=PulsosD*2; // Antes <<=1 pero se pierde el signo...
PulsosD=0;
ProcesaPID=1;
// output_high(PIN_B0); // Test de velocidad poner en tris_b salida
// Esto tardaba 12 us en completarse
la directiva #int_RB hace que el compilador sepa que tiene que activar, en el micro, la interrupción de cambio del puerto B, y que la tiene que enlazar con la función RB_isr(). Esa función se ejecutará cada vez que salte la interrupción. Lo mismo para #int_TIMER0 y TIMER0_isr()
En el manual de CCS se explican todas las posibles interrupciones de cada micro.
Yo uso la interrupción #int_RB para leer unos encoder y lee los pulsos correctamente hasta 5Khz, no he probado a velocidades superiores porque no he tenido necesidad. Con un PIC a 20Mhz es dificil tener problemas de tiempo...