Autor Tema: Interrupciones en C  (Leído 4963 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Interrupciones en C
« en: 05 de Noviembre de 2005, 13:58:00 »
Recordarán que en ensamblador cuando estaba corriendo un programa y de repente llega una interrupción, era necesario respaldar los datos almacenados en el registro de trabajo W y STATUS, para que al regresar de la interrupción la ejecución del programa no se viera afectada.

¿En lenguaje C se tiene que hacer eso? Uso el compilador PCWH versión IDE 3.43.

Y otra duda en C, cuando se regresa de la interrupción, ¿el código resetea las flags de interrupción automáticamente?

Gracias

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: Interrupciones en C
« Respuesta #1 en: 05 de Noviembre de 2005, 14:59:00 »
Una de las ventajas de programar en lenguaje de alto nivel como es el c es que te puedes olvidar completamente de como funciona el micro internamente. De modificar los flags y dar valores a los distintos registros se encarga el compilador, tu no tienes que hacer nada.

Salu2

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupciones en C
« Respuesta #2 en: 05 de Noviembre de 2005, 15:08:00 »
Qué bien Piriots

Entonces si el PIC está escribiendo en una LCD y de repente llega la interrupción, cuando salga de ella, ¿seguirá escribiendo en la LCD como si nada?

Desconectado piriots

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
RE: Interrupciones en C
« Respuesta #3 en: 05 de Noviembre de 2005, 17:23:00 »
Hasta donde llego yo creo que asi es. Pero no sabria decirtelo seguro. A ver si se pasa por aqui alguien que controle mas que yo y nos saca de la duda.

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
RE: Interrupciones en C
« Respuesta #4 en: 06 de Noviembre de 2005, 10:45:00 »
hola compis, claro que C te guarda toda la informacion del programa que se esta corriendo cuando llega una interrupcion, en C no te tienes que preocupar de guardar esa informacion ya que lo hace automaticamente el compilador por ti. Osea, segun el ejemplo  que ponia migsantiago, si se esta ejecutando la rutina de atencion a el LCD en escritura y por medio llega una interrupcion, a no ser que la interupcion modifique algo de la rutina del  LCD, cuando volvamos de interrupcion, no tiene porque no seguirse escribiendo el LCD, es como si se hiciera una pausa y despues se continuara. Un saludo.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupciones en C
« Respuesta #5 en: 06 de Noviembre de 2005, 15:32:00 »
Gracias xerex, nos sacaste de una gran duda. Divertido

Desconectado Artifox

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 455
    • Quadbot
RE: Interrupciones en C
« Respuesta #6 en: 10 de Noviembre de 2005, 21:10:00 »
Hola a todos, algo que no me quedo claro es que si en C la interrupcion se hace en el mismo instante que llega o si se hace terminado el ultimo comando ejecutado... es decir si estoy haciendo una pausa de 5ms y en medio de esta pausa llega una interrupcion, el C lo atiende de inmediato o espera a terminar la pausa para atenderlo.

Pregunto esto, pues al hacer una interrupcion en Basic, se espera a que termine el comando para atender la interrupcion, mientras que va guardando lo que llega en memoria... La solucion para esto es hacer la interrupcion en Asembler... Por ello mi pregunta ¿Como lo hace en C?

Nos vemos Sonrisa Gigante
Video Quadbot
Saludos desde mi querido Perú.
Si realmente queremos que el mundo cambie debemos empezar por nosotros mismos... ;)

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupciones en C
« Respuesta #7 en: 10 de Noviembre de 2005, 21:45:00 »
Me declaro con la misma duda... el lenguaje C no ha de ser mágico...

Por definición, la interrupción debería ser instantánea, sin importar si el PIC va a salvar el mundo, éste debe interrumpirse y hacer otra cosa, ¿pero en C qué pasa? Sonrojado

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: Interrupciones en C
« Respuesta #8 en: 11 de Noviembre de 2005, 04:46:00 »
Hola, yo he trabajado con interrupciones en ccs y si estas haciendo una pausa (delay) y se activa una interrupción, el pic atiende esa interrupción y luego vuelve a la pausa por donde se ha quedado. Pero como el ccs genera código ensamblador, no sabría decir si internamente hace lo mismo. Quiero decir que una instrucción en ccs está compuesta por varias instrucciones en ensamblador, y si hay una interrupción no se si atenderá la interrupción inmediatamente o esperará a que acabe la instrucción en ensamblador por la que vaya... Sonrisa

Y respecto al primer post, yo tuve problemas con las interrupciones, y buscando por la ayuda del ccs encontré esto:



CLEAR_INTERRUPT( )
 

Syntax: clear_interrupt(level)
 
Parameters: level - a constant defined in the devices.h file
 
Returns: undefined
 
Function: Clears the interrupt flag for the given level.  This function is designed for use with a specific interrupt, thus eliminating the GLOBAL level as a possible parameter.
 
Availability: All devices
 
Requires: Nothing
 
Examples: clear_interrupt(int_timer1);
 
Example Files: None
 
Also See: enable_interrupts(), #INT


La interrupción en la que tuve el problema fué en la interrupción externa.
Creo recordar que lo que pasaba esque la interrupción debería de activarse varias veces, pero sólo reaccionaba el pic en la primera.
Con la instrucción anterior solucioné mi problema.

Un saludo Rebotado
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
RE: Interrupciones en C
« Respuesta #9 en: 11 de Noviembre de 2005, 07:23:00 »
Por definicion una interrupcion se ejecuta nada mas producirse. A nivel de ASM se termina la instruccion que se este ejecutando y se produce la interrupcion, si estamos en "C" y estamos en medio de varias instrucciones de ASM que forman la intruccion de "C" saltara al terminar la intruccion de ASM y aunque no haya terminado la instrucción en "C". Por otra parte el compilador CCS salva las variables al entrar en la subrutina de interrupcion, desabilita las interrupciones y al terminar recupera los registros, borra el flags de la interrupcion, habilita las interrupciones y retorna de la interrupcion. Esto lo hace de forma automatica, sin tener que añadir código. Esto posibilita el siguiente código:

#EXT_INT
ext_isr{

nValor++;

}

Incrementamos una variable dentro de la interrupcion y no hace falta borrar el flags, ni hacer retornos de interrupcion ni nada.

Solo es necesario hacer una operacion mas en la interrupcion del puerto B por nivel y es ¡¡¡¡¡antes de terminar la subrutina de interrupcion hay que leer o escribir en el puerto B!!!.
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado RaDoN

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1498
RE: Interrupciones en C
« Respuesta #10 en: 11 de Noviembre de 2005, 08:20:00 »
Escrito originalmente por jfh900

Solo es necesario hacer una operacion mas en la interrupcion del puerto B por nivel y es ¡¡¡¡¡antes de terminar la subrutina de interrupcion hay que leer o escribir en el puerto B!!!.


Comor??
Si juegas contra el mejor, pierdes como los demás.

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
RE: Interrupciones en C
« Respuesta #11 en: 11 de Noviembre de 2005, 12:38:00 »
Escrito originalmente por radon
Escrito originalmente por jfh900

Solo es necesario hacer una operacion mas en la interrupcion del puerto B por nivel y es ¡¡¡¡¡antes de terminar la subrutina de interrupcion hay que leer o escribir en el puerto B!!!.


Comor??


En el hilo siguiente esta la explicación de lo que pasa con la interrupción del puerto B por nivel:

http://miarroba.com/foros/ver.php?foroid=46840&temaid=4428090
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
RE: Interrupciones en C
« Respuesta #12 en: 11 de Noviembre de 2005, 12:39:00 »
Escrito originalmente por radon
Escrito originalmente por jfh900

Solo es necesario hacer una operacion mas en la interrupcion del puerto B por nivel y es ¡¡¡¡¡antes de terminar la subrutina de interrupcion hay que leer o escribir en el puerto B!!!.


Comor??


En el hilo siguiente esta la explicación de lo que pasa con la interrupción del puerto B por nivel:

http://miarroba.com/foros/ver.php?foroid=46840&temaid=4428090
* Cuando hables, procura que tus palabras sean mejores que el silencio.
* 'Todos somos ignorantes, lo que ocurre es que no todos ignoramos las mismas cosas.' Albert Einstein.
* No hay nada peor que un experto para evitar el progreso en un campo
* "La vida es como una novela. No importa que sea larga, sino que esté bien narrada" Seneca
* La vida no se vive por las veces que respiras, sino por los momentos que dejan sin aliento.
* Dios dijo: ∇·E=ρ/ε0 ; ∇·B=0 ; ∇xE=-dB/dt ; ∇xB= μ0ε0dE/dt..y la luz se hizo..!!..

Desde España Jesús

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
RE: Interrupciones en C
« Respuesta #13 en: 11 de Noviembre de 2005, 17:02:00 »
Entendido jfh Sonrisa

El coach, ¿de qué versión sacaste esa instrucción? Yo tengo la ccs 3.43 y no existe. Sonrojado

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: Interrupciones en C
« Respuesta #14 en: 12 de Noviembre de 2005, 10:19:00 »
Mi versión del ccs es la 3.221.
He mirado la última versión existente del ccs en su página y es la 3.239 , revisa la versión de tu compilador porque no me cuadra que sea la 3.43 Giño

Gracias por la aclaración JFH, un saludo a tod@s
"Hazlo o no lo hagas, pero nunca lo intentes"