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);
    }
}
Exemple #2
0
// 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");	
}	
Exemple #3
0
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);

}