TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Renatox_ en 23 de Agosto de 2011, 00:02:04

Título: Habilitar y desabilitar UART
Publicado 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:

Código: [Seleccionar]
      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
Título: Re: Habilitar y desabilitar UART
Publicado por: Suky en 23 de Agosto de 2011, 12:37:11
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!
Título: Re: Habilitar y desabilitar UART
Publicado por: reiniertl en 23 de Agosto de 2011, 18:36:52
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
Título: Re: Habilitar y desabilitar UART
Publicado por: Renatox_ en 25 de Agosto de 2011, 11:08:20
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
Título: Re: Habilitar y desabilitar UART
Publicado por: Renatox_ en 27 de Agosto de 2011, 11:34:45
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
Título: Re: Habilitar y desabilitar UART
Publicado por: reiniertl en 28 de Agosto de 2011, 21:08:52
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
Título: Re: Habilitar y desabilitar UART
Publicado por: Renatox_ en 29 de Agosto de 2011, 00:39:34
entendido gracias reiniertl
Título: Re: Habilitar y desabilitar UART
Publicado por: donvalles en 05 de Julio de 2013, 23:04:08
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
Título: Re: Habilitar y desabilitar UART
Publicado por: Suky en 06 de Julio de 2013, 10:56:16
Podes darle una revisada al datasheet, existe un bit para poder encender o apagar el periférico.


Saludos!
Título: Re: Habilitar y desabilitar UART
Publicado por: MGLSOFT en 06 de Julio de 2013, 17:51:41
Ese bit es SPEN del registro RCSTA ?? :shock: :shock:

Citar
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)
Título: Re: Habilitar y desabilitar UART
Publicado por: Suky en 06 de Julio de 2013, 18:28:11
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!
Título: Re: Habilitar y desabilitar UART
Publicado por: donvalles en 07 de Julio de 2013, 12:57:55
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.