TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: xlisus en 18 de Febrero de 2008, 06:58:26

Título: Problema con 2 uart en pic16f877 con ccs
Publicado por: xlisus en 18 de Febrero de 2008, 06:58:26
Buenas, necesito tener en un pic16f877 dos puertos configurados como entrada salida y me ocurre un problema que no se como solucionarlo, estoy usando ccs.

Yo declaro

#use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B7,bits=8,stream=PuertoA)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B5,bits=8,stream=PuertoB)

pues bien, con esta declaracion recibo perfectamente por el puerto B5 y envio perfectamente por el puerto B7, pero no recibo bien por el puerto B7.

Si las invierto, primero el B y luego el A,

#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B5,bits=8,stream=PuertoB)
#use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B7,bits=8,stream=PuertoA)

me pasa todo al reves,no recibo bien por el puerto B5.

A que puede ser debido?

Gracias. Un saludo.
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: Nocturno en 18 de Febrero de 2008, 07:09:04
Es que no puedes utilizar el mismo pin para enviar y recibir. Para usar dos usarts tendrás que usar dos por dos pines, o sea cuatro (vaya trabalenguas)
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: xlisus en 18 de Febrero de 2008, 07:35:31
Pero si yo declaro solamente

#use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B7,bits=8,stream=PuertoA)

Funciona correctamente, envia y recibe sin ningún problema por el mismo ping.

Igual se hace algun lio el compilador.
Porbaré a poner todos los pines distintos a ver que ocurre. Ya os contaré.

Gracias por las respuesta.

Un saludo.

Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: Nocturno en 18 de Febrero de 2008, 07:54:42
Perdona, ¿te funciona con un sólo pin?
En ese caso olvida mi comentario anterior; yo habría jurado que eso no funcionaba.
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: xlisus en 18 de Febrero de 2008, 08:08:06
Si solo hago una declaración funciona correctamente, sin ningún problema, envio y recibo correctamente.

Es raro, debe ser algún problema del compilador porque dependiendo del orden en el que declare las usart hace una cosa u otra.

Tambien ocurre una cosa, cuando no recibo bien, los cinco primeros bytes que recibo son correctos, pero los siguientes no.

Un saludo.
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: J1M en 18 de Febrero de 2008, 08:32:02
Anda que curioso, desconocía esa particularidad de que funcionen por el mismo pin :S :S ... Supongo que lógicamente en Half-Duplex. Quizá venga por ahí el problema??? es decir, un problema con la sincronización?
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: xlisus en 18 de Febrero de 2008, 19:47:33
Por fín lo he conseguido !!!  :-/ Al final J1M tenia razón, el problema era con la sincronización del bit de inicio.

Ahora no hay ningún problema en declar dos usart con entrada y salida en el mismo ping.

Muchas gracias.

Un saludo.
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: Nocturno en 19 de Febrero de 2008, 03:25:49
¿Puedes poner cómo lo has resuelto?
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: xlisus en 19 de Febrero de 2008, 07:01:10
Buenas, al final el problema no era cosa del compilador sino mia.

No estoy acostumbrado a programar los pic en c, siempre en ensamblador, y claro no hice una pequeña implementación de usart que no funcionaba bien.

Las declaraciones de las usart:

#use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B7,bits=8,stream=PUERTO_A)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B5,bits=8,stream=PUERTO_B)

para recibir:

while(kbhit(PUERTO_X)); //bucle hasta que no se detecte bit de inicio
 a = getc(PUERTO_X);

para enviar:

fputc(a,PUERTO_X)

El problema es que no utilizaba la función kbhit(), lo hacía de otra forma.

Ahora lo que me surge es una duda, a ver si vosotros que entendeis más del tema me la resolveis, yo para mandar una serie de bytes lo que hago es poner fputc() dentro de un bucle , es correcto, hay alguna forma de enviar por ejemplo 6 byte de una vez sin bucle, es decir, yo hago

for(i=0;i<6;i++){
      fputc(dat,PUERTO_X);
      delay_ms(1);
   }

los byte deben ser enviados en hexadecimal.

Un saludo y muchas gracias.
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: Nocturno en 19 de Febrero de 2008, 07:32:16
Siempre puedes utilizar el printf. Te recomiendo que lo mires en la ayuda porque sus posibilidades son enormes y no me siento capaz de explicártelas aquí.
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: jluisruelas en 10 de Enero de 2015, 14:34:41
Buenas, al final el problema no era cosa del compilador sino mia.

No estoy acostumbrado a programar los pic en c, siempre en ensamblador, y claro no hice una pequeña implementación de usart que no funcionaba bien.

Las declaraciones de las usart:

#use rs232(baud=9600,parity=N,xmit=PIN_B7,rcv=PIN_B7,bits=8,stream=PUERTO_A)
#use rs232(baud=9600,parity=N,xmit=PIN_B5,rcv=PIN_B5,bits=8,stream=PUERTO_B)

para recibir:

while(kbhit(PUERTO_X)); //bucle hasta que no se detecte bit de inicio
 a = getc(PUERTO_X);

para enviar:

fputc(a,PUERTO_X)

El problema es que no utilizaba la función kbhit(), lo hacía de otra forma.

Ahora lo que me surge es una duda, a ver si vosotros que entendeis más del tema me la resolveis, yo para mandar una serie de bytes lo que hago es poner fputc() dentro de un bucle , es correcto, hay alguna forma de enviar por ejemplo 6 byte de una vez sin bucle, es decir, yo hago

for(i=0;i<6;i++){
      fputc(dat,PUERTO_X);
      delay_ms(1);
   }

los byte deben ser enviados en hexadecimal.

Un saludo y muchas gracias.

para enviar varios bytes utiliza la funcion puts(cadena o variable);
saludos
Título: Re: Problema con 2 uart en pic16f877 con ccs
Publicado por: KILLERJC en 10 de Enero de 2015, 18:35:14
para enviar varios bytes utiliza la funcion puts(cadena o variable);
saludos

No creo que te conteste y si lo hace de seguro que ya lo debe haber solucionado o tirado todo:
Fecha del post: 19 de Febrero de 2008