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?