¿PIC requiere MAX232 para uart?

3

Lo siento por la pregunta estúpida, pero estoy conectando un PIC18f46k20 a un módulo de sensor de pH Atlas. Ambos se ejecutan en 3.3v. ¿Debo usar un max232 entre o puedo hablar pic directamente al módulo?

La razón por la que pregunto es que parece que en la hoja de datos (foto) el generador de velocidad en baudios no genera los 38400 requeridos por la placa del sensor, así que estoy pensando que el chip de interfaz (max232) corregirá eso de alguna manera ? Usando la fórmula en la página 249, estoy funcionando a la frecuencia interna predeterminada de 1MHz y obtengo un valor negativo para SPBRGH: SPBRG. ¿O el autobaud cuenta para esto?

    
pregunta Mark

2 respuestas

6

Todo lo que proporciona un MAX232 es traducción de nivel .

"Tradicional" RS-232 usa altos voltajes para hacer su señalización, generalmente ~ + 10V para indicar un "0" lógico, y ~ -10V para indicar un "1" lógico (aunque la especificación técnicamente dice cualquier cosa > 3V = 0, y < -3V = 1. En las aplicaciones del mundo real, puede ver un rango de niveles de señalización representados como "RS232").

Sin embargo, la mayoría de los dispositivos modernos no tienen las instalaciones a bordo para generar o manejar estos (relativamente) altos voltajes. Como tal, cosas como su PIC utilizarán 0V y VCC para sus niveles de señalización, que representan el "0" lógico y el "1" respectivamente.

Lo que hace el MAX-232 es convertir un nivel de entrada de 0V a una salida de ~ + 10V, y una entrada de VCC a ~ -10V. Eso es todo lo que hace. No hará ninguna conversión de velocidad de transmisión en absoluto.

En su caso, la hoja de datos del sensor Atlas Scientific PH dice:

  

La velocidad en baudios es: 38400, 8 bits, sin paridad, con un bit de parada.
La variación de voltaje 0-VCC, no +/- 12 voltios
  Si el nivel de tensión estándar RS232   Si lo desea, conecte un convertidor RS232 como MAX232.

Por lo tanto, no necesita un MAX232, ya que no quiere ni necesita los niveles de señalización de ~ + -10V. Suponiendo que esté utilizando la misma fuente de alimentación para el sensor de pH y su MCU, simplemente puede conectar los dos dispositivos directamente.

Como nota aparte, recomendaría colocar una resistencia de 1K entre la salida serial del sensor de pH y la entrada serial de su MCU. De esta manera, si configura accidentalmente la entrada serial como un pin de salida, no causará que las salidas de los dos dispositivos luchen entre sí, y posiblemente dañen una de ellas.

Deberá cambiar la velocidad en baudios del sensor Atlas o calcular sus propios valores de generador de velocidad en baudios para que el PIC funcione a 38400 baudios que necesita.

Si no puede alcanzar la velocidad en baudios deseada con el reloj de su sistema, debe agregar un cristal externo o un resonador, y aumentar el reloj del sistema para que pueda hacerlo.

Aparte de eso, creo que estás haciendo algo mal con tus cálculos si obtienes números negativos para SPBRGH:SPBRG .

Dicho esto, 38400 baudios es bastante alto para un reloj del sistema de 1 Mhz. Vas a estar a la derecha en el borde del extremo superior en el que puedes ejecutar el EUSART en.

De la hoja de datos:

Suponiendo:

  • SYNC = 0
  • BRG16 = 1
  • BRGH = 1

n = valor de SPBRGH, par de registro SPBRG $$ BaudRate = \ frac {F_ {OSC}} {4 * (n + 1)} $$ $$ BaudRate * 4 * (n + 1) = F_ {OSC} $$ $$ (n + 1) = \ frac {F_ {OSC}} {4 * BaudRate} $$ $$ (n + 1) = \ frac {1,000,000} {4 * 38400} $$ $$ (n + 1) = \ frac {1,000,000} {153,800} $$ $$ (n + 1) = 6.51041666666667 $$ $$ n = 5.51041666666667 $$

por lo que el valor SPBRGH, SPBRG disponible más cercano sería 6 o 5.

Luego, calculamos el error de la velocidad en baudios, que probablemente sea muy alto, ya que estamos abajo en valores de SPBRGH, SPBRG tan pequeños.

$$ BaudRate = \ frac {F_ {OSC}} {4 * (n + 1)} $$ $$ BaudRate _ {SPBRGH = 6} = \ frac {1e6} {4 * (6 + 1)}, BaudRate _ {SPBRGH = 5} = \ frac {1e6} {4 * (5 + 1)} $$ $$ BaudRate _ {SPBRGH = 6} = 35714, BaudRate _ {SPBRGH = 5} = 41666 $$

Así que las dos tasas de baudios disponibles son:

  • SPBRGH=6 : 35714, -6.9% Error
  • SPBRGH=5 : 41666, 8.5% de error

Ambos están muy lejos de su velocidad de transmisión de destino para que funcione, por lo que debe cambiar la velocidad de reloj del sistema.

    
respondido por el Connor Wolf
5

Hay dos cosas que deben coincidir, la velocidad en baudios y los niveles de señalización. El PIC no realiza nativamente los niveles de señalización RS-232. El chip MAX232 (o una de sus muchas variantes y productos similares de varios proveedores) se encarga de convertir eléctricamente las señales UART PIC a RS-232, si su sensor realmente necesita RS-232 real. Algunos dispositivos usan señales de nivel lógico como el PIC produce directamente. Sin embargo, un MAX232 no realiza ningún tipo de conversión de velocidad en baudios.

Piénsalo. Como pudo La conversión de una velocidad de transmisión rápida a una lenta significa que los datos tendrían que acumularse en algún lugar. ¿Cómo imaginas este trabajo? La cantidad de datos acumulados aumentaría indefinidamente si el transmisor continuara enviando a la velocidad máxima. Esto no tiene sentido. Un breve vistazo a la hoja de datos MAX232 también muestra que es simplemente un traductor de nivel de voltaje.

Solo puede alcanzar ciertas velocidades en baudios con cualquier frecuencia de reloj PIC. El oscilador está dividido por 4, 16 o 64, y luego por un entero que puede seleccionar para obtener la velocidad en baudios. 1 MHz es un oscilador lento, por lo que no tendrá mucha resolución para elegir una velocidad en baudios hasta que llegue a algunos bastante lentos. Lo mejor que puedes hacer es comenzar con 1 MHz / 4, que es de 250 kHz. 250 kHz / 38400 = 6.5, por lo que no funcionará porque 6 o 7 estarán muy lejos. Si usa el doble del oscilador, entonces puede comenzar con 2 MHz / 4 = 500 kHz. 500 kHz / 38400 = 13.02, por lo que 13 estarán cerca. 500 kHz / 13 = 38462, que solo tiene un .16% de descuento, lo suficientemente cerca.

Otro problema es la precisión del oscilador interno. Puede ser 5% de descuento sobre temperatura y voltaje. Debe mirar esto detenidamente y ver si es lo suficientemente bueno para el conjunto posiblemente más limitado de condiciones en las que está ejecutando el PIC.

En general, realmente necesita leer las hojas de datos en lugar de simplemente adivinar.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas