Пример #1
0
// reset of user io lines 3,4 for update from 2 io lines to 4
void io_reset_params_io34_only(void)
{
  struct io_setup_s *setup;
  for(int n=2; n<4; ++n)
  {
    setup = &io_setup[n];
    util_fill((void*)setup, sizeof *setup, 0);
    setup->delay = 500;
    setup->pulse_dur = 10;
  }
  EEPROM_WRITE(&eeprom_io_setup[2], &io_setup[2], (char*)&eeprom_io_setup[4] - (char*)&eeprom_io_setup[2]);
  EEPROM_WRITE(&eeprom_io_signature_io34, &io_signature_io34, sizeof eeprom_io_signature_io34);
}
Пример #2
0
void tstat_reset_params(void)
{
  util_fill((void*)tstat_setup, sizeof tstat_setup, 0xff);
  struct tstat_setup_s *setup = tstat_setup;
  for(int n=0; n<TSTAT_MAX_CHANNEL; ++n, ++setup)
  {
    setup->setpoint = 20;
    setup->hyst = 2;
    setup->sensor_no = 0;
  }
  EEPROM_WRITE(eeprom_tstat_setup, tstat_setup, sizeof eeprom_tstat_setup);
  EEPROM_WRITE(&eeprom_tstat_signature, &tstat_signature, sizeof eeprom_tstat_signature);
}
Пример #3
0
void io_reset_params(void)
{
  int n;
  struct io_setup_s *setup;
  util_fill((unsigned char*)io_setup, sizeof io_setup, 0);
  for(n=0, setup=io_setup; n<IO_MAX_CHANNEL; ++n, ++setup)
  {
   setup->delay  = 500;
   setup->pulse_dur = 10;
  }
  EEPROM_WRITE(&eeprom_io_setup, io_setup, sizeof io_setup);
  EEPROM_WRITE(&eeprom_io_signature, &io_signature, sizeof eeprom_io_signature);
}
Пример #4
0
void logic_pinger_reset_params(void)
{
  util_fill((void*)&logic_pinger_setup, sizeof logic_pinger_setup, 0); // it was 0xff, now 0 to clear hostname 21.05.2013
  struct logic_pinger_setup_s *setup = logic_pinger_setup;
  for(int i=0; i<LOGIC_MAX_PINGER; ++i, ++setup)
  {
    setup->ip32 = 0;
    setup->period = 15;
    setup->timeout = 1000;
  }
  EEPROM_WRITE(eeprom_logic_pinger_setup, logic_pinger_setup, sizeof eeprom_logic_pinger_setup);
  EEPROM_WRITE(&eeprom_logic_pinger_signature, &logic_pinger_signature, sizeof eeprom_logic_pinger_signature);
}
int main(void)
{
	
	DDRD=0xFF;
	
	unsigned int Addr[3]={1,2,3}; //Adress Array
	unsigned char Data[3]={0x10,0x4F,0xF0}; // Datenarray
	unsigned char Vergleichswert; //Vergleichswert initialisieren
		
		for (int i=0;i<3;i++) //Beschreiben des EEPROMs, NUR BEI PROGRAMMSTART!
		{
			EEPROM_WRITE(Addr[i],Data[i]);
		}
	


    while (1)  //Endlosschleife
    {	
		for (int j=0;j<3;j++) // Durchschalten der verschiedenen EEPROM-Zustände auf Ausgang
    {
		Vergleichswert=EEPROM_READ(Addr[j]);
		
		FAST_PWM(Vergleichswert);
		//_delay_ms(5000); //Anschalten , für Sim-Zwecke ausgeschaltet
    }

		
    }
}
Пример #6
0
void log_write(unsigned addr, const unsigned char *buf, unsigned size)
{
  if(addr < LOG_START) return;
  if(addr + size - 1 > LOG_END) return;
  EEPROM_WRITE(addr, (void*)buf, size);
  ////util_cpy((void*)buf, log_debug+addr-LOG_START, size);
}
Пример #7
0
void main(void) {
    TRISB0 = 0; //blue
    TRISB1 = 0; //green
    TRISB2 = 0; //red

    //set up timer
    T0IF = 0;
    TMR0 = PW_period;
    T0CS = 0;
    PSA = 1;
    GIE = 1; //global interrupt flag
    T0IE = 1;

    TRISB3 = 1; //button

    short i = EEPROM_READ(0x0A);
    while (1) {
        if (i >= 360/60) i=0;

        EEPROM_WRITE(0x0A, i);

        setHue(60*i);

        //delay(1000);
        while(RB3 == 1); //debounce
        while(RB3 == 0);
        setColor(100,100,100);
        delay(1000);
        i++;
    }
}
Пример #8
0
int tstat_http_set_data(void)
{
  http_post_data((void*)&tstat_setup, sizeof tstat_setup);
  EEPROM_WRITE(eeprom_tstat_setup, tstat_setup, sizeof eeprom_tstat_setup);
  tstat_restart();
  http_redirect("/logic.html");
  return 0;
}
Пример #9
0
int logic_http_set_data(void)
{
  http_post_data((void*)&logic_setup, sizeof logic_setup);
  EEPROM_WRITE(eeprom_logic_setup, logic_setup, sizeof eeprom_logic_setup);
  logic_restart();
  http_redirect("/logic.html");
  return 0;
}
Пример #10
0
void logic_reset_params(void)
{
  util_fill((void*)logic_setup, sizeof logic_setup, 0xff);
  struct logic_setup_s *setup = logic_setup;
  for(int n=0; n<LOGIC_MAX_RULES; ++n, ++setup)
  {
    setup->flags = 0;
    setup->input = 0x10;
    setup->condition = 1;
    setup->action = 0;
    setup->output = 0xa0;
  }
  logic_flags = 0;
  EEPROM_WRITE(eeprom_logic_setup, logic_setup, sizeof eeprom_logic_setup);
  EEPROM_WRITE(&eeprom_logic_flags, &logic_flags, sizeof eeprom_logic_flags);
  EEPROM_WRITE(&eeprom_logic_signature, &logic_signature, sizeof eeprom_logic_signature);
}
Пример #11
0
unsigned io_http_set_data(void)
{
  http_post_data((void*)&io_setup, sizeof io_setup);
  EEPROM_WRITE(&eeprom_io_setup, io_setup, sizeof io_setup);
  io_restart();
  http_redirect("/io.html");  ////////////// proj-dependant
  return 0;
}
Пример #12
0
int logic_pinger_http_set_data(void)
{
  http_post_data((void*)&logic_pinger_setup, sizeof logic_pinger_setup);
#ifdef DNS_MODULE
  struct logic_pinger_setup_s *ep = eeprom_logic_pinger_setup;
  struct logic_pinger_setup_s *p =  logic_pinger_setup;
  for(int i=0; i<LOGIC_MAX_PINGER; ++i, ++ep, ++p)
    dns_resolve(ep->hostname, p->hostname);
#endif
  EEPROM_WRITE(eeprom_logic_pinger_setup, logic_pinger_setup, sizeof eeprom_logic_pinger_setup);
  logic_pinger_restart();
  http_redirect("/logic.html");
  return 0;
}
Пример #13
0
unsigned io_http_set_data(void)
{
  unsigned ch;
  switch(http.page->name[2]) // '/cNio_set.cgi'
  {
  case '1': ch = 0; break;
  case '9': ch = 8; break;
  default: return 0;
  }
  const unsigned half_setup_size = (char*)&io_setup[7] - (char*)&io_setup[0] + sizeof io_setup[7]; // alignment-wise
  http_post_data((void*)&io_setup[ch], half_setup_size);
  EEPROM_WRITE(&eeprom_io_setup[ch], &io_setup[ch], half_setup_size);
  io_restart();
  http_redirect(ch==0 ? "/cio.html?ch=1" : "/cio.html?ch=9");
  return 0;
}
Пример #14
0
unsigned logic_http_get_run(unsigned pkt, unsigned more_data) // control of logic running and reset
{
  extern char* util_scan_caseless(char* s, char *sub, char* end, int skip_flag);
  char *data = util_scan_caseless(req, "/logic_run.cgi?", req + 64, 1); // parsing routine from http2.c module
  unsigned char c;
  if(data)
  {
    c = *data;
    if(c=='0') logic_flags &=~ LOGIC_RUNNING;
    if(c=='1') logic_flags |=  LOGIC_RUNNING;
    if(c=='2') logic_restart();
    if(c=='0' || c=='1') EEPROM_WRITE(&eeprom_logic_flags, &logic_flags, sizeof eeprom_logic_flags);
  }
  c = logic_flags & LOGIC_RUNNING ? '1' : '0' ;
  tcp_put_tx_body(pkt, &c, 1);
  return 0;
}
Пример #15
0
/*==============================================================================
Name    : eeprom_write
--------------------------------------------------------------------------------
Purpose : Write data to EEPROM
Input   : Address where the data must be saved, data
Output  :
Notes   :
==============================================================================*/
void eeprom_write(uint16_t ui_address, uint8_t ui_data)
{
#if !defined(_ATXMEGA_DEVICE_)
   /* FOR TINY / MEGA EEPROM ACCESS */
   /* Wait for completion of previous write */
   while(EECR & (1<<EEPE));
   /* Set up address and Data Registers */
   #if defined ( __ICCAVR__ )
      EEAR = ui_address;
   #elif defined( __GNUC__ ) /* defined ( __ICCAVR__ ) */
      #if defined (__AVR_MEGA__)
       EEAR = ui_address;
	 #else
	   EEARL = (uint8_t)ui_address;
	 #endif
   #endif /* defined( __GNUC__ ) */
   EEDR = ui_data;
   EEPROM_WRITE();
#else
   /* FOR XMEGA EEPROM ACCESS */
   /* Wait for pending NVM operation */
   do{} while(( NVM.STATUS & NVM_NVMBUSY_bm ) == NVM_NVMBUSY_bm );
   if ((NVM.STATUS & NVM_EELOAD_bm) != 0) {
      /* Command - Erase eeprom buffer */
      NVM.CMD = NVM_CMD_ERASE_EEPROM_BUFFER_gc;
      /* Command - Execute */
      NVM_EXEC();
   }
   /* Command - Load EEPROM buffer */
   NVM.CMD = NVM_CMD_LOAD_EEPROM_BUFFER_gc;
   /* Load address to write to. */
   NVM.ADDR0 = ui_address & 0xFF;
   NVM.ADDR1 = (ui_address >> 8) & 0x1F;
   NVM.ADDR2 = 0x00;
   /* Load data to write */
   NVM.DATA0 = ui_data;
   /* Load Atomic write command */
   NVM.CMD = NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc;
   NVM_EXEC();
   /* Wait for pending NVM operation */
   do{} while(( NVM.STATUS & NVM_NVMBUSY_bm ) == NVM_NVMBUSY_bm );
#endif
}
Пример #16
0
unsigned io_http_set_single_pulse(void)
{
  struct {
    unsigned char ch;
    unsigned char duration;
  } data;
  data.duration = 0xaa;
  http_post_data((void*)&data, sizeof data);
  if(data.duration != 0xaa && data.ch < IO_MAX_CHANNEL)
  {
    struct io_setup_s *setup = &io_setup[data.ch];
    if(setup->pulse_dur != data.duration) // save duration
    {
      setup->pulse_dur = data.duration;
      EEPROM_WRITE(&eeprom_io_setup[data.ch].pulse_dur, &setup->pulse_dur, sizeof eeprom_io_setup[0].pulse_dur);
    }
    io_start_pulse(data.ch);
  }
  //// http_redirect("/io.html");
  http_reply(200, ""); // in 48/52/60/201/202 html used XHR, not submit
  return 0;
}
Пример #17
0
/******************************************************************************************
*    COMMAND FUNCTIONS        *
******************************************************************************************/
void ProcessCommand(void)
{
    if (HEART_B == '1')
        ACT_LED_01 = 0; //Turn it ON (inverted open drain)
    if (COMMAND_DATA[0] == 'R')// READ COMMAND --------------------------------------------
    {


        if (COMMAND_DATA[1] == '*')// READ ALL REGISTERS
        {

            Read_Analog_Inputs(); // READ ANALOG PERIPHERIALS****
            Read_Digital_Inputs(); // READ DIGITAL INPUT PERIPHERIALS**
            Read_Digital_Outputs(); // READ DIGITAL OUTPUT PERIPHERIALS**

            SEND_TX_START();    // START TRANSMISSION
            SEND_ANALOG_DATA();
            WriteUSART(0x2C);
            while (BusyUSART()); // Send a  ,
            SEND_DIGITAL_INPUT_DATA();
            WriteUSART(0x2C);
            while (BusyUSART()); // Send a  ,
            SEND_DIGITAL_OUTPUT_DATA();
            SEND_TX_STOP(); // End all transmissions

        }

        if (COMMAND_DATA[1] == 'C')// READ REGISTER LIST
        {
            if (COMMAND_DATA[2] == '0')// READ INFO REGISTER 0  MODEL
            {
                for (unsigned char n=0; n <= 7; n++ ) //Reset Buffer
                    TRANSMITT_DATA[n] = EEPROM_READ(n); // COPY BUFFER TO COMMAND DATA for further processing
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '1')// READ INFO REGISTER 1  FIRMWARE
            {
                unsigned char d=0x08;
                for (unsigned char n=0; n <= 7; n++ ) //Reset Buffer
                    TRANSMITT_DATA[n] = EEPROM_READ(d),d++; // COPY BUFFER TO COMMAND DATA for further processing
                    
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '2')// READ INFO REGISTER 2  ADDRESS
            {
                TRANSMITT_DATA[0] = EEPROM_READ(0x10); // AdDDRES 1
                TRANSMITT_DATA[1] = EEPROM_READ(0x11); // AdDDRES 1
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '3')// READ INFO REGISTER 3  DEVICE SERIAL NUMBER
            {
                TRANSMITT_DATA[0] = SERIAL[0];
                TRANSMITT_DATA[1] = SERIAL[1];
                TRANSMITT_DATA[2] = SERIAL[2];
                TRANSMITT_DATA[3] = SERIAL[3];
                TRANSMITT_DATA[4] = SERIAL[4];
                TRANSMITT_DATA[5] = SERIAL[5];
                TRANSMITT_DATA[6] = SERIAL[6];
                TRANSMITT_DATA[7] = SERIAL[7];
                SEND_TX_RESPONSE(); // Send list character

            }
            else if (COMMAND_DATA[2] == '4')// READ INFO REGISTER 4  LIST DEVICE
            {
                TRANSMITT_DATA[0] = '@', SEND_TX_RESPONSE(); // Send list character
            }
        }


        else if (COMMAND_DATA[1] == 'A')// READ ANALOG INPUTS ADC
        {
            Read_Analog_Inputs(); // READ ANALOG PERIPHERIALS****
              

            if (COMMAND_DATA[2] == '*') // READ ALL ANALOG DATA AND SEND IT
                SEND_TX_START() , SEND_ANALOG_DATA(), SEND_TX_STOP();
            else if (COMMAND_DATA[2] == '0')// READ ANALOG REGISTER 1
                itoa( TRANSMITT_DATA, ADCValue[0],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '1')// READ ANALOG REGISTER 2
                itoa( TRANSMITT_DATA, ADCValue[1],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '2')// READ ANALOG REGISTER 3
                itoa( TRANSMITT_DATA, ADCValue[2],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '3')// READ ANALOG REGISTER 4
                itoa( TRANSMITT_DATA, ADCValue[3],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024

            else if (COMMAND_DATA[2] == '4')// READ ANALOG REGISTER 5
                itoa( TRANSMITT_DATA, ADCValue[4],10), SEND_TX_RESPONSE(); //convert to string VAL 1 TO 1024


        }

        else if (COMMAND_DATA[1] == 'I')// READ DIGITAL INPUTS
        {
            Read_Digital_Inputs(); // READ DIGITAL PERIPHERIALS**

            if (COMMAND_DATA[2] == '*') // READ ALL DIGITAL INPUTS AND SEND IT
                SEND_TX_START() , SEND_DIGITAL_INPUT_DATA(), SEND_TX_STOP();
            else if (COMMAND_DATA[2] == '0')// READ DIGITAL INPUT REGISTER 1
                TRANSMITT_DATA[0] = INPUTValue[0], SEND_TX_RESPONSE();
            else if (COMMAND_DATA[2] == '1')// READ DIGITAL INPUT REGISTER 2
                TRANSMITT_DATA[0] = INPUTValue[1], SEND_TX_RESPONSE();
            else if (COMMAND_DATA[2] == '2')// READ DIGITAL INPUT REGISTER 3
                TRANSMITT_DATA[0] = INPUTValue[2], SEND_TX_RESPONSE();

        }

        else if (COMMAND_DATA[1] == 'O')// READ DIGITAL OUTPUTS
        {
            
            Read_Digital_Outputs(); // READ DIGITAL PERIPHERIALS**

            if (COMMAND_DATA[2] == '*') // READ ALL DIGITAL INPUTS AND SEND IT            
                SEND_TX_START() , SEND_DIGITAL_OUTPUT_DATA(), SEND_TX_STOP();

            else if (COMMAND_DATA[2] == '0')// READ DIGITAL OUTPUTS REGISTER 1
            {
                if (OUT_00)
                    TRANSMITT_DATA[0] = '1';
                else
                    TRANSMITT_DATA[0] = '0';
                SEND_TX_RESPONSE();
            }
            else if (COMMAND_DATA[2] == '1')// READ DIGITAL OUTPUTS REGISTER 2
            {
                if (OUT_01)
                    TRANSMITT_DATA[0] = '1';
                else
                    TRANSMITT_DATA[0] = '0';
                SEND_TX_RESPONSE();
            }


        }

    }




    else if (COMMAND_DATA[0] == 'W')// WRITE COMMAND ----------------------------------------
    {
        if (COMMAND_DATA[1] == 'O')// WRITE DIGITAL OUTPUT
        {
            if (COMMAND_DATA[2] == '0')// WRITE OUTPUT REGISTER 1
            {
                if (COMMAND_DATA[3] == '1')
                    OUT_00 = 1;
                else
                    OUT_00 = 0;
                TRANSMITT_DATA[0] = '1', SEND_TX_RESPONSE();
            }   
           else if (COMMAND_DATA[2] == '1')// WRITE OUTPUT REGISTER 2
           {
                if (COMMAND_DATA[3] == '1')
                    OUT_01 = 1;
                else
                    OUT_01 = 0;
                TRANSMITT_DATA[0] = '1', SEND_TX_RESPONSE();
           }    

        }
        if (COMMAND_DATA[1] == 'C')// WRITE CONFIGURATION
        {
            if (COMMAND_DATA[2] == '2')// WRITE CONFIGURATION REGISTER 2
            {

                EEPROM_WRITE(0x10, COMMAND_DATA[3]);
                Delay10TCYx(30);
                EEPROM_WRITE(0x11, COMMAND_DATA[4]);
                Delay10TCYx(30);
                Add_HI = COMMAND_DATA[3];
                Add_LO = COMMAND_DATA[4];
                TRANSMITT_DATA[0] = '1', SEND_TX_RESPONSE();

            }
        }
        

    }
    
    ACT_LED_01 = 1; //Turn it OFF (inverted open drain)
    return;
}
Пример #18
0
//-----------------------------------------------
void eeprom_write(unsigned char addr, unsigned char value)
{
EEPROM_WRITE(addr,value);
}
Пример #19
0
/**
 * M500 - Store Configuration
 */
void Config_StoreSettings() {
  char ver[4]= "000";
  EEPROM_START();
  EEPROM_WRITE(ver); // invalidate data first
  EEPROM_SKIP(eeprom_checksum); // Skip the checksum slot
  eeprom_checksum = 0; // clear before first "real data"
  EEPROM_WRITE(axis_steps_per_unit);
  EEPROM_WRITE(max_feedrate);
  EEPROM_WRITE(max_acceleration_units_per_sq_second);
  EEPROM_WRITE(acceleration);
  EEPROM_WRITE(retract_acceleration);
  EEPROM_WRITE(minimumfeedrate);
  EEPROM_WRITE(mintravelfeedrate);
  EEPROM_WRITE(minsegmenttime);
  EEPROM_WRITE(max_xy_jerk);
  EEPROM_WRITE(max_z_jerk);
  EEPROM_WRITE(max_e_jerk);
  EEPROM_WRITE(add_homeing);
#ifndef ULTIPANEL
#ifdef PRINT_PLA
  int plaPreheatHotendTemp = PLA_PREHEAT_HOTEND_TEMP, plaPreheatHPBTemp = PLA_PREHEAT_HPB_TEMP, plaPreheatFanSpeed = PLA_PREHEAT_FAN_SPEED;
#endif
#ifdef PRINT_ABS
  int absPreheatHotendTemp = ABS_PREHEAT_HOTEND_TEMP, absPreheatHPBTemp = ABS_PREHEAT_HPB_TEMP, absPreheatFanSpeed = ABS_PREHEAT_FAN_SPEED;
#endif
#endif
#ifdef PRINT_PLA
  EEPROM_WRITE(plaPreheatHotendTemp);
  EEPROM_WRITE(plaPreheatHPBTemp);
  EEPROM_WRITE(plaPreheatFanSpeed);
#else
  int dummyi = 0;
  EEPROM_WRITE(dummyi);
  EEPROM_WRITE(dummyi);
  EEPROM_WRITE(dummyi);
#endif
  /*#ifdef PRINT_ABS
    EEPROM_WRITE(absPreheatHotendTemp);
    EEPROM_WRITE(absPreheatHPBTemp);
    EEPROM_WRITE(absPreheatFanSpeed);
    #else
    int dummyj = 0;
    EEPROM_WRITE(dummyj);
    EEPROM_WRITE(dummyj);
    EEPROM_WRITE(dummyj);
    #endif*/
#ifdef PIDTEMP
  EEPROM_WRITE(Kp);
  EEPROM_WRITE(Ki);
  EEPROM_WRITE(Kd);
#else
  float dummy = DUMMY_PID_VALUE;
  EEPROM_WRITE(dummy);
  dummy = 0.0f;
  EEPROM_WRITE(dummy);
  EEPROM_WRITE(dummy);
#endif
#ifndef DOGLCD
  int lcd_contrast = 32;
#endif
  EEPROM_WRITE(lcd_contrast);
#if !HAS_BED_PROBE
  float zprobe_zoffset = 0.0f;
#endif
  EEPROM_WRITE(zprobe_zoffset);
  uint16_t final_checksum = eeprom_checksum, eeprom_size = eeprom_index;
  eeprom_index=EEPROM_OFFSET;
  EEPROM_WRITE(version); // validate data
  EEPROM_WRITE(final_checksum);
  SERIAL_ECHO_START;
  SERIAL_ECHOPAIR("Settings Stored (", (unsigned long)eeprom_size);
  SERIAL_ECHOLNPGM(" bytes)");
}
Пример #20
0
/*==============================================================================
*   MODULE        : main
*   FUNCTION      : IR Remocon リモコンメイン関数
*   ARGUMENT      : none
*   RETURN        : none
*   NOTE          : none
*===============================================================================*/
void main()
{
    unsigned char   i;              /* LED 点滅回数カウンタ         */
    unsigned char   ir_state;       /* 受信状態 (成功/不明/ノイズ)  */
    unsigned char   key_code;       /* キーコード取得用             */
    unsigned char   func_key_type;  /* ファンクションキー種別       */
    unsigned char   eep_offset;     /* EEPROM保存先 オフセット      */


    /* PORT A/B/C 入出力設定 (1b:Input 0b:Output)   */
    TRISA   = 0xCF; /* Port A 入出力設定            */
	TRISB   = 0x00; /* Port B 入出力設定            */    /* masa すべてのPORTをOUTPUTにする。*/
    //TRISB   = 0xC1; /* Port B 入出力設定            */
    TRISC   = 0x81; /* Port C 入出力設定            */

    /* A/Dコンバータ設定                            */
    ADCON0  = 0x00; /* ADコンバータ電源OFF(未使用)  */
    ANSEL   = 0x00; /* AN0~AN7  Pin Digital I/O     */
    ANSELH  = 0x00; /* AN8~AN13 Pin Digital I/O     */

    /* コンパレータ設定                             */
    CM1CON0 = 0x07; /* Comparator 1 Disable         */
    CM2CON0 = 0x07; /* Comparator 2 Disable         */

    /* キャリア周波数設定 (PWM用 TIMER2 の設定)     */
    PR2     = 0x19; /* 38KHz (1cycle = 25~26us)     */
    T2CON   = 0x0C; /* Postscaler   -> 1:2          */
                    /* Timer2       -> ON           */
                    /* Prescaler    -> 1            */
    CCPR2L  = 0x0C; /* Duty         -> 50% (0x32)   */
                    /* CCPR2L:1100b                 */
                    /* CCP2CON(bit5~4):10b->110010b */
    CCP2CON = PWM_STOP; /* PWM      -> OFF          */
                        /* 2LSB of duty cycle->10b  */

    /* 受信データ解析用 TIMER1 設定                 */
    T1CON   = 0x01; /* Prescaler      -> 1:1 (65ms) */
                    /* Clock Source   -> Internal   */
                    /* Timer1        -> Start       */
    TMR1L   = 0;    /* Timer1 Value MSB 8bit Clear  */
    TMR1H   = 0;    /* Timer1 Value LSB 8bit Clear  */
    TMR1IF  = 0;    /* Timer1 Interrupt Flag Clear  */
    TMR1IE  = 1;    /* Timer1 Interrupt Enable      */

    /* Port 初期化 */
    PORTA   = 0x00; /* PortA RA7~0:Lo               */
    PORTB   = 0x00; /* PortB RB7~1:Lo    RB0:Hi     */    /* masa */
	//PORTB   = 0x01; /* PortB RB7~1:Lo    RB0:Hi     */
    PORTC   = 0x01; /* PortC RC7~1:Lo    RC0:Hi     */

    /****************************************************************/
    /* Dip SW が両方 Hi ⇒ 送信モード                               */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_1) {
        /* Function Type Init (Function 1 で初期化) */
        func_key_type = KEY_CODE01;
        /* Function1 LED On */
        led_control(LED_MASK);

        for (;;)
        {
            /* Key Check */
            key_code = key_input_check();

            /* Key 押下なし -> CPU Sleep    */
            if (key_code == KEY_OFF) {
                /* CPU Sleep -> Wake Up     */
                cpu_sleep();
            }
            /* Key 押下あり -> 何れかの動作 */
            else {
                /* Function Key 押下された  */
                if (key_code <= KEY_CODE04) {
                    /* Function Type 保持   */
                    func_key_type = key_code;
                    /* 対応した LED On      */
                    led_control((LED_MASK << key_code));
                }
                /* 動作キーが押下された     */
                else {
                    /* 対応したコードを送信 */
                    ir_out_start(func_key_type, key_code);
                }
            }
        }
    }

    /****************************************************************/
    /* Dip SW 1:Lo  Dip SW 2:Hi ⇒ 受信モード (EEPROMへの保存)      */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_2) {
        /* Function LED All Off */
        led_control(ALL_ON);

        for (;;) {
            /* Key Check */
            key_code = key_input_check();
            /* Function Key が押されたら受信モードへ    */
            if (key_code <= KEY_CODE04) {
                /* Function Key Code 保持               */
                func_key_type = key_code;
                /* Key に対応した LED 点灯              */
                led_control((LED_MASK << key_code));
                break;
            } else {
                /* Key 押下されるまでチェックを続ける   */
                ;
            }
        }

        /* 何か受信するまでIRチェック */
        for (;;) {
            /* 赤外線コード受信                         */
            ir_state = ir_recieve();
            /* 受信成功 (NEC/家電協フォーマット)        */
            if (ir_state == SUCCESS) {
                /* LED制御 & データ保存処理へ遷移       */
                break;
            }
            /* 不明のフォーマットを受信                 */
            else if (ir_state == UNKNOWN) {
                for (;;) {
                    /* 電源OFFまで 150ms 間隔で全LED点滅    */
                    led_control(ALL_OFF);
                    __delay_ms(150);
                    led_control(ALL_ON);
                    __delay_ms(150);
                }
            }
            /* 何らかのノイズを受信                     */
            else {
                /* もう一度受信処理                     */
                ;
            }
        }

        /* 受信完了状態通知 */
        for (i=0; i<2; i++) {
            /* 選択した Key に対応した LED 点滅 (2回)   */
            /* 150ms 間隔で点滅                         */
            led_control(ALL_OFF);
            __delay_ms(150);
            led_control((LED_MASK << func_key_type));
            __delay_ms(150);
        }
        /* IR format 一時保持       */
        eep_wdata.format = rx_format;
        /* 受信データ一時保持       */
        memcpy(&eep_wdata.data, &rcv_data, sizeof(rcv_data));
        /* EEPROM 書込み先取得      */
        eep_offset = (key_code * EEPROM_DATA_SIZE);
        /* FormatをEEPROMへ書込み   */
        EEPROM_WRITE(eep_offset, eep_wdata.format);
        /* 書込んだ分オフセット移動 */
        eep_offset++;
        /* DataCodeをEEPROMへ書込み */
        for (i=0; i < TBL_CODE_SIZE; i++) {
            /* HI-TECH C 標準関数   */
            /* 1byte ずつ書込み     */
            EEPROM_WRITE((eep_offset + i), eep_wdata.data[i]);
        }
        /* IR Data 記録後無限ループ */
        for (;;);
    }

    /****************************************************************/
    /* Dip SW 1:Hi  Dip SW 2:Lo ⇒ 学習モード (EEPROM Data 送信)    */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_3) {
        /* EEPROM Data を RAM へ展開 */
        for (i = 0; i < EEPROM_TABLE_SIZE; i++) {
            eep_rdata[i] = EEPROM_READ(i);
        }

        for (;;)
        {
            /* Key Check */
            key_code = key_input_check();

            /* KEYが押されてなかったらSleepにする   */
            if (key_code == KEY_OFF) {
                /* CPU Sleep -> Key INT -> Wake Up  */
                cpu_sleep();
            }
            else {
                /* Function Key (4つ) のみ対応      */
                if (key_code <= KEY_CODE04) {
                    /* Key に対応したRAM読込先取得  */
                    eep_offset = (key_code * EEPROM_DATA_SIZE);
                    /* Data存在する場合のみ送信     */
                    if ((eep_rdata[eep_offset] == FORM_NEC) ||
                        (eep_rdata[eep_offset] == FORM_KDN)) {
                        /* 送信中 -> 対応したLED On */
                        led_control((LED_MASK << key_code));
                        /* フォーマット -> NEC      */
                        if (eep_rdata[eep_offset] == FORM_NEC) {
                            /* Keyに対応したDataを  */
                            /* NEC formatで送信     */
                            /* 読込んだ分オフセット移動 */
                            eep_offset++;
                            IR_NEC_format((unsigned char*)&eep_rdata[eep_offset]);
                        }
                        /* フォーマット -> 家電協   */
                        else {
                            /* Keyに対応したDataを  */
                            /* 家電協 formatで送信  */
                            /* 読込んだ分オフセット移動 */
                            eep_offset++;
                            IR_KDN_format((unsigned char*)&eep_rdata[eep_offset]);
                        }
                        /* 送信終了 -> LED Off      */
                        led_control(ALL_OFF);
                    }
                }
            }
        }
    }
    /****************************************************************/
    /* Dip SW 1:Lo  Dip SW 2:Lo ⇒ LCD表示モード                   */
	/* このモードがmainの役目を果たす                              */
    /****************************************************************/
    if ((PORTA & MODE_MASK) == RUN_MODE_4) {
        /* LCD Initialize       */
        lcd_init();
        /* IR 比較データ初期化  */
        memset(&pre_data, 0x00, sizeof(pre_data));
        for (;;)
        {
            /* IR受信 */
            ir_state = ir_recieve();

        	
        	/*以下がmotion controlを制御するpart  masa */
        	switch(rcv_data[5]){
        	case FORWARD:
        		motion_control(MOVE_FORWARD);
        		break;
        	case BACKWARD:
        		motion_control(MOVE_BACKWARD);
        		break;
        	case STOP:
        		motion_control(MOVE_STOP);
        		break;
        	case LEFT:
        		motion_control(MOVE_LEFT);
        		break;
        	case RIGHT:
        		motion_control(MOVE_RIGHT);
        		break;
        	}
        	/* ここまで   masa  */
        	
        	
        	/* 受信データと比較データが異なる場合のみ表示を更新         */
//            if ((memcmp(&pre_data, &rcv_data, sizeof(rcv_data))) != 0) {    /* comment out 開放 masa  */
            if ((memcmp(&pre_data, &rcv_data, sizeof(rcv_data))) != 0) {
                if (ir_state == SUCCESS) {
                    lcd_clear();                    /* LCD All Clear        */
                    lcd_put_ir_format(rx_format);   /* IR format Type 表示  */
                    switch (rx_format) {
                      case FORM_NEC:        /* 受信コード = NEC format      */
                        /* NEC format の IR 受信データ表示                  */
                        lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_NEC);
                        break;
                      case FORM_KDN:        /* 受信コード = 家電協 format   */
                        /* 家電協 format の IR 受信データ表示               */
                        lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_KDN);
                        break;
                      default:              /* 受信コード = 未対応 format   */
                        break;
                    }
                } else if (ir_state == UNKNOWN) {
                    /* 未対応 format の IR 受信データ表示               */
                    lcd_clear();                    /* LCD All Clear        */
                    lcd_put_ir_format(FORM_UKN);   /* IR format Type 表示  */
//                    lcd_put_ir_data(&rcv_data, FORMAT_DISP_SIZE_UKN);
                } else {
                    ;   /* ノイズの為、もう一度受信処理 */
                }
                /* IR 比較データ保持 */
                memcpy(&pre_data, &rcv_data, sizeof(rcv_data));
            }
        }
    }
}