int main (void) { struct eeprom_boot_data eedata; DDRB = 0; DDRC = 0; DDRD = 0; PORTB = 0xFF; PORTC = 0xFF; PORTD = 0xFF; DDRB |= _BV(2) | _BV(4) | _BV(5); seed_pseudorandom(); load_eeprom_data(&eedata); init_eeprom_data(&eedata); save_eeprom_data(&eedata); if (memcmp_PP(bootloader_data, (void *)__bootloader_start, bootloader_data_len)) { DDRB |= _BV(PB5); for (int pageaddr = 0; pageaddr < bootloader_data_len; pageaddr += SPM_PAGESIZE) { PORTB ^= _BV(PB5); memcpy_P(flashdata, bootloader_data + pageaddr, SPM_PAGESIZE); flash_write_page((void *)__bootloader_start + pageaddr, flashdata); } } while (1) { PORTB ^= _BV(PB5); _delay_ms(500); } }
// Initializes UFO, determines pipe size K factor & Units void uf_init(void) { byte i,size,fs,sregl,sregh; double smarktime; uint16 sregs; asm("clrwdt"); size = read_sw(); //Get switch setting Size_ind = size >> 5; //3 bit pipe dia index #ifdef _TEN Size_ind = 8; #endif K = load_eeprom_data(K_ADD); if(K <.5) // First time? { K = K_init[Size_ind]; //K for this pipe size,Gal/min if(size & 0x01) K *= 3.785; //Asking for liters/gal write_eeprom_data(K_ADD, K); } fs = (size & 0x08) ? HI :LO; //FS selection if(size & 0x01) FS = Fs_L[Size_ind][fs]; //Set FS Gal value to use. else FS = Fs_G[Size_ind][fs]; #ifdef _lowFS if(!fs) FS = _lowFS; else FS = _highFS; #endif //Set response time and bad measurement limit to use. Resp = (size & 0x10) ? FAST : SLOW; Bad_limit = (size & 0x10) ? BAD_LIMIT_FAST : BAD_LIMIT_SLOW; Pt = Ptrig[Size_ind]; TRISC = TRISC_OUT; //Enable data lines for output PWRDWN = OFF; //Allow UFO to power up delay(5); uset_reg(REG0,RESET_UFO); //Reset all uset_reg(REG0,UNSET_UFO); for(i = 0;i < MAXADD; i++) //Non size dependent registers only uset_reg(Uf_init[i][0], Uf_init[i][1]); //Traverse array of addresses and data TCur = Tt[Size_ind]; //Start with nominal Tt smarktime = .75*Tt[Size_ind]; Enable_delay = (byte)(smarktime/8); //6 us/timing loop sregs = (uint16)(smarktime*CLK_FREQ - 2); //SMARK value sregl = (byte)(sregs & 0x00FF); sregh = (byte)(sregs >> 8); uset_reg(REG7,sregl); //Set SMARKL uset_reg(REG8,sregh); //Set SMARKH sregs = (uint16)(1.25*CLK_FREQ*Tt[Size_ind] - 2); //SSPACE value sregl = (byte)(sregs & 0x00FF); sregh = (byte)(sregs >> 8); uset_reg(REG9,sregl); //Set SSPACEL uset_reg(REG10,sregh); //Set SSPACEH asm("clrwdt"); }
void init() { load_eeprom_data(); init_outputs(); LCDinit();//init LCD bit, dual line, cursor right LCDclr();//clears LCD init_adc(); uart0_init(UART_BAUD_SELECT(115200UL, F_CPU)); if(target.oxygen > 40000){ target.oxygen = 40000; } while(ANY_BUTTON_PRESSED){;} _delay_ms(150); sei(); set_current_working_mode(MODE_CALIBRATE); set_countdown_timer(15); }