westfw:
IIRC, the AVRDude code has been modified to manipulate both RTS and DTR, so you CAN use auto-reset even with FTDI adapters that do not break out the DTR signal. (CTS is an input to the FTDI, and so is irrelevant.)
The support for using RTS for Arduino auto-reset was added when the "arduino" protoco added to avrdudel.
The arduino prodotocol is basically the same as stk500 other than it toggles RTS up front.
Prior to the arduino protocol being added to avrdude, the IDE opened the serial port and toggled the RTS signal itself before running avrdude.
I'm not sure if the IDE is still doing this even though it would be unnecessary when using the "arduino" protocol - I haven't looked at the IDE code in a long time.
Some additional information:
The biggest difference in RTS vs DTR is that normally DTR is under control of the operating system vs the application.
By contrast while RTS is normally often used for h/w flow control, nearly all operating systems allow applications to manually control the RTS signal.
While some operating systems do allow an application to control the DTR output signal, the normal behavior is that the operating system controls the DTR signal and attempts set it to mimic what DTR should mean. Data Terminal Ready: "someone is capable of listing to the data signal". So the operating system will drop the DTR signal when the first open is done on the serial device by an application.
DTR remains low until the last application closes the serial device.
The original Arduino boards did not have auto reset and required manually pushing the reset button.
It was clear that to make downloading easier it would be great if the reset happened automatically.
Someone got the idea to use the DTR signal to autoreset the AVR.
But since the DTR signal was controlled by the OS and not by application (IDE or avrdude) and the DTR signal was a level signal vs a pulse, it could not be used directly.
To remedy that a capacitor was added in series between the DTR signal and the AVR reset signal.
This converts the DTR level signal to a pulse without any s/w interaction which is how auto-reset works when using the DTR signal. No s/w is involved for auto-reset when using the DTR signal.
Using DTR to auto-reset the Arduino was a h/w only solution to a s/w problem.
While this worked great, the original genuine FTDI cable didn't bring out DTR to the 6 pin connector.
That cable brought out RTS# and CTS# signals. RTS# being pin 6 or the green wire.
So to make auto-reset work on the FTDI cable, s/w had to be modified.
Unfortunately, the "quick fix" was to modify the IDE to toggle the RTS rather than add support for it to avrdude.
Several years later, the "arduino" protocol was added to avrdude. The "arduino" protocol is identical to the stk500 protocol other than it toggles the RTS signal for arduino autoreset.
So you can use either RTS or DTR for auto reset. The inline cap will work with either the level signal from DTR or the pulse signal from RTS.
One of the advantages of using RTS over DTR for auto-reset is that since RTS is not messed with by the operating system at serial port open time and can be controlled by application, the RTS signal does not cause an auto-reset when the serial port is opened by the application.
This can be useful as it can allow an application to open and close the serial port for communication with the Arduino board without causing and auto-reset.
This is not the case when using DTR, as DTR will always cause an auto-reset as soon as the serial port is opened by the application.
I really wish that Arduino would switch from using DTR to using RTS as that would allow some great new capabilities in the IDE.
- The serial monitor could connect to the arduino without resetting it.
- The serial monitor or IDE could have a [RESET] button to reset the board without having to close/re-open the serial port which can potentially miss serial output from the arduino board.
--- bill