PIC16: Problemas con la recepción de UART

5

Tengo un PIC16 para el cual tengo la transmisión UART (asíncrona) funcionando bien. , pero el UART recibe resultados no válidos.

Por ejemplo, a se interpreta como O , b se interpreta como ' , y c se obtiene como N .

Aquí está mi función de recepción:

char UART_read(void) {
    while(!PIR1bits.RCIF) {}

    return RCREG;
}

Mi hipótesis es que la polaridad UART es incorrecta para el receptor, por lo que, en particular, los bits de inicio / parada se desordenan. He configurado el bit SCKP (consulte la página 302) para invertir los datos en el pin TX / CK, pero no puedo encontrar un equivalente para el pin RX / DT.

¿Cuál podría ser la causa de que la recepción de UART no funcione? ¿Cómo puedo invertir los datos en el pin RX / DT?

    
pregunta Randomblue

2 respuestas

5

EDIT : esta respuesta se modificó para reflejar el comentario del interrogador y señala que tiene bastante razón en su diagnóstico del problema, que no es ' Información terriblemente útil. La única información útil en la sección es el hecho de que no hay un bit de inversión invertido ... Pero quizás ayude a las futuras personas a diagnosticar sus propios problemas de UART

Así que echemos un vistazo

un mapa a O que significa 01100001 mapas a 01001111

b se asigna a 'lo que significa que 01100010 se asigna a 00100111

Supongamos que hay un 1 implícito antes de cada uno de ellos y un 0 implícito después (bits de inicio y parada). El módulo RX recibe una señal baja continua, luego el bit de parada se envía como un valor alto, que se consumirá como una señal inactiva, luego el 0 inicial se consumirá como un bit de parada. Entonces los bits restantes serán invertidos,

so 'a' == 1 10000110 0 initially (we send least significant bit first)
1 (implicit start bit) and starting 1 are both consumed as idle bits
then the first 0 is treated as a start bit
so received == 00001100 inverted (the extra zeros are the stop bit and idle bits after transmission has ended)
11110011 and reverse it (it was sent LSB first)
11001111 is what the inverted input would look like
01001111 is what's actually received which is super close!
if what you actually sent was "abc" all in a row, then the start bit of the b would make what was received 01001111 which matches exactly

'b' == 1 01000110 0 ==> 10001100 inverted and reversed gives
11001110 is what should have "logically" happened
00100111 actual
So that doesn't quite match, but if we assume that the "abc" is what happened again, we get
01001110 which is close enough (not sure where the shift came from)

Parece que detectó el diagnóstico, desafortunadamente no hay un bit de configuración de "señal invertida" similar en el receptor en el PIC. ¡Aunque no es difícil poner un inversor en la ruta de recepción, que por cierto es lo que recomendaría hacer!

Como señaló Olin, las señales estándar rs-232 son de + 3V a + 15V para un '1' lógico y -3V a -15V para un '0' lógico. El PIC está diseñado para funcionar en niveles "TTL", lo que significa "lógica transistor-transistor". La idea es que el PIC está diseñado para hablar con otras cosas que están físicamente cerca (es decir, en la misma placa) y, por lo tanto, la distancia de transmisión adicional y el rechazo de ruido proporcionados por los niveles completos de rs-232 no son necesarios para la operación "estándar". No es práctico poder generar completamente internamente los voltajes positivos / negativos necesarios para la operación rs-232 completamente internamente en el PIC, por lo que la comunicación "normal" rs-232 nunca fue realmente una opción.

Dado que los niveles TTL no son el estándar sino un derivado del estándar (el mismo protocolo para temporización, bits de inicio y parada, paridad, pero diferentes voltajes), no compra un "adaptador rs-232" para su consumidor. Computadora a menos que se adhiera a la norma. ¡Hacen adaptadores rs-232 de nivel TTL y son muy populares en los sitios web de aficionados! Visite cable de Adafruit o Sparkfun FTDI breakout . Encuentro que, en general, si va a un conector DB9, probablemente sea un adaptador de nivel RS-232.

    
respondido por el Kit Scuzz
3

Para ver si necesita inversión, mire el nivel de inactividad de la línea. El nivel lógico normal señales UART inactivo alto. Ya que invirtió la salida, debería estar inactivo bajo. Si el otro dispositivo está utilizando señales invertidas para recibir (su transmisión), es casi seguro que esté usando los mismos niveles para sus transmisiones (su recepción). Verifique con un alcance, pero probablemente necesite una inversión, lo que se puede hacer con una compuerta lógica del inversor o simplemente un transistor y una resistencia o dos considerando la baja velocidad de datos.

¿¡Cómo pensaste que la recepción funcionaría sin inversión cuando la transmisión lo requería?

Añadido:

Ahora ha revelado que simplemente conectó las líneas UIC de PIC a las líneas de transmisión y recepción RS-232 y, de alguna manera, decidió que todo funcionara. Los niveles lógicos digitales utilizados por el PIC y los niveles RS-232 no son compatibles, y los niveles alto / bajo también se invierten. Se supone que RS-232 está por debajo de -5 V para la línea inactiva (espacio) y por encima de +5 V para activo (marca). Claramente, un PIC no puede garantizar estos niveles cuando transmite, y puede ser dañado por estos niveles cuando recibe. Los niveles lógicos digitales normales son altos para el espacio y bajos para la marca, que es también lo que hace el PIC a excepción de unos pocos limitados como el suyo, donde se pueden invertir una o ambas líneas.

Algunos chips receptores RS-232 se pierden con las especificaciones RS-232 y funcionan con señales de 0-5 V conduciendo su línea de recepción. Aparentemente, este es el caso de su PC, por lo que pudo recibir caracteres en la PC después de invertir la línea de transmisión del PIC. Para obtener PC - > Para que la transmisión de PIC funcione, debe invertir la señal y asignar el resultado al rango Vss a Vdd del PIC. De lo contrario, se puede dañar el PIC, que puede haber ocurrido.

Todo esto es por lo que se creó el tipo de chip MAX232. Esto se alimenta del PIC Vdd y Vss, contiene sus propias bombas de carga para generar los voltajes RS-232, tiene el circuito del controlador y del receptor adecuados en cada lado y también realiza la inversión. Muchas empresas hacen una serie de variantes de esto. Estos son chips muy comunes y disponibles.

También puede obtener pequeños módulos que tienen el chip convertidor, la bomba de carga y las tapas de la fuente de alimentación, y el conector DB-9 estándar, todo en una sola unidad. Hago uno de estos que incluso se vende en microchipdirect. Consulte enlace .

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas

Comentarios Recientes

y código de transmisión. Transiciones de cambio de estado CRT entre aceleración y desaceleración, demodulación de punto de suelo y PCM. Velocidad de datos para detectabilidad. Módulo de luz LED con herramienta FPGA del tablero de botones y monitor incorporado. Tablero de control de reloj PCI. Interruptor programable este Ovid podemos usar casi cualquier sensor (CD, radio AM, etc.) No es quisquilloso con respecto a la forma exacta en que se moverán los cohetes lógicos y a qué otros modos girará. Proyectos ideales... Lees verder