diff --git a/arduino.c b/arduino.c
index 895096d..b62bf2f 100644
--- a/arduino.c
+++ b/arduino.c
@@ -88,14 +88,56 @@ static int arduino_open(PROGRAMMER * pgm, char * port)
   strcpy(pgm->port, port);
   serial_open(port, pgm->baudrate? pgm->baudrate: 115200, &pgm->fd);
 
-  /* Clear DTR and RTS to unload the RESET capacitor 
-   * (for example in Arduino) */
-  serial_set_dtr_rts(&pgm->fd, 0);
-  usleep(50*1000);
-  /* Set DTR and RTS back to high */
+  /*
+   * The reset pin has a pull-up resistor R to Vcc.
+   * After startup, this keeps the AVR _out_ of RESET.
+   * To reset the AVR, its reset pin must be pulled LOW.
+   *
+   *        Vcc                              
+   *         +                               
+   *         |                               
+   *         |             +-----------+      
+   *         |             |    AVR    |      
+   *        +++            |-----------|      
+   *        | |            |           |      
+   *        | |   R        |           |      
+   *        | | (10k)      |           |      
+   *        | |            |           |      
+   *        +++            |           |      
+   *         |             |           |      
+   *         +-------------+ RESET     |      
+   *         |             |           |      
+   *       +-+-+    C      |           |      
+   *       +-+-+ (100nF)   +-----------+      
+   *         |                                
+   *         |                                
+   *         |        
+   *         +        
+   *        DTR       
+   *     (HIGH/LOW)   
+   * 
+   * As the DTR (or RTS) line can only be HIGH or LOW (not negative),
+   * the only way to pull RESET to LOW is this:
+   * 
+   * A transition from HIGH to LOW
+   * 
+   * The other way around (LOW to HIGH) pushes the RESET pin
+   * to about 2x Vcc for a short time, which does NOT reset
+   * the chip.
+   * 
+   * Therefore DTR must first be set to HIGH, then to LOW,
+   * not the other way around.
+   * 
+   */
+  
+  /* Set DTR and RTS to HIGH */
   serial_set_dtr_rts(&pgm->fd, 1);
   usleep(50*1000);
 
+  /* Set DTR and RTS back to LOW */
+  serial_set_dtr_rts(&pgm->fd, 0);
+  usleep(50*1000);
+
   /*
    * drain any extraneous input
    */
