TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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.
-
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)
-
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.
-
Perdona, ¿te funciona con un sólo pin?
En ese caso olvida mi comentario anterior; yo habría jurado que eso no funcionaba.
-
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.
-
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?
-
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.
-
¿Puedes poner cómo lo has resuelto?
-
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.
-
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í.
-
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
-
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