TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: Cryn en 07 de Junio de 2007, 12:27:42

Título: Interrupciones multiples 16f
Publicado por: Cryn en 07 de Junio de 2007, 12:27:42
saludos, pues he estado revisando mis conceptos de assembler, jaja, ya llevaba polvo mi libro, y pues como he estado practicando interrupciones multiples en CCS, pues me vino la duda para aplicarlo en assembler, en ccs es sencillo ya que solo defines el tipo de interrupcion y ya el compilador te lo arrregla para cuando debe ejecutarse.

ahora en caso de assembler no existe tal ya que solo es un vector de interrupcion el que se define con org 0x04 cierto? entonces como usar otra interrupcion, la idea que tengo será de verificar los bits de si ha ocurrido un desborde por ejemplo TMROIF (de INTCON), el ADIF (de PIR1), etc, en resumen ver cual INTERRUPT FLAG se ha seteado, verdad??

es correcta mi deducción, o que mas debo hacer??

gracias.
Título: Re: Interrupciones multiples 16f
Publicado por: maunix en 07 de Junio de 2007, 12:40:35
1) Guardar el contexto o Context Saving que consiste en guardar el WREG, STATUS, y PCLATH y todo registro que sea importante que uses en el bloque principal del programa y que también uses en el código de interrupción (FSR por ejemplo)

2) Chequear qué interrupt flag está encendido.  Por supuesto solo deberás verificar los flags de las interrupciones que estás controlando, las que no estás controlando no tiene sentido verificarlas.

3) Borras el flag en cuestión (ya sea mediante un bcf o la instrucción que lo haga borrar automáticamente como es el caso de la USART que se borra el flag cuando se lee el RCREG)

4) Restauras el contexto

5) Retornas de la interrupción rehabilitado el GIE (RETFIE).

Saludos
Título: Re: Interrupciones multiples 16f
Publicado por: micro_cadaver en 07 de Junio de 2007, 12:51:19
graficando lo antes expuesto:

declarar el vector de interrupcion
(http://img185.imageshack.us/img185/1517/32104353mn0.jpg)

inicializar una interrupcion, en este caso interrupcion por intext en RB0 y timer1
(http://img78.imageshack.us/img78/237/35741013px8.jpg)

guardar y restaurar el contexto en la rutina de interrupcion, y preguntar por los bits banderines de cada interrupcion.
(http://img528.imageshack.us/img528/8541/43824567qq7.jpg)
Título: Re: Interrupciones multiples 16f
Publicado por: maunix en 07 de Junio de 2007, 12:55:07
Si bien lo que expones micro_cadaver no está mal si el pic tiene una sola página pero incluso en ese caso no veo necesidad de andar haciendo un salto en el vector de interrupción a otro lado.

Esta práctica, que no se de donde viene (tal vez de algún libro) no solo que es innecesaria, sino que también es "peligrosa" cuando el pic tiene más de una página y la interrupción salta estando en otra página de código diferente a la 0...

Saludos
Título: Re: Interrupciones multiples 16f
Publicado por: micro_cadaver en 07 de Junio de 2007, 14:47:12
claro que si, lo que puse solo funciona en una sola pagina.