Autor Tema: Reset HW y problema con interrupcion  (Leído 3937 veces)

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

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
Reset HW y problema con interrupcion
« en: 25 de Abril de 2010, 15:47:02 »
Buenas,

A ver si alguien me dice el motivo de lo que me sucede.

He programado un PIC 18f2680 el cual se comunica y recibe datos de un modulo GPS por RS232. Recogo los caracters mediante la interupcion del puerto serie. El caso es que una vez lo alimento, el pic funciona correctamente y recoge los datos por interrupcion, pero si le hago un reset hardware la interrupcion del puerto serie, no vuelve a funcionar esta interrupcion arrancando el PIC correctamente.

Estoy programandolo en CSS.

alguna idea?

Gracias de amtemano.

Saludos.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Reset HW y problema con interrupcion
« Respuesta #1 en: 26 de Abril de 2010, 12:10:24 »
Hola, si cuando haces el Reset el módulo GPS no es reseteado entonces los datos serie seguirían entrando al pic.

El pic como acaba de reiniciarse recibiría los datos pero no los procesaría. Si no los procesa entonces el buffer de recepción se desborda y se bloquea.

Debes estar seguro de que el pic y el gps se reinicien simultáneamente. Y también que el gps sólo envíe datos cuando el pic ya esté listo para recibirlos (int rs232 activa).

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Reset HW y problema con interrupcion
« Respuesta #2 en: 26 de Abril de 2010, 13:06:42 »
¿No habrá manera de borrar el buffer desde CCS antes de habilitar la interrupción?

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
Re: Reset HW y problema con interrupcion
« Respuesta #3 en: 26 de Abril de 2010, 15:59:22 »
Gracias por la observacion, llevaba un tiempo pensando en ello y suponia que podia ser algo asi, pero no he encontrado la funcion de CCS que permita borrar el buffer.... y no puedo hacer el reset al GPS via hardware.

probare con el kbhit() a ver si puedo eliminar los caracteres del buffer y continuar con la ejecucion. ya os cuento.

Saludos.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Reset HW y problema con interrupcion
« Respuesta #4 en: 26 de Abril de 2010, 17:09:17 »
Talvez sí puedas hacer el reset por hardware. Un pin del pic conectado a un transistor podría encargarse de dar alimentación al GPS y apagarlo encenderlo a placer.

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
Re: Reset HW y problema con interrupcion
« Respuesta #5 en: 30 de Abril de 2010, 14:35:47 »
Gracias mig por la observacion, el caso es que el problema es que ya esta fabricada la placa... :(

Bueno os cuento, no he podido conectarme antes, por historias familiares,

Con esta funcion parece que me funciona a medias:

//limpieza buffer de recepcion RS232
void limpia_buffer232 (void)
{
int aux;
while (kbhit())
   aux=getc();
}

Si el reset me pilla en medio de una trama NMEA, no se inicializa bien y me quedo sin lectura del puerto serie :(, voy a jugar con las interrupciones a ver si deshabilitandolas antes de entrar en esta funcion, me limpia el buffer totalmente y luego habilitandolas a ver que pasa, ya os cuento

Gracias.

Saludos!
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Reset HW y problema con interrupcion
« Respuesta #6 en: 30 de Abril de 2010, 14:40:38 »
Talvez este tema te sirva, es para recibir caracteres después de haber errores por desbordamiento del buffer rx del pic.

http://www.todopic.com.ar/foros/index.php?topic=28920.msg239144#msg239144

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
Re: Reset HW y problema con interrupcion
« Respuesta #7 en: 30 de Abril de 2010, 15:18:17 »
me rindo a tus pies!!!! :D

perfecto!! no habia caido en los registros!!! acabo de realizar la prueba con un Copy&Paste de tu codigo y... parece que .... FUNCIONA!

//limpieza buffer de recepcion RS232
void limpia_buffer232 (void)
{
while(kbhit())
         getc();
//Limpia el bit Overrun Error OERR limpiando el bit CREN de RCSTA
//Útil para cuando se quiere ignorar una cadena RS232
bit_clear(*0x0FAB,4);
//Y lo vuelve a activar
bit_set(*0x0FAB,4);
}

Deshabilito y habilito la interrupcion antes y despues de llamar a la Funcion perfecto y como lo necesito al comenzar la ejecucion queda OK. ademas como tengo que detectar si me llegan caracteres por puerto serie, si detecto que llevo mucho rato sin recibir nada, la llamo y me limpia elbuffer y los registro y parece que muy bien!!! Seguire haciendo pruebas por si detecto algo mas :D

Gracias!!!!!!!!!!!

Saludos.
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Reset HW y problema con interrupcion
« Respuesta #8 en: 30 de Abril de 2010, 16:22:04 »
Qué bien, a seguir trabajando entonces.  :mrgreen:

Desconectado xerex

  • PIC16
  • ***
  • Mensajes: 138
    • Mi servidor, mi casa.
Re: Reset HW y problema con interrupcion
« Respuesta #9 en: 13 de Mayo de 2010, 17:06:20 »
Continuando con la saga, al final me ha salido mejor de lo que esperaba, hice una funcion mas para cambio de velocidad de UART que me funciona perfectamente, ya que anteriormente el cambiar la velocidad en caliente del PIC era imposible, os dejo el codigo para CCS:

/******************************************************************/
//Funcion para el cambio de velocidad y limpieza de buffer del PIC
void cambia_velocidad_uart (int16 velocidad)
{
disable_interrupts(INT_RDA);
if (velocidad == 4800) //solo valido de 1 a 5
   set_uart_speed(4800);
else if (velocidad == 9600)
   set_uart_speed(9600);
else if (velocidad == 19200)
   set_uart_speed(19200);
else if (velocidad == 38400)
   set_uart_speed(38400);
else if (velocidad == 57600)
   set_uart_speed(57600);
limpia_buffer232();
enable_interrupts(INT_RDA);
}
/******************************************************************/

Y por supuesto la creme de la creme ;)

//limpieza buffer de recepcion RS232 30-04-2010
void limpia_buffer232 (void)
{
while(kbhit())          {
         getc();
         }
//Limpia el bit Overrun Error OERR limpiando el bit CREN de RCSTA
//Útil para cuando se quiere ignorar una cadena RS232
bit_clear(*0x0FAB,4);
//Y lo vuelve a activar
bit_set(*0x0FAB,4);
}

Saludos!!!
Es falso eso de que el saber no ocupa lugar....


No se donde poner tanto libro.... :P