// 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); }
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); }
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); }
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 } } }
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); }
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++; } }
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; }
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; }
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); }
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; }
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; }
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; }
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; }
/*============================================================================== 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 }
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; }
/****************************************************************************************** * 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; }
//----------------------------------------------- void eeprom_write(unsigned char addr, unsigned char value) { EEPROM_WRITE(addr,value); }
/** * 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)"); }
/*============================================================================== * 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)); } } } }