Exemple #1
0
int main(void) {
	int i;

	init();
	output_speed(0, 50);
	output_speed(1, 50);

	while (1) {
		flash(LED_M0_R);
		flash(LED_M0_B);
		flash(LED_M1_R);
		flash(LED_M1_B);

		output_enable(0);
		output_direction(0, DIR_FWD);
		delay(DELAY*2);
		output_direction(0, DIR_REV);
		delay(DELAY*2);
		output_disable(0);
		delay(DELAY);

		output_enable(1);
		output_direction(1, DIR_FWD);
		delay(DELAY*2);
		output_direction(1, DIR_REV);
		delay(DELAY*2);
		output_disable(1);
		delay(DELAY);
	}

	return 0;
}
void read_lock(uint8_t *lock)
{
	load_command(appc_read_fuse_n_lock_bits);
	output_enable();
	reset_bs2();
	set_byte_high();
	*lock = data_in();
	output_disable();
}
void read_cali(uint8_t *cali)
{
	load_command(appc_read_sig_bytes_n_cali_byte);

	load_address_low_byte(0);
	output_enable();
	set_byte_high();
	*cali = data_in();
	output_disable();
}
uint8_t read_eeprom(uint16_t addr)
{
	uint8_t data;

	load_command(appc_read_eeprom);
	load_address_high_byte(addr >> 8);
	load_address_low_byte(addr & 0xFF);
	output_enable();
	set_byte_low();
	data = data_in();
	output_disable();

	return data;
}
void read_sign(uint8_t *msb, uint8_t *csb, uint8_t *lsb)
{
	load_command(appc_read_sig_bytes_n_cali_byte);
	//load_address_high_byte(0); // TODO

	load_address_low_byte(0);
	output_enable();
	set_byte_low();
	*msb = data_in();
	output_disable();

	load_address_low_byte(1);
	output_enable();
	set_byte_low();
	*csb = data_in();
	output_disable();

	load_address_low_byte(2);
	output_enable();
	set_byte_low();
	*lsb = data_in();
	output_disable();
}
void read_fuse(uint8_t *efuse, uint8_t *hfuse, uint8_t *lfuse)
{
	load_command(appc_read_fuse_n_lock_bits);
	output_enable();
	reset_bs2();
	set_byte_low();
	*lfuse = data_in();
	set_bs2();
	set_byte_high();
	*hfuse = data_in();
	set_bs2();
	set_byte_low();
	*efuse = data_in();
	output_disable();
}
uint16_t read_pgm_mem_word(uint16_t waddr)
{
	uint16_t word;

	load_command(appc_read_flash);
	load_address_high_byte(waddr >> 8);
	load_address_low_byte(waddr & 0xFF);
	output_enable();
	set_byte_low();
	word = data_in();
	set_byte_high();
	word |= data_in() << 8;
	output_disable();

	return word;
}
void pd_power_supply_reset(int port)
{
	int need_discharge = (volt_idx > 0) || discharge_is_enabled();

	output_disable();
	last_volt_idx = volt_idx;
	/* from 20V : do an intermediate step at 12V */
	volt_idx = volt_idx == PDO_IDX_20V ? PDO_IDX_12V : PDO_IDX_5V;
	set_output_voltage(voltages[volt_idx].select);
	/* TODO transition delay */

	/* Stop OCP monitoring to save power */
	adc_disable_watchdog();

	/* discharge voltage to 5V ? */
	if (need_discharge) {
		/* final target : 5V  */
		discharge_volt_idx = PDO_IDX_5V;
		discharge_voltage(voltages[volt_idx].ovp);
	}
}
//
// set pixel at (x, y) to val (1 = on, 0 = off)
//
//	note:  top left is (0, 0) and bottom right is (4, 4).
//
void setpixel(uint8_t x, uint8_t y, uint8_t val)
{
	uint8_t n, b;
	uint8_t hi, lo;
	
	//n = x + 5*y;
	n = x + (y<<2) + y;		// equivalent to "n = x + 5*y" but avoids mult operation (attiny doesn't have MUL!)
	
	b = LEDS[n];			// get hi,lo nibbles from LED lookup table
	hi = UNPACKH(b);
	lo = UNPACKL(b);

	
	// enable/disable the high pin
	switch (hi) {
	case A:
		if (val) {
			output_enable(A_LINE);
			output_high(A_LINE);
		} else {
			output_low(A_LINE);
			output_disable(A_LINE);
		}
		break;
		
	case B:
		if (val) {
			output_enable(B_LINE);
			output_high(B_LINE);
		} else {
			output_low(B_LINE);
			output_disable(B_LINE);
		}
		break;
		
	case C:
		if (val) {
			output_enable(C_LINE);
			output_high(C_LINE);
		} else {
			output_low(C_LINE);
			output_disable(C_LINE);
		}
		break;
		
	case D:
		if (val) {
			output_enable(D_LINE);
			output_high(D_LINE);
		} else {
			output_low(D_LINE);
			output_disable(D_LINE);
		}
		break;
		
	case E:
		if (val) {
			output_enable(E_LINE);
			output_high(E_LINE);
		} else {
			output_low(E_LINE);
			output_disable(E_LINE);
		}
		break;
		
	case F:
		if (val) {
			output_enable(F_LINE);
			//output_high(F_LINE);
			output_low(F_LINE);			// XXX hack for V0.9 board - F_LINE is ALWAYS low
		} else {
			//output_low(F_LINE);
			output_disable(F_LINE);
		}
		break;
		
	}


	// low pin
	switch (lo) {
	case A:
		if (val) {
			output_enable(A_LINE);
			output_low(A_LINE);
		} else {
			output_disable(A_LINE);
		}
		break;
		
	case B:
		if (val) {
			output_enable(B_LINE);
			output_low(B_LINE);
		} else {
			output_disable(B_LINE);
		}
		break;
		
	case C:
		if (val) {
			output_enable(C_LINE);
			output_low(C_LINE);
		} else {
			output_disable(C_LINE);
		}
		break;
		
	case D:
		if (val) {
			output_enable(D_LINE);
			output_low(D_LINE);
		} else {
			output_disable(D_LINE);
		}
		break;
		
	case E:
		if (val) {
			output_enable(E_LINE);
			output_low(E_LINE);
		} else {
			output_disable(E_LINE);
		}
		break;
#ifdef NOTDEF
	// note: this case does not occur!
	case F:
		if (val) {
			output_enable(F_LINE);
			output_low(F_LINE);
		} else {
			output_disable(F_LINE);
		}
		break;
#endif		
	}
}