La transmisión (TX) se detiene usando FTDI 232RL con ATmega328-PU

FTDI parece ser un tema popular en los foros, pero parece que no puedo encontrar una respuesta a un problema confuso que tengo. Trataré de dar tantos detalles como pueda, ya que parece que no puedo reducir el problema.

Estoy usando un ATmega328-PU (el niño problemático más económico para los usuarios de ArduinoISP) con una placa de conexión FTDI 232-RL. Pude grabar el cargador de arranque Arduino usando la placa de conexión sin problemas, así como cargar el boceto que estoy usando.

Ahora, estoy tratando de usar el puerto de comunicación serial FTDI de mi PC para interactuar con el 328. Los únicos pines que estoy ejecutando desde la placa de conexión a mi placa son los pines TX, RX y GND. Estoy usando una tasa de baudios de mi puerto serie de 115200.

Síntomas: el indicador RX parpadea de manera constante, por lo que recibe muchos bits felices de la PC. El indicador TX parpadea durante aproximadamente 1 segundo y luego se apaga. No hay bits felices de FTDI a ATmega328.

No tengo un botón de reinicio en mi circuito 328, solo una resistencia a +5V. Tengo un reloj externo de 16 MHz en mi circuito. He adjuntado el código de configuración de mi boceto para referencia adicional.

Ahora, las preguntas:

1) ¿Debo hacer algo con los pines CTS y DTR provenientes de la placa de conexiones?

2) ¿Todavía hay un reloj interno en el ATmega328 que me está fastidiando (incluso después del cargador de arranque? Si es así, ¿cómo puedo desactivarlo?

3) ¿Es necesario un botón de reinicio en mi circuito si el boceto ya está cargado?

A ver si alguien puede arrojar algo de luz sobre mi problema. ¡Muy apreciado!

Aquí está el código de configuración (después de declarar pines en 328):

void setup()   
{               
  DDRB |= (1<<1)  | (1<<2)  | (1<<3) | (1<<5) ; // BLANK, SS, MOSI, SCLK as OUTPUTS
  DDRD |= (1<<3)  | (1<<4) |  (1<<6) | (1<<7) ; // VPRG, XLAT, GSCLK, Debug as OUTPUTS
  DDRC = 255;

  XLAT_Low;
  BLANK_High;
  VPRG_Low;
  Debug_Low;

  //Timer 1 (16bit)
  TCCR1A  = (1<<WGM11) | (0<<WGM10);            // Fast PWM with ICR1 as top
  TCCR1B  = (1<<WGM13) | (1<<WGM12);            // Fast PWM with ICR1 as top
  TCCR1B |= (1<<CS12)  | (1<<CS11) | (1<<CS10); // external clock (T1) on rising egde
  TIMSK1 |= (1<<TOIE1);                         // enable overflow interupt
  ICR1    = Gray_Scale_Depth;                   // Grey scale depth for TLC-PW

  //Timer 0 (8bit)
  TCCR0A  = (1<<WGM01) | (0<<WGM00);            // CTC
  TCCR0A |= (0<<COM0A1) | (1<<COM0A0);          // Toggle on Compare Match
  TCCR0B  = (0<<CS02) | (0<<CS01) | (1<<CS00);  // No Prescaler
  OCR0A   = 0;                                  // f(OCR) = F_CPU/2/Prescaler

  //UART Initialisation
  UCSR0A |= (1<<U2X0);                                 // Double up UART
  UCSR0B |= (1<<RXEN0)  | (1<<TXEN0) | (1<<RXCIE0);    // UART RX, TX und RX Interrupt enable
  UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00)             ;    // Asynchrous 8N1 
  UBRR0H = 0;
  UBRR0L = 1; //Baud Rate 1 MBit   --> 0% Error at 16MHz

  //Enable global interrupts
  sei();

  //Configure SPI  
  SPCR = (1<<SPE)|(1<<MSTR);  
  SPSR = B00000000;   

  ptr=display_buffer;

}
(1) No es necesario utilizar CTS y DTR durante la transferencia de datos en serie estándar. (2) Hay un reloj interno utilizable, pero primero tendría que habilitarlo específicamente, así que creo que eso no es un problema. (3) No es necesario reiniciar; solo eres UART para recibir y transmitir.
¿Has probado un boceto simple diferente? Ya que está ejecutando el cargador de arranque Arduino, ¿qué tal un simple Serial.begin (115200); y Serial.print("abc"); -- ¿Qué sucede entonces en el indicador TX y en el terminal serial de su PC?
La configuración que ha publicado para el USART sobre todo me parece correcta. ¿Puede proporcionar más información? (resto del boceto, enlace a los módulos que está utilizando). Incluya especialmente su ISR (código de rutina de servicio de interrupción) ya que no estoy seguro de cómo se maneja eso en un boceto de Arduino.
Creo que su interpretación de los indicadores TX y RX no es correcta. RX no significa que la PC esté enviando datos, TX sí.
Es difícil saber cuál es cuál sin el esquema de los LED, pero al menos la lógica de la evaluación de TX/RX está rota: solo uno de los dos será controlado por la PC/FTDI. El otro será manejado por el ATMEGA y no podría ser deshabilitado por el FTDI si el ATMEGA ha sido programado para transmitir continuamente (dado que aparentemente no hay un circuito de reinicio como la línea de control de estado serial al truco del capacitor por el cual el FTDI/PC podría enviarlo de vuelta al gestor de arranque)
La forma más fácil de verificar si el reloj está bien es cargar el boceto de ejemplo de parpadeo y conectarlo y encenderlo. Si la luz no parpadea 1 segundo encendida, 1 segundo apagada, los fusibles de su reloj están en mal estado

Respuestas (1)

En primer lugar,

¿Está seguro de que el pin FTDI TX está conectado al pin RX del Arduino y el pin RX FTDI al pin TX del arduino?

En alrededor del 50% de los prototipos que he visto, hay un problema como ese. Por lo tanto, es lo primero que hay que comprobar.