TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Renatox_ en 23 de Agosto de 2011, 00:02:04
-
Hola como estan, estoy programando un pic18f4410 para comunicacion uart en protocolo xon y para hacer confiable y no perder un dato he tenido que hacer lo siguiente:
disable_interrupts(INT_RDA);
if ((j>50) & (i==j))
{ i=0;
j=0;
putc(xon);
}
enable_interrupts(INT_RDA);
Tengo dos dudas la primera es el putc(xon) esta pone el valor de xon en el buffer de transmision y sale, o espera a que se transmita todo xon y despues sale.
Y la segunda puedo habilitar y desabilitar la interrupcion por uart de esa manera tan seguida?, lo hize asi porque no puedo recibir un dato justo antes de hacer i=j=0 porque ese dato nunca lo leeria.
saludos
Renato
-
Yo no lo des-habilitaría, apagaría el módulo de recepción hasta que se pueda recibir datos, porque sino si ocurre una sobre-escritura el módulo se bloquea y hay que resetearlo.
Saludos!
-
Según me parece lo que intentas es solicitar al DCE (Data Control Equipment es que reciba un dato) de allí utilizar XON o Request To Send como señal de control de flujo, así que debes esperar a que el DCE le diga al DTE [Data Terminal Equipment (tu PIC)] recibe la señal Clear To Send para mandar el byte.
No creo que habilitar/deshabilitar las interrupciones sea necesario en este caso. Es precisamente la ventaja que se logra al incorporar control de flujo. Si la función putc (no lo creo) trabaja directamente el el modo de control de flujo, tienes que ver los detalles de su operación, de otro modo tendrás que hacerlo tu mismo.
Hay un libro de un autor que se llama Luicio Di Jasio que te puede aclarar muchas dudas al respecto. Existen dos versiones una para PICS de 16 bits y otra para PICs de 32 bits, aunque el PIC18 no cae dentro de esas familias, las similitudes de la UART son tales que te servirá. Tiene unos ejemplos muy pero que muy buenos para eso que quieres hacer.
Saludos
Reinier
-
Si, mejor voy a quitar el habilitar y dasabilitar la uart como dice Suki puedo perder un dato ahi, lo que quiero hacer es un protocolo xon xoff solo tengo los dos pines 2 y 3 del puerto serie, envia xon y cuando llegan 50 bytes envia el xoff los bytes se almacenan en un buffer[], al mismo tiempo estos bytes son enviados a un dispositivo que los va pidiendo deacuerdo a su trabajo. Hay dos contadores "i" para el dispositivo y "j" para el uart, nunca i puede pasar a j tambien la transmision por uart es mas rapida que la enviada de bytes al dispositivo. Por tanto para que i alcance al j el j debe de detenerse con el xoff, cuando i=j hago i=j=0 y empieza a llenar el buffer denuevo
Esto en teoria confiando en la pc que respetara su protocolo software pero que pasaria si tiene virus o esta muy sobrecargada y le envia un byte mas al pic justo cuando este hace i=j=0, pues este ultimo dato no lo podria enviar al dispositivo y saldria una alarma pero este es un caso muy dificil de que ocurra.
saludos
-
Una consulta con respecto al operador &. Yo uso esta sentencia if ((j>50) & (i==j)) con el operador bitwise pero si lo reemplazo por if ((j>50) && (i==j)) tambien realiza la logica correctamente, pensada que el operador & era el AND pero este es con doble &&. Tendre algun incoveniente cuando lo implemente.
Lo mismo vale para los operadoradores | y ||.
saludos
-
El operador & es el AND lógico, y el && es el AND lógico de comparación. En tu caso if ((j>50) && (i==j)) es lo correcto, la otra construcción puede darte problemas. Lo mismo vale para el resto de los operadores lógicos.
Saludos
Reinier
-
entendido gracias reiniertl
-
el amigo suky dice que puede apagar el modulo de recepcion. como se hace eso? porque en un momento determinado de mi soft no deseo entrar en la interrupcion de recepcion de la uart entonces yo desabilito la interrupcion pero siguen llegando datos a la uart estando desabilitado pero cuando habilito la interrupcion no anda mas la uart. entonces como apago y prendo el modulo de la uart?. Gracias
-
Podes darle una revisada al datasheet, existe un bit para poder encender o apagar el periférico.
Saludos!
-
Ese bit es SPEN del registro RCSTA ?? :shock: :shock:
bit 7 SPEN: Serial Port Enable bit
1 = Serial port is enabled (configures RXx/DTx and TXx/CKx pins as serial port pins)
0 = Serial port is disabled (held in Reset)
-
Es una opción, pero solo se puede desactivar la recepción (CREN). Lo que pasa es que si se des-habilita la interrupción, al recibir bytes ocurre un overflow porque no se leen. Si el bit OERR está en 1, se inhibe la transferencia desde el registro RSR hasta el registro RCREG, por lo que es vital borrar el bit OERR, si estuviese activado.
O sea, se puede des-habilitar la interrupción, pero al volver a habilitarla seguramente va a ser necesario resetear la recepción.
Saludos!
-
Gracias por responderme, yo habia leido tambien que en ccs la funcion setup_uart() 1on/0off, intente ver donde estaba el cuerpo de la funcion para ver que hacia o como estaba constituida pero no la encontre asi que el compilador sabe lo que hace, voy a hacer la prueba mañana como dice suki y les contare. Saludos.