# PIC 18F se bloquea la recepción usart 232



## niuton (Jun 28, 2009)

Hola a todos, a ver si os ha pasado esto a alguno y se puede solucionar. Os comento estoy haciendo una recepción entre un PIC 18F4520 y el PC a través de RS232, estoy programando con CCS C, todo funciona bien en un tiempo 10seg - 1min recepción y transmisión pero luego la interrupción RDA deja de saltar, sigue enviando datos del PIC -> PC pero al contrario, la interrupción no hace caso de los datos que recibe. Es como si se quedase bloqueado la usar de recepción. Lo tengo simulado en proteus y pasa eso y luego lo pruebo en el micro y sucede lo de la simulación.


```
#include <18F4520.h>
#device ADC = 10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7)

#int_rda
void rda_isr() {
//Keypress = 0x00;
if(kbhit()){

codigo_buffer[indice_rs232] = getc();
indice_rs232 = indice_rs232 + 1;


if (codigo_buffer[0]=='$' && codigo_buffer[9]=='#'){
//recibe_ref();
//CONCATENAR VALORES RECIBIDOS RS-232 DE int16 = int8+int8
indice_rs232 = 0; // SE UTIIZA PARA LIMPIAR EL BUFFER

duty_PWM1 = make16(codigo_buffer[1], codigo_buffer[2]);
set_pwm1_duty(duty_PWM1); //Actualizo el PWM

}
}
}
}
```

Yo no se que le pasa ni como solucionarlo, ya he probado a activar la interrución pero sigue igual.

Un saludo y gracias


----------



## Moyano Jonathan (Jun 28, 2009)

Probá el código de otra forma sin utilizar la interrupción solo la función if(kbhit()) para la recepción de datos.

Te dejo un link que quizas te ayude:

http://picmania.garcia-cuervo.net/picc.php#RDA1


----------



## niuton (Jun 29, 2009)

Gracias por tu ayuda, he realizado algunas pruebas más y he descubierto que al recibir los datos salta otra interrupción al mismo tiempo, la del timer 3 (timer 3 salta cada 50ms) y salta el flag de desbordamiento de la USART "OERR".

¿Es posible que se quede bloqueado por eso?

Probaré las dos opciones.

Un saludo y ya comentaré.


----------



## piojoadrian (Jul 1, 2009)

Hola niuton. Tengo un problema similar al que tuviste tu en tu proyecto.
Estoy sensando temperatura a traves de un 18F2455.
Utilizo la interfaz rs232. El pic queda esperando ser interrogado, funciona inicialmente por un tiempo, pero luego de un tiempo de funcionar parece que se cuelga. Cuando corto la alimentacion y vuelvo a conectar, efectivamente contestan nuevamente por un tiempo.

Como lo solucionaste?

Espero puegas ayudarme.

No logro entender como solucionarlo.

Podrias pasarme alguna linea como para resetearlo en CCS?

Desde ya muchas gracias.


----------



## niuton (Jul 1, 2009)

Hola piojoadrian, pues ya conseguí solucionarlo, la solución es resetear dicho flag "OERR" de esa forma todo vuelve a funcionar, yo utilizo el CCS C y el solito puede resetear el flag cuando hay un error, para ello tienes que añadirle a la directiva de configuración del RS232 el flag "ERRORS".

#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, ERRORS)

Pero mi problema era que saltavan al mismo tiempo dos interrupciones, debido a que tenia escrito mucho codigo en las interrupciones.

Espero que te sirva de algo y te solucione el problema.

Un saludo.


----------



## piojoadrian (Jul 1, 2009)

HOLAAAAA Muchas gracias por tu rapida respuesta!

Me dice que solo agregando la palabra errors de esta forma alcanza?

#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, ERRORS)  

con eso alcanza?

Yo utilizo el mismo: CCS es el mejor! El propio programa me dices que cuando aparece un error me lo salva?

Espero puedas ayudarme, ya que estoy peleando con esto hace mucho tiempo. Todo funciona un tiempito pero luego se cuelgan y no responden nunca mas.

Muchas gracias nuevamente!

pd: si me solucionas el problema te enviaré una recompensa jeje. Me estoy rompiendo la cabeza desde hace mucho tiempo con esto.


----------



## niuton (Jul 1, 2009)

Hola, me alegro que te pueda ayudar, yo no llevo mucho en esto pero con esto me tuve que pelear y me ayudaron a solucionarlo.

yo desconocía este parámetro del RS232 pero yo lo probé en proteus y luego en el PIC y cuando se activa el EORR el solito se pone a 0 jjejeje. y automáticamente vuelve a responder la USART.

Te digo no realices muchas operacioines en la interrupción, colocale una variable global como bandera y realiza los calculos en el main.

Un saludo.


----------



## piojoadrian (Jul 1, 2009)

puse errors y tiro que tiene un problema.

es errors o eorr?


porfa ayudame nuevamente jeje


----------



## piojoadrian (Jul 1, 2009)

#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, ERRORS) 

asi como esta a mi en CCS me tira un warning como de compilacion digamos...



estas seguro que es asi?


Muchas gracias nuevamente


----------



## niuton (Jul 1, 2009)

Coloca esto:

#use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, ERRORS) 

ese warning es debido a que al colocarle este parámetro, está disponible una variable que yo no entiendo muy bien, que la puedes utilizar para conocer el tipo de error que ocurre en el PIC y asi poder hacer o mostrar en un LCD lo que quieras. 

Es un warning y te da por que no usas dicha variable, si no recuerdo mal el nombre de la variable es rs232_error o algo así.

Olvidaté del warning si no te interesa saber el tipo de error y dale caña que ya veras como funciona.

BYE


----------



## gustavo61709 (Ago 27, 2012)

#include <16f877a.h>
#device adc=10

#include <string.h>
#fuses HS,NOWDT
#byte port_b=6
#use delay(clock=20000000)
#use rs232(baud=38400,xmit=pin_c6,rcv=pin_c7)

//#priority RDA,rtcc

#USE FAST_IO(B)
#USE FAST_IO(C)
#USE FAST_IO(D)


//esta es la clave para limpiar el buffer de recepcion
#bit OERR=0x0018.1
#bit CREN=0x0018.4



#int_rda
void rda_isr(){
   disable_interrupts(int_rda);   

output_toggle(PIN_B1);
  if(OERR)
   {
      CREN=0;
      delay_cycles(2);
      CREN=1;
   }  

    if(kbhit())
    {   


      valor_=getc();
      i++;
    }





   enable_interrupts(int_rda);
}



lo que pasa es que si el bufer de recepcion , no se alcanza a leer completamente se genera un error, y es establecido un bit el cual se debe limpiar por software   CREN=0 delay_cicles(2)   CREN=1_


----------

