diff --git a/include/dynamixel_slave_uart_dma.h b/include/dynamixel_slave_uart_dma.h
index 706ca3b4bfca758e666044a5834adbc81f2757ee..65454ddbdd1f018750ea88a81cd191267d5f3d2c 100644
--- a/include/dynamixel_slave_uart_dma.h
+++ b/include/dynamixel_slave_uart_dma.h
@@ -12,5 +12,6 @@ uint8_t dyn_slave_is_packet_ready(void);
 void dyn_slave_get_inst_packet(uint8_t *packet);
 void dyn_slave_send_status_packet(uint8_t error,uint8_t length, uint8_t *data);
 void dyn_slave_resend_status_packet(uint8_t *packet);
+void dyn_slave_reset(void);
 
 #endif
diff --git a/include/ram.h b/include/ram.h
index 94a1512006a670f117ab4a0affd0885e03e35615..126d156b410ce24a43dcafe7250b3f3ced400afb 100644
--- a/include/ram.h
+++ b/include/ram.h
@@ -1,6 +1,10 @@
 #ifndef _RAM_H
 #define _RAM_H
 
-uint8_t ram_data[256];
+#include "stm32f4xx.h"
+
+extern uint8_t ram_data[256];
+
+void ram_init(void);
 
 #endif
diff --git a/src/adc_dma.c b/src/adc_dma.c
index eab7f26df10ad535678cd8d78ad03bd1978ace7d..19a70aaa2a82ab8a8194a83765c07b2e29f8c6bc 100644
--- a/src/adc_dma.c
+++ b/src/adc_dma.c
@@ -1,4 +1,5 @@
 #include "adc_dma.h"
+#include "ram.h"
  
 #define ADC1_CH1           ADC_Channel_TempSensor
 #define ADC1_CH2           ADC_Channel_8
@@ -36,7 +37,8 @@
 #define ADC_CCR_ADDRESS    ((uint32_t)0x40012308)
 
 // private variables
-uint8_t adc_data[16];
+
+// interrupt handlers
 
 // public functions
 void adc_init(void)
@@ -55,7 +57,7 @@ void adc_init(void)
 
   /* DMA Config */
   DMA_InitStructure.DMA_Channel = DMA_Channel_0;
-  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)adc_data;
+  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ram_data[50];
   DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC_CCR_ADDRESS;
   DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
   DMA_InitStructure.DMA_BufferSize = 4;
@@ -87,7 +89,7 @@ void adc_init(void)
 
   /* ADC Common Init */
   ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
-  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
+  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
   ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;
   ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
   ADC_CommonInit(&ADC_CommonInitStructure);
@@ -139,8 +141,5 @@ void adc_init(void)
 
 uint16_t adc_get_temperature(void)
 {
-  uint16_t value;
-
-  value=adc_data[0]+(adc_data[1]<<8);
-  return value;
+  return 0x0000;
 }
diff --git a/src/bioloid_stm32.c b/src/bioloid_stm32.c
index 4270daee979620d6a44c806741293f78c1193df4..340a044022adaad36d8b269c763fdf033a9ecf5c 100644
--- a/src/bioloid_stm32.c
+++ b/src/bioloid_stm32.c
@@ -8,6 +8,8 @@
 #include "eeprom.h"
 #include "imu_9dof_dma.h"
 #include "gpio.h"
+#include "ram.h"
+#include "adc_dma.h"
 
 uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data)
 {
@@ -27,33 +29,18 @@ uint8_t read_operation(uint8_t address, uint8_t length, uint8_t *data)
   }
   else// RAM region
   {
+    for(i=0;i<length;i++)
+      data[i]=ram_data[address+i];
     return DYN_NO_ERROR;
   }
 }
 
-void test_gpio(void)
-{
-  gpio_toggle_led(NORTH_LED);
-}
-
 int32_t main(void)
 {
   uint8_t inst_packet[1024];
   uint8_t status_packet[1024];
   uint8_t data[1024],error;
   uint16_t address;
-  GPIO_InitTypeDef  GPIO_InitStructure;
-
-  /* GPIOD Periph clock enable */
-  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);
-
-  /* Configure PD12, PD13, PD14 and PD15 in output pushpull mode */
-  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13| GPIO_Pin_14| GPIO_Pin_15;
-  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
-  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
-  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
-  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
-  GPIO_Init(GPIOD, &GPIO_InitStructure);
 
   /* initialize EEPROM */
   EE_Init();
@@ -70,21 +57,10 @@ int32_t main(void)
   imu_init();
   /* initialize the gpio */
   gpio_init();
-
-  if(imu_accel_detect())
-    GPIO_SetBits(GPIOD,GPIO_Pin_12);
-  else
-    GPIO_ResetBits(GPIOD,GPIO_Pin_12);
-  if(imu_gyro_detect())
-    GPIO_SetBits(GPIOD,GPIO_Pin_13);
-  else
-    GPIO_ResetBits(GPIOD,GPIO_Pin_13);
-  if(imu_compass_detect())
-    GPIO_SetBits(GPIOD,GPIO_Pin_14);
-  else
-    GPIO_ResetBits(GPIOD,GPIO_Pin_14);
-
-  gpio_set_pushbutton_callback(NORTH_PB,test_gpio);
+  // initialize the Dynamixel RAM memory space
+  ram_init();
+  // initialize the Analog to digital converter
+  adc_init();
 
   while(1)                             /* main function does not return */
   {
@@ -122,6 +98,8 @@ int32_t main(void)
             // send the answer back to the computer
             dyn_slave_resend_status_packet(status_packet);
           }
+          else
+            dyn_slave_reset();// prepare the dynamixel master to accept data
         }
       }
       else
diff --git a/src/dynamixel_slave_uart_dma.c b/src/dynamixel_slave_uart_dma.c
index 8b981fd6cc025d2d565d429ee2cd0f13649f4e5b..a32011a0d89f180d9b787eca10966963d293aa06 100644
--- a/src/dynamixel_slave_uart_dma.c
+++ b/src/dynamixel_slave_uart_dma.c
@@ -288,3 +288,16 @@ void dyn_slave_resend_status_packet(uint8_t *packet)
   USART_DMACmd(DYN_SLAVE, USART_DMAReq_Tx, ENABLE);
   dyn_slave_sending_packet=0x01;
 }
+
+void dyn_slave_reset(void)
+{
+  dyn_slave_sending_packet=0x00;
+  // set up the DMA RX transaction
+  DYN_SLAVE_DMA_RX_InitStructure.DMA_BufferSize = 4;
+  DYN_SLAVE_DMA_RX_InitStructure.DMA_Memory0BaseAddr = (uint32_t)dyn_slave_rx_buffer;
+  DMA_Init(DYN_SLAVE_RX_DMA_STREAM,&DYN_SLAVE_DMA_RX_InitStructure);
+  DMA_ITConfig(DYN_SLAVE_RX_DMA_STREAM,DMA_IT_TC,ENABLE);
+  DMA_Cmd(DYN_SLAVE_RX_DMA_STREAM,ENABLE);
+  USART_DMACmd(DYN_SLAVE, USART_DMAReq_Rx, ENABLE);
+  dyn_slave_receiving_header=0x01;
+}
diff --git a/src/ram.c b/src/ram.c
new file mode 100644
index 0000000000000000000000000000000000000000..860bea4738c0c92823b09e262d8fb350fde4bcbe
--- /dev/null
+++ b/src/ram.c
@@ -0,0 +1,8 @@
+#include "ram.h"
+
+uint8_t ram_data[256];
+
+void ram_init(void)
+{
+  // read contents from EEPROM to RAM
+}