TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: willie_rosario_salsa en 30 de Abril de 2010, 15:06:07
-
Hola TodoPic, no acostumbro a poner nuevos temas, sino mas bien buscar y aprender de las experiencias de otros.
Pero tengo un problema que llevo horas descifrando y no encuentro la falla.
Se trata de una de las partes de mi proyecto de grado que controla apertura de cerraduras vía RFID (local) y desde un servidor (remoto), para lo cual he programado las interrupciones RB0 y la de USART.
El problema viene de que como el lector RFID envía datos seriales a cualquier hora se debe garantizar que no hayan colisiones y errores en las tramas que deben validarse al servidor. Las interrupciones funcionan bien, los envíos tambien, pero cuando detecto error en el bit OERR, necesito que se restablezca la recepción y que se borre el arreglo erróneo que guardé cuando atendí la interrupcion RDA.
En el main tengo esto: (reseteo el modulo USART y luego habilito la interrupcion, pero al habilitarla de montan los datos en el arreglo y se envían con errores por el XMIT)
if(OERR==1)
{
CREN=0;
CREN=1;
//dato_in=0x00;
}
enable_interrupts (global);
enable_interrupts (int_rda);
Gracias por sus comentarios y sugerencias, estoy aprendiendo a usar CCS gracias a todopic.
Saludos desde Guayaquil
-
Hola, talvez te esté faltando liberar el buffer del pic antes de que reactivas CREN.
Checa este tema, talvez te dé alguna pista.
http://www.todopic.com.ar/foros/index.php?topic=28920.msg239144#msg239144
-
Sí así es, eso es parecido a lo que hago, pero leyendo el datasheet del 876 me doy cuenta de esto y no sé si entiendo bien:
Mi programa se ejecuta hasta que atiende la interrupción y guarda la cadena correctamente.
Al regresar al main, y bajo otra condicion hago que la cadena se retransmita por el puerto xmit, apagando las interrupciones para que no me interrumpa mientras transmito.
PEERO aqui viene el problema:
cuando termino de transmitir, enciendo las interrupciones e inmediatamente se me salta al #int_rda y guarda la trama pero ya empezada, y creo que es porque mientras transmitía me llega un dato serie y se me levantan la bandera RCIF (que es solo de lectura) y la OERR (que la reseteo con CREN) pero no sé como podría hacer para que mientras transmita el dato por el puerto xmit, no pase nada con las banderas ni interrupciones del puerto rcv de la USART.
Gracias por la paciencia y por responder santiago. :(
-
Ah ya entiendo.
Ubica dos búferes: bufA y bufB.
Mientras envías el bufA, llena el bufB mediante interrupciones. Una vez que bufA está enviado, envía el bufB. Mientras bufB se envía, llena el bufA y así sucesivamente.
-
Parece que lo he solucionado, lo que hago es recibir la trama y poner CREN=0 (aqui hago todo lo que desee hacer y no se activa RCIF, ni OERR ni FERR asi estén llegando datos por el pin rcv del micro :-/ :-/ :-/ ) y luego pongo CREN=1 y enable (global) y ya no se interrumpe ni envía basura al xmit.
De verdad no encontraba la solución pero gracias :P, lo que deseo es prevenir una colision en un bus 485 mientras recibo datos por RB0 y por RC6 mientras estoy procesando otra parte del programa.
Pero tengo 2 dudas más:
1. tengo un arreglo char dato_in[10]; y quisiera ponerlo en 0 cada vez que restablezco el programa y para evitar que envíe los datos ascii guardados si existiese algun error. Osea quisiera darle un RESET al arreglo.
2. Y cuán importante es poner \n\r o simplemente \r al enviar datos por serial? Ya que mi reader RFID envía 12 bytes, [start][10 bytes de informacion][return 0x0D] y creo que el bloqueo de la usart viene por aquí también. Solo uso gets(arreglo) dentro de la interrupción pero no sé para que me sirve el \n cuando lo envío por xmit ??
Gracias
-
Ambas preguntas van de acuerdo a cómo hayas programado la recepción de datos. Si copiaste la rutina es mejor que la estudies y veas cómo recibe cada char.
La n sirve para nueva línea y la r es retorno de carro, regresa el cursor de una hyperterminal al inicio de la línea.
-
Si lo sé mi pana.. me refería a esto porque la funcion gets guarda hasta encontrar el 13 por eso la pregunta, ya que podría haber conflicto o algo así se me ocurrió.
Pero alguien sabe de alguna sentencia que pueda borrar o encerar una matriz por ejemplo:
char[1]= "R"
char[2]= "S"
char[3]= "2"
char[4]= "3"
char[5]= "2"
char[n[= "n"
Y poderla poner este char completo a 0. Ya busque en la ayuda de CCS pero no encuentro este caso de inicialización :?.
Gracias
-
Hola willie, prueba con la función "memset"
memset(char,0,sizeof(char));
saludos
-
voy a ver que tal...
Gracias diego.
-
Hola willie, prueba con la función "memset"
memset(char,0,sizeof(char));
Hola Diego, luego de algunas horas de estress ya puedo inicializar el arreglo con la pista que me diste, actualmente se me presentó otro problemita con las tramas que estoy realizando pero muchas gracias, esta herramienta memset me simplificaría alguans lineas de código si las meto en switch case.
Si no es molestia pondré mi hunilde aporte, llevo 5 días trabajando en un proyecto con RS232 - RS485 - INT serie por RB0 y por USART y a 9600 baudios. Probablemente a alguien que tampoco sepa programar en CCS y que se le presente los mismos dolores de cabeza que a mi estoy seguro que le ayudaría a no tener este estress.
:P :P :P
-
Willie, para reducir un poco la forma como cargas el arreglo
char[1]= "R"
char[2]= "S"
char[3]= "2"
char[4]= "3"
char[5]= "2"
char[n[= "n"
prueba con esto
strcpy( char, "RS232n" );
saludos.
-
Si Diego,
Así mismo lo hice, me fue util para copiar 2 strings seguidos y compararlos, si ambos eran iguales (osea se confirmaban) ejecutaba otra sentencia, y luego de de hacer esto enceré ambos arreglos con 0.
:-/ :-/