Estoy probando mi primer diseño de PCB, que se basa en un ATMega328, y me he encontrado con un comportamiento indeseable con el UART:
Cuando tengo el UART conectado a mi computadora a través de un cable USB FTDI, funciona perfectamente, sin embargo, si desconecto el cable de la PCB, puedo enviar una entrada a la línea Rx de la PCB con solo tocar Rx y masa con uno punta de los dedos al mismo tiempo.
En realidad tuve un problema con los dedos que causaban malas entradas antes, y la respuesta fue que tenía voltajes flotantes.
Por supuesto, las líneas Rx / Tx, cuando no están conectadas a nada, también estarían flotando, lo que creo que está causando el mismo problema aquí.
Realmente necesito que esto sea confiable, en particular, me gustaría que no haya ninguna entrada en el UART cuando en realidad no hay nada que envíe información.
Dos preguntas, entonces:
-
¿Qué podría estar causando esto?
-
¿Qué debo hacer para solucionarlo? ¿Pull-up en la línea Rx?
Más información: así es como estaba probando.
#include <avr/io.h>
#define USART_BAUDRATE 9600
#define F_CPU 16000000UL
#define UBRR_VALUE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#define pin (PC3)
void initUART(void)
{
// Set baud rate
UBRR0H = (uint8_t)(UBRR_VALUE >> 8);
UBRR0L = (uint8_t)UBRR_VALUE;
// Set frame format to 8 data bits, no parity, 1 stop bit
UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00);
//enable transmission and reception
UCSR0B |= (1 << RXEN0) | (1 << TXEN0);
}
void sendUARTByte(uint8_t data)
{
// Wait for byte to be transmitted
while (!(UCSR0A & (1<<UDRE0))) { }
// Transmit data
UDR0 = data;
}
uint8_t receiveUARTByte()
{
// Wait for byte to be received
while (!(UCSR0A & (1<<RXC0))) { }
// Receive data
return UDR0;
}
int main(void)
{
uint8_t input = '!';
DDRC = _BV(pin);
PORTC = 0;
initUART();
while(1)
{
PORTC |= _BV(pin);
sendUARTByte(input);
input = receiveUARTByte();
PORTC &= ~_BV(pin);
sendUARTByte(input);
input = receiveUARTByte();
}
}
Básicamente, todo lo que está haciendo es alternar PC3
(= pin
) siempre que haya alguna entrada en el UART, y simplemente volver a copiar la entrada a la salida.
Funciona bien cuando estoy conectado a mi computadora, pero luego si desprendo la línea Rx y muevo la línea de tierra a otra almohadilla (para que pueda tocar fácilmente las clavijas de Rx y tierra al mismo tiempo), todavía obtengo el pin cambia a una frecuencia alta, pero no obtengo ninguna salida en la computadora (aunque las líneas de tierra y Tx aún están conectadas).
Aquí también está la parte relevante del esquema:
El UART está en el centro a la izquierda.