Autor Tema: ¿Qué hago mal en este sencillo programa?  (Leído 5121 veces)

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

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Qué hago mal en este sencillo programa?
« Respuesta #15 en: 19 de Marzo de 2010, 23:04:25 »
Bueno, si es un problema del flag de interrupción también se puede borrar a mano, con el bit5 del PIR1.

Pones esto al principio del programa:
#byte PIR1=0x0C
#bit RCIF = PIR1.5

Y esto dentro de tu interrupción:
tratamiento()
{   
   carRecibido=1;
        RCIF=0;
}   

A ver si te funciona así.

Eso sería exactamente lo mismo que utilizar clear_interrupt(), pero para que la bandera sea borrada hay que vaciar el Buffer de la comunicación UART, por ello es necesario usar getc()  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: ¿Qué hago mal en este sencillo programa?
« Respuesta #16 en: 20 de Marzo de 2010, 02:41:27 »
Pues me apunto lo del clear_interrupt() :D
No sabía que CCS lo tuviera.

Desconectado ariznaf

  • PIC10
  • *
  • Mensajes: 23
Re: ¿Qué hago mal en este sencillo programa?
« Respuesta #17 en: 26 de Marzo de 2010, 13:15:33 »
Bueno, pues muchas gracias a los que me habéis ayudado.

Estuve mirando lo de procesar los comandos.
He encontrado varias formas de hacerlo.
1.- Sin interrupciones, dedicando el programa principal a comprobar la recepción de comandos y a su interpretación.
Funciona, pero tiene el inconveniente de no poder hacer otra cosa mientras tanto.
2.- Mediante las interrupciones RDA. Efectivamente hay que leer el caracter en la propia interrupción.
Eso complica algo las cosas, pues la subrutina de interrupción ha de ser bastante rápida (para evitar que otras interrupciones externas que tengo activadas como el cambio de la puerta B para detectar los cambios de estado en los encoders) no sean atendidas.
Por tanto debería de limitarse a leer el caracter y almacenarlo de forma que luego el cuerpo principal del programa sea el que interpreta el comando.
El problema es que es necesario un buffer (que en mi caso podría ser grande y depende del comando recibido) o bien una especie de máquina de estado.

Encontré una forma mejor:
3.- Usando las funciones RTOS de tiempo real del CCS. Con esto, no activo la interrupción RDA, sino que dedico una tarea a procesar los comandos exclusivamente, que en puntos estratégicos va usando un rtos_await(kbhit()) para saber si se ha pulsado una tecla pero liberando el procesador y permitiendo que se ejecuten otras tareas mientras no se pulse una tecla.
Sigo usando interrupciones en la puerta B, que se limitan a incrementar o decrementar contadores cuando el encoder se mueve y otra tarea que se ocupa de hacer lo que haya que hacer cuando un contador se modifica (a la que se avisa de dicha modificación mediante un flag que se testea mediante rtos_await(flat==true)).

Parece que la cosa funciona bien por ahora.


 

anything