Autor Tema: Como llamar una función desde una interrupción, dentro de una librería en CCS  (Leído 5545 veces)

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

Desconectado falflores

  • PIC16
  • ***
  • Mensajes: 173
    • Control, electrónica y programación en español
Hola de nuevo amigos foreros, les vengo a compartir mis problemas con una libreria que me encuentro armando, para el uso de un teclado PS2 con PIC, el código en su mayoria ha sido desarrollado por otra persona, pero lo que yo quiero es convertirlo en una librería que se pueda añadir a cualquier programa, solo que se me han presentado un para de dudas que espero alguien me pueda aclarar.

Esta librería necesita el uso de la interrupción externa por RB0, y llega un momento en el que después de leer 11 bits, debe acceder a las tablas de decodificación para determinar que tecla se oprimio, bien, de por si esta interrupción es bastante larga, y para la decodificación se debe llamar a una función llamada decode(); lo cuál me genera un warnning debido a la llamada de una función dentro de la rutina de interrupción. Lo que normalmente hago dentro de una interrupción es activar una bandera, y en la función main() hago lo que se deba hacer, pero en este caso no puedo hacer eso, debido a que en la libreria no existe el main()

Una solución a simple vista, es que el usuario chequee esa bandera desde su main() y mande entonces a la función decode(), pero esta solución no es viable, ya que perdería el sentido manejar una libreria independiente. Otra sería meter todo el código dentro de la interrupción, pero dicha interrupción quedaría extremadamente grande y se tardaría muchísimo en atender.

La pregunta es: Sabe alguien como puedo saltar a esa función desde mi interrupción conservando la independencia de mi libreria?, se que suena imposible, pero no pierdo la esperanza.

Agradezco a toda la gente que pueda proporcionarme conocimiento nuevo y respuesta a mi pregunta. Gracias!!!
« Última modificación: 13 de Noviembre de 2011, 06:03:43 por falflores »
Los invito a mi blog "Control, electrónica y programación en español" www.robotnias.blogspot.com

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Como llamar una función desde una interrupción, dentro de una librería en CCS
« Respuesta #1 en: 13 de Noviembre de 2011, 07:17:39 »
Hola. No conosco la libreria, pero puedes hacer algunas cosas:

1. Crea la bandera en la misma libreria pero que sea glogal, asi, en tu while verificas esa variable y llamas a decode(). Cabe decir que para que esto sea mas independiente, dicha variable debes ponerle de nombre algo como PS2_Flag_ISR o algo asi.

2. Si tu micro es rapido y ese decode() o en si toda la interrupcion RB0 no sobrepasa un tiempo excesivo, no tienes porque preocuparte por el warning.

3. Si solo quieres que tu libreria no produsca un warning por que hace "feo" el programa, y si se cumple el punto 2, agrega todo lo que se ejecuta en decode() en la misma interrupcion.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Como llamar una función desde una interrupción, dentro de una librería en CCS
« Respuesta #2 en: 13 de Noviembre de 2011, 09:29:52 »
Hola.

Si salen warnings es por que dentro de ella deben haber delays del orden de los milisegundos, o porque usas alguna función de despliegue como printf. Si es por lo primero (delay) es mejor generar tus propias rutinas de espera usando un for, de esa manera el compilador no da problema, pero debes limpiar tu mismo el flag del registro para evitar malos funcionamientos, si es por lo segundo (printf) ... no se que se podrá hacer  :mrgreen:

Si la libreria es para el uso de un teclado, se puede usar un flag para dar aviso de la tecla oprimida y de esa manera usar una función como get_PS2kbd() ...

Saludos
El papel lo aguanta todo

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Como llamar una función desde una interrupción, dentro de una librería en CCS
« Respuesta #3 en: 13 de Noviembre de 2011, 11:04:02 »
en las interrupciones no se suelen meter funciones ni nada grande, yo lo que suelo hacer es activar un flag y en el main lo atiendo, seria algo asi


void interrupcion() {
obtencion de datos blablabla...
flagdecode=1;
}

void main() {

while(1) {
if(flagdecode) {
decode();
flagdecode=0;
}
}

lo que no se a que te refieres con perder el sentido con una libreria independiente, las librerias no dejan de ser funciones echas, al igual como si las haces tu.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Como llamar una función desde una interrupción, dentro de una librería en CCS
« Respuesta #4 en: 13 de Noviembre de 2011, 12:43:06 »
Yo en ese caso crearía 2 funciones, una que se llama dentro de la interrupción y otra que se llama en el bucle principal. Algo así:

Para la interrupción:
Código: C
  1. void vUpdateDataPS2(void){
  2.     // -...
  3.     kbhit_data_ps2=1;
  4. }

Esa función se encarga de recibir los datos desde el teclado, y cuando tenga el dato seteas una bandera que es una variable global propia del módulo de la librería. A esta función le podes agregar el modificador inline (CCS)  ;-)

Para el bucle principal:

Código: C
  1. void vTaskDataPS2(void){
  2.     if(kbhit_data_ps2==1){
  3.  
  4.    }
  5. }

Esa testea si ha sido activada la bandera, sino no hace nada. Lo único que tenes que establecer con que periodicidad mínima debe ser llamada para cumplir su función  ;-)

De esa manera tenes una forma de no perder la "independencia de la librería".


Saludos!
« Última modificación: 13 de Noviembre de 2011, 12:46:51 por Suky »
No contesto mensajes privados, las consultas en el foro