TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: championz en 25 de Abril de 2007, 06:02:03

Título: interrupciones
Publicado por: championz en 25 de Abril de 2007, 06:02:03
Buenas! les hago una pregunta... las interrupciones siguen andando si el procesador esta "trabado"? es decir... si por alguna falla el procesador se "congela" haciendo un proceso... las interrupciones como el timer0 siguen funcionando? o se congelan todos los procesos incluyendo a las interrupciones?

gracias

Título: Re: interrupciones
Publicado por: maunix en 25 de Abril de 2007, 08:42:45
Buenas! les hago una pregunta... las interrupciones siguen andando si el procesador esta "trabado"? es decir... si por alguna falla el procesador se "congela" haciendo un proceso... las interrupciones como el timer0 siguen funcionando? o se congelan todos los procesos incluyendo a las interrupciones?

Las interrupciones son interrupciones.  Mientras el PIC esté corriendo como dios manda, haciendo un cálculo o no... se ejecutarán mientras estén habilitadas y el GIE/PIE también estén habilitados.

En cuanto a lo de si el "procesador se congela", no entendí bien a qué te refieres.  A si está directamente su electrónica se colgó? o a si está haciendo un cálculo complejo en un bucle.

Digo esto porque en las PCs el concepto de "se me colgó la PC" es muy extenso y en su gran mayoría, no es que realmente se colgó, sino que algún software está haciendo un cálculo en un bucle del cual nunca sale, o esperando una respuesta que nunca llega, etc.  En definitiva son errores 'de software' pero de ninguna manera el microprocesador deja de funcionar.  En esos casos, si el sistema operativo es otro, se pudiera lograr que se salga de ese error.  De hecho en su gran mayoría se solucionan haciendo un CTRL-ALT-DELETE (o SUPR) , lo cual significa que el micro está muy vivo y solamente es el sistema operativo el que aún no recuperó control de la aplicación.
Título: Re: interrupciones
Publicado por: fastyx en 26 de Abril de 2007, 14:37:45
me sumo a lo que dice maunix, y tomé la buena costumbre de agregarle un time out al soft si hay una funcion que la veo media comprometida.

esto es especialmente util si lo que esta esperando es algun motor , o un mecanismo que no logra llegar a lo que pidio el soft , en cuyo caso la forma general podría ser:

        si pasados tantos conteos de una variable( trato de no usar delay) , no hiciste X ; desconecta ---> mensaje de error----> espera accion operario
Título: Re: interrupciones
Publicado por: Dancrazy en 26 de Abril de 2007, 15:51:40
Tambien no olvidemos a nuestro amigo el Watchdog timer (o perro guardian) para casos de emergencia. si el micro se queda pegado en un calculo erroneo que accidentelmente se vuelve infinito luego de cierto tiempo (especificado por nosotros) el watchdog aplica un reset...
y si, teoricamente la interupcion del timer deberia poner en stand by (en espera) a cualquier proceso (colgado o no) para realizar algo... puedes tomarlo como un time out (o tiempo de espera maximo admisible).
Título: Re: interrupciones
Publicado por: championz en 30 de Abril de 2007, 02:45:15
mi desarrollo es un circuito que no usa variables externas ni nada parecido... simplemente hace calculos (en su mayoria calculos faciles, lecturas desde eeprom, etc)

ahora he implementado un sistema de watchdog. La instruccion de restart_wdt(); esta dento de una interrupcion del timer0. Es decir... cada cierto tiempo el timer0 desborda, se hace una interrupcion y la misma pone a cero el WDT .

Lo que quiero saber es si esta logica es correcta... es decir... si es un buen metodo para hacer el restart_wdt(); o seria mejor ponerlo en alguna funcion dentro del main?

muchas gracias!
Título: Re: interrupciones
Publicado por: maunix en 30 de Abril de 2007, 08:41:44
Lo que quiero saber es si esta logica es correcta... es decir... si es un buen metodo para hacer el restart_wdt(); o seria mejor ponerlo en alguna funcion dentro del main?

Lo más correcto, a mi modo de verlo, es que tus funciones no demoren 'mucho' precisamente porque esto es peligroso como te habrás dado cuenta.  Yo uso el reinicio del WDT en el bucle principal del programa, ni más ni menos. 

Tampoco es bueno poner un clrwdt (esta es la instrucción en assembler) a cada rato en el pic para que no se resetee, mucho menos usar un timer con interrupción para que se reinicie el WDT en dicha rutina porque estamos haciendo 2 veces lo mismo.

Título: Re: interrupciones
Publicado por: championz en 30 de Abril de 2007, 13:12:24
gracias maunix por tu respuesta, pero no comprendo, porque estaria haciendo 2 veces lo mismo? Yo estoy usando el timer0 para otro proposito, pero tambien en el mismo he colocado la instruccion clear watch dog. Porque estaria mal usar esta instruccion en una interrupcion del timer?

gracias!

Título: Re: interrupciones
Publicado por: maunix en 02 de Mayo de 2007, 09:34:13
gracias maunix por tu respuesta, pero no comprendo, porque estaria haciendo 2 veces lo mismo? Yo estoy usando el timer0 para otro proposito, pero tambien en el mismo he colocado la instruccion clear watch dog. Porque estaria mal usar esta instruccion en una interrupcion del timer?

A mi modo de verlo, no tiene sentido hacer un clrwdt en una interrupción, ya que puede suceder que el pic no es que está muerto simplemente se perdió en alguna parte del programa (la verdad, uno nunca sabe a ciencia cierta si el pic realmente se colgó y si microelectrónica no responde para nada, o si está ejecutando una sección de código diferente).

En caso de que se perdió en una parte del programa, la interrupción seguirá saltando y por ende reseteando el WDT.

Resultado, tu pic anda mal sin embargo el WDT nunca lo reinicia.

Por eso, opino, a mi modo de verlo, que no es buena idea hacer un reset del WDT en una interrupción.


Título: Re: interrupciones
Publicado por: jfh900 en 02 de Mayo de 2007, 09:56:42
Cuando el WatchDog se dispara resetea el micro independientemente de lo que esté haciendo, con lo cual si esta dentro de una interrupción el programa comienza desde "0" e inicializa todos los registros. Esto es importante, por que dentro de una interrupción el micro también se puede quedar colgado y de esta forma salir del bucle sin fín. Por último decir que las posiciones donde se deben de colocar los reset del WDT, se deben de medir para que coincidan poco antes de que salte el mismo y poner los estrictamente necesarios para borralo, cuantos mas se pongan mas probabilidades hay que de que haya uno dentro de un bucle infinito y entonces no sirva para nada el WDT.

Un saludo
Título: Re: interrupciones
Publicado por: FabiPIC en 26 de Mayo de 2007, 15:34:55
Buenas! les hago una pregunta... las interrupciones siguen andando si el procesador esta "trabado"? es decir... si por alguna falla el procesador se "congela" haciendo un proceso... las interrupciones como el timer0 siguen funcionando? o se congelan todos los procesos incluyendo a las interrupciones?

gracias



Hola, mira mi profesor de laboratorio de microprocontroladores 2 me explico que las PICs utilizan microprocesadores "dedicados" a ciertas funciones, por ejemplo es el caso del delay, ya que mientras lo utilizas, las interrupciones no causan efecto, con lo cual si utilizas interrupciones trata de usar retardo de tiempo generados por los timer, o contadores por software, asi tus interrupciones no se te cuelgan esperando que el micro termine el delay, saludos
Título: Re: interrupciones
Publicado por: reiniertl en 28 de Mayo de 2007, 19:08:22
No tiene sentido utilizafr delay() y de conjunto utilizar un timer para resetar el WD, si piensas hacer eso simplemente utiliza el Timer para hacer la demora que te de la gana, de forma eficiente y el método de maunix, reseta el WD, después de la demora con TIMER.

Por qué tanto lío con eso si tenemos además la posibilidad de utilizar un RTOS, yo la verdad ya me he olvidado de semejantes rompederos de cabeza, me romí una vez el coco para aprender a utilizar el RTOS y con eso le doy candela a cuanta jodienda de temporización se me presente.

un saludo
Reinier