Autor Tema: Prioridades en Interrupciones PIC18  (Leído 4080 veces)

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

Desconectado xelax

  • PIC10
  • *
  • Mensajes: 2
Prioridades en Interrupciones PIC18
« en: 28 de Agosto de 2006, 07:08:19 »
Hola.

Soy consciente que GIE baja a cero cuando estoy atendiendo una interrupción pero creo que vuelve a 1 cuando acabamos de atenderla.

Estoy usando el compilador CCS con un pic 18f8722 con una interrupción de la USART para recibir y enviar información a de conversiones analógicas. Desde el exterior se me solicita el valor de una determinada entrada analógica entonces una vez que obtengo el valor del convertidor AD lo devuelvo formateado en un string con el valro leido y la hora en la que efectuado dicha lectura.

Mi problema es el siguiente cuando me preguntan por una conversión la comienzo pero mientras el convertidor esta convertiendo me entra una segunda orden que no recibo puesto que el GIE esta a cero por lo cual las interrupciones están deshabilitadas.

He intentado usar prioridades para solventar el problema,dandole a la interrupción de la USART el nivel de prioridad alto, pero no hace efecto igual he descuidado algo en algún sitio.

Hay algo mas que hacer que esto para habilitar los niveles de interrupción??
#device HIGH_INTS=TRUE

#INT_RDA HIGH
Aki escribo la rutina que atiende a la USART

Por supuesto he habilitado las interrupciones y habilitado la global tb.COmo he dicho antes todo funciona correctamente si envio una sola orden le doy tiempo a responder y luego le vuelvo a enviar otra orden.Mi problema solo ocurre cuando envio dos ordenes o más seguidas.

He implementado un buffer circular para almacenar ordenes mientras estoy procesando otras y este buffer funciona correctamente.

Gracias por vuestra ayuda, cualquier pista será de gran ayuda para solventar este desesperante problema.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Prioridades en Interrupciones PIC18
« Respuesta #1 en: 28 de Agosto de 2006, 08:14:58 »
No uso CCS pero sí mucho los PIC18, he aquí un par de sugerencias.

1) Fíjate si el bit IPR1.RCIP está a 1.  Este habilita al PIC para usar niveles de interrupción.

2) Las interrupciones de mayor prioridad irán al vector 0x0008 , las de baja prioridad al vector 0x0018.

3) No sé que haces en la rutina de interrupción pero desde ya te comento que no es buena costumbre 'hacer muchas' cosas en ella.  Tu problema, si es usar la usart y el A/D se podría resolver tranquilamente con 1 solo nivel de prioridad.   En cuanto a no hacer muchas cosas, pues bien, al ingresar en la interrupción, si tienes que leer el valor de A/D leído y luego hacer muchos cálculos o ejecutar una rutina de una longitud respetable, te sugiero que al convertir el dato con el conversor, enciendas un flag que leas en el bucle principal de tu programa y ahí recién hagas ese cálculo o algoritmo longevo.  Mientras, el GIEH y GIEL estarán de nuevo habilitado y podrás seguir atendiendo otras interrupciones.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado xelax

  • PIC10
  • *
  • Mensajes: 2
Re: Prioridades en Interrupciones PIC18
« Respuesta #2 en: 28 de Agosto de 2006, 08:40:06 »
Muchas gracias maunix por tu respuesta echaré un ojo a los puntos que me comentas y enc uanto lo tenga probado os comento los resultados.

Seguramente el problema venga por la rutina de interrupción de la conversión ya que si que hago bastantes cálculos una vez que obtengo el valor incluso hago una llamada al RTC que tengo conectado por i2c para obtener la hora actual y añadirla a la respuesta. Pero pensaba que con el tema de las prioridades en las interrupciones este problemilla quedaría resuelto ya que al producirse la interrupción de la usart y ser de prioridad alta interrupiría a la rutina de servicio de la interrupción del convertidor AD.

Muchas gracias por tu ayuda.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Prioridades en Interrupciones PIC18
« Respuesta #3 en: 28 de Agosto de 2006, 12:28:46 »
Muchas gracias maunix por tu respuesta echaré un ojo a los puntos que me comentas y enc uanto lo tenga probado os comento los resultados.

Seguramente el problema venga por la rutina de interrupción de la conversión ya que si que hago bastantes cálculos una vez que obtengo el valor incluso hago una llamada al RTC que tengo conectado por i2c para obtener la hora actual y añadirla a la respuesta. Pero pensaba que con el tema de las prioridades en las interrupciones este problemilla quedaría resuelto ya que al producirse la interrupción de la usart y ser de prioridad alta interrupiría a la rutina de servicio de la interrupción del convertidor AD.

Muchas gracias por tu ayuda.

No dije que no lo puedas resolver con los niveles de prioridad, dije que es algo poco recomendable hacer muchas cosas en las rutinas de interrupción.

Si pones la interrupción del AD con baja prioridad y la de la usart con alta prioridad de seguro te funcionará, ahora bien cuando agregues una tercera interrupción....   :? :? se te va a complicar la cosa.

Espero lo puedas resolver , sino vuelve a consultar que alguno te echará una mano.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything