PIC18F + MAX232 USART Bizarreness

3

Bueno, he estado luchando con esto durante semanas, y me está pasando la cabeza. He estado trabajando con PIC durante mucho tiempo, y estoy muy confundido en cuanto a por qué no puedo hacer que mi USART funcione.

En primer lugar, algunas preguntas para las personas que no quieren leer esta publicación pero que podrían ayudar:

  • ¿Cómo invierto las señales para usar con el chip MAX232?
  • ¿Se deben configurar TX y RX en salidas, entradas o salida para RX y entrada para TX? La hoja de datos dice uno, los ejemplos dicen otro.
  • ¿Necesito usar el PLL?
  • ¿Para qué sirven los indicadores USART_ADDEN_OFF y BAUD_IDLE_RX_PIN_STATE_HIGH, y por qué no están en la documentación del C18?

Para todos los demás, aquí está la larga historia:

La configuración: PIC18F46K20 < - > MAX232 < - > PC

RC7 es RX, y RC6 es TX.

El software del terminal es solo un intérprete de Python:

port = serial.Serial("COM6", 2400, timeout=5)
port.write("abcd")
print port.read(1)
etc...
  • Si conecto los pines T1in y R1out del MAX232 juntos, entonces el serial-loopback funciona perfectamente desde mi PC, así que sé que la placa MAX232 está bien.
  • He movido el PIC fuera de su tablero, y está sentado en una placa de pruebas para la depuración. Las únicas cosas que están enchufadas son potencia, tierra y TX & RX.

He intentado un número diferente de variaciones de código, ninguna está haciendo el truco. Estas son algunas de las cosas que he probado:

Esto es básicamente tomado enteramente de este post: Problema PIC18 USART

Tenga en cuenta el uso de un PLL y la configuración de HS para BRGH, y que el pin TX se establece en entrada, y solo RX se establece en salida, a diferencia de la hoja de datos.

#include <p18cxxx.h>
#include <usart.h>

void main(void)
{
char c = 'a';

TRISC = 0x80;
    // Internal osc. 8 MHz, PLL 4x
    OSCCON |= 0xE2;
    OSCTUNEbits.PLLEN = 1;

    // wait until IOFS = 1 (osc. stable)
    while (!OSCCONbits.IOFS)
        ;


    /*
     * Open the USART configured as
     * 8N1, 2400 baud, in polled mode
     */
     OpenUSART (USART_TX_INT_OFF &
                USART_RX_INT_OFF &
                USART_ASYNCH_MODE &
                USART_EIGHT_BIT &
                USART_CONT_RX &
                USART_BRGH_HIGH, 207);

     while (1)
     {
          putcUSART(c);
          c = getcUSART();
          Nop();
     }

}

De todos modos, me siento tonto por no poder hacer un trabajo tonto de USART, pero estoy completamente perplejo. ¿Qué me estoy perdiendo? ¿Qué estoy haciendo que es estúpido? Alguien por favor ayuda!

Adición Estoy agotado: publicar esto último antes de irme a la cama y probar más mañana.

Esto devuelve un flujo constante de galimatías, incluso si no estoy escribiendo nada en el USART desde la PC:

#include <p18cxxx.h>
#include <usart.h>

void main(void)
{
char test = 'a';
TRISC = 0xFF;
OSCCON |= 0b11100010;
OSCTUNEbits.PLLEN = 1;

    while (!OSCCONbits.IOFS);

baudUSART(BAUD_IDLE_CLK_LOW & 
          BAUD_AUTO_OFF & 
          BAUD_8_BIT_RATE & 
          BAUD_IDLE_RX_PIN_STATE_HIGH);

OpenUSART (USART_TX_INT_OFF &
           USART_RX_INT_OFF &
           USART_ASYNCH_MODE &
           USART_EIGHT_BIT &
           USART_CONT_RX &
           USART_ADDEN_OFF &
           USART_BRGH_HIGH, 207);
    while (1)
    {
        WriteUSART(test);
        while(!DataRdyUSART());
        test = ReadUSART();
        Nop();
    }
}

UPDATE

Bien, ahora mi pin TX está en una constante de 0.00 voltios. Es casi como si estuviera atado directamente al suelo (puede que esté muy bien en este punto, no lo sé). He intentado cambiar los PIC, hacerlo transmitir constantemente, hacer que no haga nada, cambiar los bits de configuración ... nada parece ayudar. El pin RX se encuentra alto (lo que es correcto, porque no recibe nada), pero el pin TX se mantiene plano a 0 V, ya sea que se esté transmitiendo o no.

Aquí está mi código actual:

#include <p18cxxx.h>
#include <usart.h>

void main(void)
{
char test = 't';
TRISCbits.RC7 = 1;
TRISCbits.RC6 = 0;
OSCCON = 0b11100010;
OSCTUNEbits.PLLEN = 0;

    while (!OSCCONbits.IOFS);

baudUSART(BAUD_IDLE_CLK_LOW & 
          BAUD_AUTO_OFF & 
          BAUD_8_BIT_RATE & 
          BAUD_IDLE_RX_PIN_STATE_HIGH &
          BAUD_IDLE_TX_PIN_STATE_HIGH);

OpenUSART (USART_TX_INT_OFF &
           USART_RX_INT_OFF &
           USART_ASYNCH_MODE &
           USART_EIGHT_BIT &
           USART_CONT_RX &
           USART_ADDEN_OFF &
           USART_BRGH_HIGH, 207);
    while (1) {
//       WriteUSART(test);
//      while(!DataRdyUSART());
//        test = ReadUSART();
        Nop();
    }
}

¿Qué diablos hice para que eso hiciera eso? Tenga en cuenta que también reconstruí mi código anterior (un ejemplo de lo anterior, que anteriormente solo estaba escupiendo rumores), y ahora el voltaje es de 0.0 V con ese archivo hexadecimal. Además, el loopback MAX232 todavía funciona correctamente. Eh?

    
pregunta bhilburn

2 respuestas

5

Bueno, para cualquier persona que se encuentre con algo como esto en el futuro:

El problema era que había una fuga de la traza de potencia en la traza en serie, de manera que aparecía una onda de 60Hz en la línea SPI, lo que obviamente desordenaría las cosas.

Sé que la probabilidad de que esta misma solución se aplique a otras personas es pequeña, ¡pero quizás al menos te dé algunas ideas!

    
respondido por el bhilburn
1

Antiguo consejo:

  • Divídelo en secciones.

  • Siempre que sea posible, elimine la complejidad que se interponga en el camino de la conexión básica de bajo nivel de trabajo.

  • Intente probar una cosa a la vez y cambie una cosa a la vez.

    Puede verificar si hay N cosas que pueden suceder como resultado de un cambio, pero esto corre el riesgo de ocultar lo que está causando qué.

    Lo ideal sería que los cambios solo se orientaran a una sola área en su efecto).

THEN:

El pin TX debe estar configurado para dar salida.

Si está utilizando un IC RS232 (que se invierte), entonces el nivel de inactividad de TX en el PIC debe ser alto.

Si desea ver si las conexiones de PIC clock y coms están funcionando como se esperaba, podría usar una rutina de TX a base de bits (muchas más) para enviar caracteres a la PC. Si no puede obtener datos que se muestren de esta manera, entonces su conexión es sospechosa de alguna manera. Si obtiene algún rastro de datos en la PC, puede alterar las cosas hasta que funcione y luego saber qué debe hacer su PIC a través de UART

La funcionalidad de bajo nivel de TX se puede confirmar midiendo el voltaje con un voltímetro.

  • Si está inactivo = lógica 1 = alta = 5V (por ejemplo) y envías en un bucle cerrado
    y enviar nulo ($ 00)

  • entonces el voltaje caerá a un% bajo de 5V.
    por ejemplo, si puede enviar SIN retraso entre los caracteres * (depende del almacenamiento en búfer, etc.), entonces enviaría:
    inicio = 0, 8 x bajo, 1 x parada = 5V, por lo que vería 1/10 x 5V = 0.5V DC.

    Si tiene un retraso entre los caracteres, el voltaje aumentará en consecuencia.

Sin alcance: si envía caracteres tx a la PC en un bucle, debería ver un cambio de voltaje cuando envíe y debería ver que el voltaje en la salida RS232 también cambia pero con polaridad opuesta.

La salida RS232 para PC debe estar inactiva y luego cambiarse de manera opuesta a la prueba anterior.

    
respondido por el Russell McMahon

Lea otras preguntas en las etiquetas