Autor Tema: problema con disable_interrupts(int_rda)  (Leído 3759 veces)

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

Desconectado el_legal

  • PIC12
  • **
  • Mensajes: 65
    • LINAP SRL
problema con disable_interrupts(int_rda)
« en: 14 de Octubre de 2008, 07:20:35 »
Hola:

Estoy haciendo un programa que me perermita comunicar un celular con una PIC y tengo el inconveniente que cuando deshabilito la INT_RDA, no la puedo volver a habilitar.
 ¿Alguien tuvo este inconveniente? ¿Lo pudo resolver?
Adjunto un codigo de prueba así se dan cuenta de lo que les hablo.
Desde ya muchas gracias.
Luciano
« Última modificación: 14 de Octubre de 2008, 07:38:24 por el_legal »
"Si alguno quiere ser el primero, que se haga el último de todos y el servidor de todos."
 Mc 9.35

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema con disable_interrupts(int_rda)
« Respuesta #1 en: 14 de Octubre de 2008, 14:17:11 »
Hola.

No tienes un bucle infinito dentro del main.

Saludos
EDITO: No habia visto el goto. De todas maneras, es mejor hacerlo con un ciclo while. Otra cosa: al inico del programa habilita primero la INT_RDA y luego la GLOBAL.
« Última modificación: 14 de Octubre de 2008, 14:20:00 por MLO__ »
El papel lo aguanta todo

Desconectado el_legal

  • PIC12
  • **
  • Mensajes: 65
    • LINAP SRL
Re: problema con disable_interrupts(int_rda)
« Respuesta #2 en: 14 de Octubre de 2008, 14:59:28 »
hola:

Muchas gracias por las observaciones. Pero alguna de ellas puede hacer que al habilitarlas deje de funcionar?
Porque yo lo estoy simulando con el proteus y un par de virtual terminal y el programa funciona bien hasta que deshabilito la interrupcion y luego al habilitar se setea el bits RCIE pero no ingresa al tratamiento de la misma.
"Si alguno quiere ser el primero, que se haga el último de todos y el servidor de todos."
 Mc 9.35

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema con disable_interrupts(int_rda)
« Respuesta #3 en: 14 de Octubre de 2008, 15:04:04 »
Hola.

Hay que tener cuidado en que cuando este deshabilitada la interrupcion RDA no lleguen datos por el serial.

Yo siempre he declarado las cosas en ese orden y asi siempre me han funcionado.

Saludos
El papel lo aguanta todo

Desconectado el_legal

  • PIC12
  • **
  • Mensajes: 65
    • LINAP SRL
Re: problema con disable_interrupts(int_rda)
« Respuesta #4 en: 14 de Octubre de 2008, 22:51:13 »
Hola:

Hay que tener cuidado en que cuando este deshabilitada la interrupcion RDA no lleguen datos por el serial.


Yo quería deshabilitar la int_rda para ignorar los datos que llegan ... Pero parese que no se puede...¿Cual es el impedimento?
Hay alguien que me lo pueda explicar?
Luciano
"Si alguno quiere ser el primero, que se haga el último de todos y el servidor de todos."
 Mc 9.35

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: problema con disable_interrupts(int_rda)
« Respuesta #5 en: 14 de Octubre de 2008, 23:09:46 »
Hola.

Pues no se si a alguien mas le haya pasado (a mi me sucedio hace tiempo y no he vuelto a revisar ese tema). Es mejor ordenar la transmision de los datos cuando se maneja el serial.

Saludos
El papel lo aguanta todo

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: problema con disable_interrupts(int_rda)
« Respuesta #6 en: 15 de Octubre de 2008, 01:57:34 »
Lo normal es que se te haya llenado el minibuffer de 3 bytes de la USART.
Si te llegan datos y no los lees (en la interrupción o fuera de ella) el PIC ignorará todo dato que siga llegando.
Por tanto, cuando quieras habilitar la interrupción de nuevo, antes tendrás que vacíar el buffer leyendo lo que tenga pendiente la USART.

Desconectado el_legal

  • PIC12
  • **
  • Mensajes: 65
    • LINAP SRL
Re: problema con disable_interrupts(int_rda)
« Respuesta #7 en: 15 de Octubre de 2008, 07:39:47 »
hola:  :lol: gracias a MLO_ y  Nocturno..... Pude resolver el problema de esta manera:

inicio:

 if(input(pin_a1)==1) {output_toggle(PIN_c1);disable_interrupts(int_rda);}

if(input(pin_a2)==1) { output_toggle(PIN_c1);enable_interrupts(int_rda);}

for (j=0;kbhit(); j++){r=getc();}
 goto inicio;

de esta manera siempre me activa y desactiva las interrupciones  :-/

Nuevamente gracias
saludos luciano
"Si alguno quiere ser el primero, que se haga el último de todos y el servidor de todos."
 Mc 9.35

Desconectado jfh900

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3595
Re: problema con disable_interrupts(int_rda)
« Respuesta #8 en: 15 de Octubre de 2008, 20:41:07 »
Se me ocurre a bote pronto que podrías mejorar un poco el código con:

while(kbhit()) getc();

Un saludo
* 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


 

anything