Autor Tema: Tratamiento de interrupciones.  (Leído 3101 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado McAstur

  • PIC10
  • *
  • Mensajes: 3
Tratamiento de interrupciones.
« en: 21 de Enero de 2008, 15:32:50 »
Estoy haciendo un proyecto con un 16f877, uso la interrupcion RB para detectar cambios en las entradas de ese puerto y querria saber como trata el pic dicha interrupcion. Me gustaria saber que hace el pic si mientras esta procesando la interrupcion RB se produce otro evento en el port B. ¿Lo ignora, termina el tratamiento anterior y trata el nuevo evento o se "apila" la interrupcion para tratarla en cuanto termine el tratamiento de la anterior?

Un saludo.

Desconectado GAME

  • PIC10
  • *
  • Mensajes: 9
Re: Tratamiento de interrupciones.
« Respuesta #1 en: 21 de Enero de 2008, 17:22:07 »
Bueno lo primero decirte que el PIC funciona secuencialmente, es decir que solo puede estar leyendo un codigo a la vez. Cuando salta una interrupción el pic almacena el puntero donde estaba leyendo el programa principal y ejecuta la solicitud de interrupción. Todo lo demás lo ignora y solo ejecuta el codigo de la interrupción. Si salta otra interrupción pueden occurir 2 cosas:
1- si la interrupción es de menor prioridad la ignora (creo que depende de los pics)
2- si lla interrupción es de mayor prioridad almacena de nuevo el puntero y empieza a leer el nuevo codigo de interrupción.

Luego el PIC ira resolviendo las interrupciones que han ido sucediendo. Si no recuerdo mal suelen ser maximo x punteros de almacenamiento. Es decir que si salta una interrupción sobre otra podra succeder un máximo de x veces, dependiendo de nuevo del PIC.

Espero haberme explicado con claridad, si tienes alguna duda vuelve a preguntar...


Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5544
    • Picmania by Redraven
Re: Tratamiento de interrupciones.
« Respuesta #2 en: 21 de Enero de 2008, 17:40:50 »
Un ejemplo de uso de la interrupción por cambio en el puerto B lo tienes en Midiendo un pulso. 3ª Parte. Tiempo en Alto con INTRB

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado McAstur

  • PIC10
  • *
  • Mensajes: 3
Re: Tratamiento de interrupciones.
« Respuesta #3 en: 21 de Enero de 2008, 18:18:19 »
Bueno lo primero decirte que el PIC funciona secuencialmente, es decir que solo puede estar leyendo un codigo a la vez. Cuando salta una interrupción el pic almacena el puntero donde estaba leyendo el programa principal y ejecuta la solicitud de interrupción. Todo lo demás lo ignora y solo ejecuta el codigo de la interrupción. Si salta otra interrupción pueden occurir 2 cosas:
1- si la interrupción es de menor prioridad la ignora (creo que depende de los pics)
2- si lla interrupción es de mayor prioridad almacena de nuevo el puntero y empieza a leer el nuevo codigo de interrupción.

Luego el PIC ira resolviendo las interrupciones que han ido sucediendo. Si no recuerdo mal suelen ser maximo x punteros de almacenamiento. Es decir que si salta una interrupción sobre otra podra succeder un máximo de x veces, dependiendo de nuevo del PIC.

Espero haberme explicado con claridad, si tienes alguna duda vuelve a preguntar...



En este caso seria la misma interrupcion intRB por lo que la prioridad no puedo usarla. En mi caso me vendria muy bien que se abortase el tratamiento de una interrupcion cuando llegase otra igual...

Ejemplo ficticio:

Empezamos con todas las entradas del portB a 0.

#int_RB
RB_isr()
{
     if (PORTB.4==1 && PORTB.5==0) while(true); // Si llega un pulso en el pin 4 entra en un bucle infinito (a la espera de otra condicion)
     else if (PORT.4==1 && PORTB.5==1) printf(lcd.putc,"\fSe acabo el ciclo infinito"); // El pin 5 se pone tambien a 1, se activa de nuevo la interrupcion y se trata.
}

¿En este caso que pasaria? ¿Saldria del ciclo infinito o simplemente mostraria el mensaje en el lcd y seguiria bloqueado?

Gracias por contestar.

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Tratamiento de interrupciones.
« Respuesta #4 en: 21 de Enero de 2008, 18:54:18 »
Con #PRIORITY puedes dar mayor prioridad a una interrupcion en particular. Mira la ayuda del CCS.

Syntax:
 #priority ints
 
Código: [Seleccionar]
Elements:
 ints is a list of one or more interrupts separated by commas.

export makes the functions generated from this directive available to other compilation units within the link.

Purpose:
 The priority directive may be used to set the interrupt priority. The highest priority items are first in the list.  If an interrupt is active it is never interrupted.  If two interrupts occur at around the same time then the higher one in this list will be serviced first.  When linking multiple compilation units be aware only the one in the last compilation unit is used. 
 
Examples:
 #priority rtcc,rb


salu2 8)
 

Desconectado GAME

  • PIC10
  • *
  • Mensajes: 9
Re: Tratamiento de interrupciones.
« Respuesta #5 en: 21 de Enero de 2008, 19:49:48 »
EDITO:
No conocía la particularidad de este bit, como te ha puesto RedPiC. Pues como dice el enlace esta muy bien explicado, deberias en el caso de entrar en la interrupción desabilitar la misma, poner el if que active un flag en el programa principal y luego desactivarlo en el otro caso. Finalmente acordarte de reactivar la interrupción al final del codigo.
Lo mejor tb es solo usar como entrada RB.4 y RB.5 porque sino tendras problemas con los otros puertos RB.6 y RB.7 que se activaran tambien  y te daran problemas...
Un Saludo
« Última modificación: 21 de Enero de 2008, 20:10:35 por GAME »

Desconectado McAstur

  • PIC10
  • *
  • Mensajes: 3
Re: Tratamiento de interrupciones.
« Respuesta #6 en: 21 de Enero de 2008, 20:58:43 »
Lo que me interesaria saber es que pasaria en el caso que he puesto, si saldria del bucle o quedaria en un bucle infinito.

Desconectado GAME

  • PIC10
  • *
  • Mensajes: 9
Re: Tratamiento de interrupciones.
« Respuesta #7 en: 21 de Enero de 2008, 22:43:15 »
Bueno si no desabilitas la interrupción cada vez que se ejecute volvera a entrar en la interrupción, por lo tanto teoricamente debería de salir del bucle cuando se realice una interrupción. Aunque los bucles infinitos en las interrupciones son impredecibles...