Die Übertragung (TX) wird unter Verwendung von FTDI 232RL mit ATmega328-PU angehalten

FTDI scheint ein beliebtes Forumsthema zu sein, aber ich kann anscheinend keine Antwort auf ein verwirrendes Problem finden, das ich habe. Ich werde versuchen, so viele Details wie möglich zu geben, da ich das Problem nicht eingrenzen kann.

Ich verwende einen ATmega328-PU (das billigere Problemkind für ArduinoISP-Benutzer) mit einem FTDI 232-RL Breakout Board. Ich konnte den Arduino-Bootloader problemlos mit dem Breakout-Board brennen und die von mir verwendete Skizze laden.

Jetzt versuche ich, den seriellen FTDI-COM-Port von meinem PC als Schnittstelle mit dem 328 zu verwenden. Die einzigen Pins, die ich vom Breakout-Board zu meinem Board verlege, sind die TX-, RX- und GND-Pins. Ich verwende eine Baudrate von meiner seriellen Schnittstelle von 115200.

Symptome: Die RX-Anzeige blinkt ständig, sodass der PC viele glückliche Bits erhält. Die TX-Anzeige blinkt etwa 1 Sekunde lang und erlischt dann. Keine glücklichen Bits von FTDI zu ATmega328.

Ich habe keine Reset-Taste an meiner 328-Schaltung, nur einen Widerstand gegen +5 V. Ich habe einen externen 16-MHz-Takt in meiner Schaltung. Ich habe den Setup-Code meiner Skizze als zusätzliche Referenz beigefügt.

Nun die Fragen:

1) Muss ich irgendetwas mit den CTS- und DTR-Pins machen, die vom Breakout-Board kommen?

2) Gibt es noch eine interne Uhr auf dem ATmega328, die mich vermasselt (auch nach dem Bootloader? Wenn ja, wie würde ich sie deaktivieren?

3) Braucht es eine Reset-Taste in meiner Schaltung, wenn die Skizze bereits geladen ist?

Hoffentlich kann jemand etwas Licht in mein Problem bringen. Sehr geschätzt!

Hier ist der Setup-Code (nach dem Deklarieren von Pins auf 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) CTS und DTR müssen während der standardmäßigen seriellen Datenübertragung nicht verwendet werden. (2) Es gibt eine verwendbare interne Uhr, aber Sie müssten sie zuerst speziell aktivieren, also denke ich, dass das kein Problem ist. (3) Kein Zurücksetzen erforderlich; Sie sind nur UART empfangen und senden.
Haben Sie eine andere einfache Skizze ausprobiert? Da Sie den Arduino-Bootloader ausführen, wie wäre es mit einem einfachen Serial.begin (115200); und Serial.print ("abc"); -- was passiert dann auf der TX-Anzeige und auf dem seriellen Terminal Ihres PCs?
Das Setup, das Sie für den USART gepostet haben, scheint mir vor allem richtig zu sein. Können Sie weitere Informationen geben? (Rest der Skizze, Link zu Modulen, die Sie verwenden). Fügen Sie insbesondere Ihren ISR (Interrupt Service Routine Code) hinzu, da ich nicht sicher bin, wie dies in einer Arduino-Skizze gehandhabt wird.
Ich denke, Ihre Interpretation der TX- und RX-Anzeigen ist nicht korrekt. RX bedeutet nicht, dass der PC Daten sendet, TX schon.
Ohne Schema der LEDs ist es schwer zu sagen, was was ist, aber zumindest ist die Logik der TX/RX-Bewertung gebrochen - nur eine der beiden wird vom PC/FTDI angesteuert. Der andere wird vom ATMEGA angesteuert und könnte vom FTDI nicht deaktiviert werden, wenn der ATMEGA so programmiert wurde, dass er kontinuierlich sendet (da es anscheinend keine Rücksetzschaltung wie die serielle Statussteuerleitung zum Kondensator gibt, mit der der FTDI/PC austricksen könnte sende es zurück an den Bootloader)
Der einfachste Weg, um zu überprüfen, ob die Uhr richtig ist, besteht darin, die Blink-Beispielskizze zu laden und anzuschließen und zu führen. Wenn das Licht nicht 1 Sekunde an, 1 Sekunde aus blinkt, sind die Sicherungen Ihrer Uhr durcheinander

Antworten (1)

Erstens,

Sind Sie sicher, dass der FTDI-TX-Pin mit dem RX-Pin des Arduino und der RX-FTDI-Pin mit dem TX-Pin des Arduino verbunden ist?

Bei etwa 50 % der Prototypen, die ich gesehen habe, gibt es ein solches Problem. Daher ist es das Erste, was zu überprüfen ist.