Autor Tema: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.  (Leído 3080 veces)

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

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
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
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #1 en: 30 de Abril de 2010, 16:28:13 »
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

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #2 en: 30 de Abril de 2010, 16:55:35 »
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. :(
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #3 en: 30 de Abril de 2010, 17:12:04 »
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.

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #4 en: 30 de Abril de 2010, 17:47:34 »
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
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #5 en: 30 de Abril de 2010, 19:16:15 »
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.

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #6 en: 30 de Abril de 2010, 21:27:42 »
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
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #7 en: 30 de Abril de 2010, 22:04:38 »
Hola willie, prueba con la función "memset"

memset(char,0,sizeof(char));

saludos

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #8 en: 30 de Abril de 2010, 22:22:15 »
voy a ver que tal...

Gracias diego.
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #9 en: 01 de Mayo de 2010, 15:59:30 »
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
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #10 en: 01 de Mayo de 2010, 21:40:14 »
Willie, para reducir un poco la forma como cargas el arreglo
Citar
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.

Desconectado willie_rosario_salsa

  • PIC12
  • **
  • Mensajes: 75
Re: Ayuda con reset de USART y reset de un arreglo [10] con interrupción serial.
« Respuesta #11 en: 01 de Mayo de 2010, 23:31:58 »
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.
 :-/ :-/
"Es chévere ser grande, pero... Más grande es ser chévere." --- Héctor Lavoe.