diff --git a/china_io-2019/avr/china-io.c b/china_io-2019/avr/china-io.c
index be0854334f5a3a88901ff19f7413223a3b567f2a..ac414e6bf68e27cbae7185e47d7856f694d44df5 100644
--- a/china_io-2019/avr/china-io.c
+++ b/china_io-2019/avr/china-io.c
@@ -192,7 +192,7 @@ SIGNAL(TIMER1_COMPA_vect)
   PORT_SPI |= (1<<DD_SS); // Chip deselect
 
   union {
-    int32_t i;
+    uint32_t i;
     unsigned char b[4];
   } v;
   uint8_t chan;
@@ -204,10 +204,10 @@ SIGNAL(TIMER1_COMPA_vect)
   adc.value[chan] = (v.i>>6);
 }
 
-static uint32_t conf_millivolt(uint32_t value)
+static uint32_t conf_millivolt(int32_t value)
 {
   if (value < 0) {
-    return CONF_NEGATIVE_MILLIVOLT(value);
+    return CONF_NEGATIVE_MILLIVOLT(-value);
   } else {
     return CONF_POSITIVE_MILLIVOLT(value);
   }
@@ -271,30 +271,31 @@ int main()
 
     cli(); // Global interrupt disable
     if (readchannels == 0) {
+      // Process all old readchannels before updating
       readchannels = serial_readchannels;
       serial_readchannels = 0;
     }
+    local_adc = adc;
     config = serial_readconfig;
     serial_readconfig = 0;
-    local_adc = adc;
     sei(); // Global interrupt enable 
     if (readchannels & 0x01) {
-      serialio_putchannel(0, local_adc.value[0]);
+      serialio_putchannel(0, local_adc.value[0] & 0x3ffff);
       readchannels &= ~0x01;
     } else if (readchannels & 0x02) {
-      serialio_putchannel(1, local_adc.value[1]);
+      serialio_putchannel(1, local_adc.value[1] & 0x3ffff);
       readchannels &= ~0x02;
     } else if (readchannels & 0x04) {
-      serialio_putchannel(2, local_adc.value[2]);
+      serialio_putchannel(2, local_adc.value[2] & 0x3ffff);
       readchannels &= ~0x04;
     } else if (readchannels & 0x08) {
-      serialio_putchannel(3, local_adc.value[3]);
+      serialio_putchannel(3, local_adc.value[3] & 0x3ffff);
       readchannels &= ~0x08;
     }
     if (i2c_idle()) {
       cli();
       dac8574_set_chan(&dac8574.a, calibration.channel[0].offset); 
-      dac8574_set_chan(&dac8574.b, calibration.channel[0].offset);
+      dac8574_set_chan(&dac8574.b, calibration.channel[1].offset);
       dac8574_set_chan(&dac8574.c, dac.value[0]);
       dac8574_set_chan(&dac8574.d, dac.value[1]);
       sei();
@@ -316,8 +317,6 @@ int main()
       CONF_ANALOG_IN(3, CONF_MAX(CONF_POSITIVE_MILLIVOLT(10000)));
 
       CONF_ANALOG_OUT(0, CONF_RESOLUTION(16));	// Analog Out 0
-      //CONF_ANALOG_OUT(0, CONF_MIN(CONF_NEGATIVE_MILLIVOLT(10000)));
-      //CONF_ANALOG_OUT(0, CONF_MAX(CONF_POSITIVE_MILLIVOLT(10000)));
       CONF_ANALOG_OUT(0, CONF_MIN(conf_millivolt(calibration.channel[0].min)));
       CONF_ANALOG_OUT(0, CONF_MAX(conf_millivolt(calibration.channel[0].max)));
       CONF_ANALOG_OUT(1, CONF_RESOLUTION(16));	// Analog Out 1
diff --git a/china_io-2019/python/calibrator.py b/china_io-2019/python/calibrator.py
index 1a0965ca477446b7253ccd9e50a0236d3f9ee775..dcd2be6b6919aa8823bcf7ca0ec252bb30c02059 100755
--- a/china_io-2019/python/calibrator.py
+++ b/china_io-2019/python/calibrator.py
@@ -119,6 +119,10 @@ class ChinaIO:
             if c.bits != 18:
                 raise Exception('analogIn[%d] is not 18 bit (%d)' % (i, c.bits))
             pass
+        for i,c in analogOut.items():
+            if c.bits != 16:
+                raise Exception('analogOut[%d] is not 16 bit (%d)' % (i, c.bits))
+            pass
 
         # Set offset calibration to default value
         # self.io.setchannel(31, (0x8000 << 8) | 0x00)
@@ -133,7 +137,6 @@ class ChinaIO:
                                 (-0.1, 0.1), (-0.1, 0.1) ],
                               N=500,
                               message='Ground all input pins'):
-            break
             pass
 
         # Connect AOut0 -> AIn0,AIn2 (+9V)