Exemplo n.º 1
0
/**
 * Read the sampleas, write them to {link}samples.
 */
void read_samples() 
{

	// don't smaple slider, value is set by interrupt handler ...
	// samples.slider.value = 0;

	int s;

	if(enable_sound) {

		s = pin_pulselength_read_dhf(SOUND);

		while(s > 1023) s = s / 2;

		samples.sound.value = s;  
	}

	samples.light.value  = (pin_digital_read(LIGHT) ? 0xFFFF : 0);
	samples.button.value = (pin_digital_read(BUTTON) ? 0xFFFF : 0);
 
	samples.resa.value   = pin_analog_read(RESA); 
	samples.resb.value   = pin_analog_read(RESB);  
	samples.resc.value   = pin_analog_read(RESC);  
	samples.resd.value   = pin_analog_read(RESD); 
}
Exemplo n.º 2
0
int pin_pulselength_read(unsigned char pin)
{
	unsigned char pf = pin_function(pin);
 
	if(pf != PIN_FUNCTION_INPUT_FLOAT && pf != PIN_FUNCTION_INPUT_PULLUP && 
	   pf != PIN_FUNCTION_INPUT_PULLDOWN) { 
		return PIN_STAT_ERR_UNSUPFUNC;
	}

	int to = 32767;
	int t  = 0;

	// 1. check current state s of pin
	int s  = pin_digital_read(pin); 
	
	// 2. wait until pin toggeles to ~s
    int ds = s;

    if(s < 0) return s;

   	while(ds == s) {
		ds = pin_digital_read(pin);

    	if(ds < 0) return ds;

		// if max-t is reached, return (timeout)
		if(t++ == to) return to;
	}

	// 3. wait until pin toggles back to s, measure time 
	t = 0;

   	while(ds != s) {
		ds = pin_digital_read(pin);

    	if(ds < 0) return ds;

		// if max-t is reached, return (timeout)
		if(t++ == to) return to;
	}

	return t;
}
Exemplo n.º 3
0
/**
 * Setup the ports.
 */
void setup() 
{
	// COMM led
	pin_setup(COMM, PIN_FUNCTION_OUTPUT);
	
	// READY led
	pin_setup(READY, PIN_FUNCTION_OUTPUT);

	// BUTTON 
	pin_setup(BUTTON, PIN_FUNCTION_INPUT_PULLUP);

	// RESA 
	pin_setup(RESA, PIN_FUNCTION_ANALOG_IN);
	
	// RESB 
	pin_setup(RESB, PIN_FUNCTION_ANALOG_IN);

	// RESC 
	pin_setup(RESC, PIN_FUNCTION_ANALOG_IN);

	// RESC 
	pin_setup(RESD, PIN_FUNCTION_ANALOG_IN);
		
	// SLIDER-UP 
	pin_setup(SLIDER_UP, PIN_FUNCTION_INPUT_PULLUP);
	pin_exti_function(SLIDER_UP, PIN_FUNCTION_EXTI_HIGHLOW, 0); 

	// SLIDER-DOWN
	pin_setup(SLIDER_DWN, PIN_FUNCTION_INPUT_PULLUP);
	pin_exti_function(SLIDER_DWN, PIN_FUNCTION_EXTI_HIGHLOW, 0); 
	
	// 1st check if sensors are available (not av. when high)
	pin_setup(SOUND, PIN_FUNCTION_INPUT_PULLDOWN);

	enable_sound = (pin_digital_read(SOUND) ? 0 : 1);

	if(enable_sound) {
		// SOUND 
		pin_setup(SOUND, PIN_FUNCTION_INPUT_FLOAT);
	}	
		
	pin_setup(LIGHT, PIN_FUNCTION_INPUT_PULLDOWN);
	
	// show that mcu is ready
	pin_set(READY);
}
Exemplo n.º 4
0
int main(void)
{
	clock_init();

	pin_reserve(PIN_1_1);
	pin_reserve(PIN_1_2);

	serial_init(9600);

	cio_print("** ROCKETuC - librocketcore PIN test **\n\r");

	dump_regs("initial");

	// invalid port
	if(pin_setup(0x30, PIN_FUNCTION_OUTPUT) == PIN_STAT_ERR_INVALPORT) {
		cio_print("0x30 is an invalid port\n\r");
	}
	
	// invalid pin
	if(pin_setup(0x2A, PIN_FUNCTION_OUTPUT) == PIN_STAT_ERR_INVALPIN) {
		cio_print("0x2A is an invalid pin\n\r");
	}

	// P1.1 + P1.2 are reserved for UART1
	if(pin_setup(PIN_1_1, PIN_FUNCTION_OUTPUT) == PIN_STAT_ERR_INVALPIN) {
		cio_print("0x11 is an invalid (reserved) pin\n\r");
	}
	if(pin_setup(PIN_1_2, PIN_FUNCTION_OUTPUT) == PIN_STAT_ERR_INVALPIN) {
		cio_print("0x12 is an invalid (reserved) pin\n\r");
	}

	// pins on port 2 do not support ADC
	int p;

	for(p = 0; p < 8; p++) { 
		if(pin_setup(PIN_2_0 + p, PIN_FUNCTION_ANALOG_IN) == PIN_STAT_ERR_UNSUPFUNC) {
			cio_printf("0x2%i does not support ADC\n\r", p);
		}
	}
	
	// set P1.0 + P1.6 + P2.5 to output (the build in LEDs)
	pin_setup(PIN_1_0, PIN_FUNCTION_OUTPUT);
	pin_setup(PIN_1_6, PIN_FUNCTION_OUTPUT);
	pin_setup(PIN_2_5, PIN_FUNCTION_OUTPUT);

	
	dump_regs("p1.0+p1.6+p2.5 output");

	// set P1.0 + P1.6 + P2.5 to HIGH
	pin_set(PIN_1_0);
	pin_set(PIN_1_6);
	pin_set(PIN_2_5);

	dump_regs("p1.0+p1.6+p2.5 set");

	// read P1.0 + P1.6 + p2.5 states
	cio_printf("P1.0 is %x\n\r", pin_digital_read(PIN_1_0));	
	cio_printf("P1.6 is %x\n\r", pin_digital_read(PIN_1_6));	
	cio_printf("P2.5 is %x\n\r", pin_digital_read(PIN_2_5));	
	
	// clear P1.0 + p1.6 + p2.5 to LOW 
	pin_clear(PIN_1_0);
	pin_clear(PIN_1_6);
	pin_clear(PIN_2_5);

	dump_regs("p1.0+p1.6+p2.5 clear");

	// read P1.0 + P1.6 + 2.5 states
	cio_printf("P1.0 is %x\n\r", pin_digital_read(PIN_1_0));	
	cio_printf("P1.6 is %x\n\r", pin_digital_read(PIN_1_6));	
	cio_printf("P2.5 is %x\n\r", pin_digital_read(PIN_2_5));	

	// toggle P1.0 + P1.6 + P2.5
	pin_toggle(PIN_1_0);
	pin_toggle(PIN_1_6);
	pin_toggle(PIN_2_5);

	dump_regs("p1.0+p1.6+p2.5 toggle");

	// read P1.0 + P1.6 states
	cio_printf("P1.0 is %x\n\r", pin_digital_read(PIN_1_0));	
	cio_printf("P1.6 is %x\n\r", pin_digital_read(PIN_1_6));	
	cio_printf("P2.5 is %x\n\r", pin_digital_read(PIN_2_5));	

	// toggle P1.0 + P1.6 + P2.5
	pin_toggle(PIN_1_0);
	pin_toggle(PIN_1_6);
	pin_toggle(PIN_2_5);

	dump_regs("p1.0+p1.6+p2.5 toggle");

	// read P1.0 + P1.6 states
	cio_printf("P1.0 is %x\n\r", pin_digital_read(PIN_1_0));	
	cio_printf("P1.6 is %x\n\r", pin_digital_read(PIN_1_6));	
	cio_printf("P2.5 is %x\n\r", pin_digital_read(PIN_2_5));	

	// set P1.3 to input float
	pin_setup(PIN_1_3, PIN_FUNCTION_INPUT_FLOAT);

	dump_regs("p1.3 input float");

	cio_print("Press button on P1.3 to continue ...");

	while(pin_digital_read(PIN_1_3)) __asm__("nop");

	cio_print(" OK\n\r");
	
	// set P2.3 to input pull-down 
	pin_setup(PIN_2_3, PIN_FUNCTION_INPUT_PULLDOWN);

	dump_regs("p2.3 input pull-down");

	cio_print("Press button on P2.3 to continue ...");

	while(!pin_digital_read(PIN_2_3)) __asm__("nop");

	cio_print(" OK\n\r");
	
	// set P2.4 to input pull-down 
	pin_setup(PIN_2_4, PIN_FUNCTION_INPUT_PULLUP);

	dump_regs("p2.4 input pull-up");

	cio_print("Press button on P2.4 to continue ...");

	while(pin_digital_read(PIN_2_4)) __asm__("nop");

	cio_print(" OK\n\r");

	int pl = 0;

	cio_print("Press button on P1.3 for pulselength read ...");

	delay(50000);

	pl = pin_pulselength_read(PIN_1_3);

	cio_printf(" OK, pl=%i\n\r", pl);

	cio_print("Press button on P2.3 for pulselength read ...");

	delay(50000);

	pl = pin_pulselength_read(PIN_2_3);

	cio_printf(" OK, pl=%i\n\r", pl);

	cio_print("Press button on P2.4 for pulselength read ...");

	delay(50000);

	pl = pin_pulselength_read(PIN_2_4);

	cio_printf(" OK, pl=%i\n\r", pl);
	
	pin_set(PIN_1_0);
	pin_clear(PIN_1_6);
	pin_clear(PIN_2_5);

	// set P1.5 to analog in
	int i = 0;

	cio_printf("setup 1.5 for analog in: %i\n\r", pin_setup(PIN_1_5, PIN_FUNCTION_ANALOG_IN));
	dump_regs("p1.5 analog in");
	
	int adcin1 = pin_analog_read(PIN_1_5); 
	int adcin2 = 0; 
	cio_printf("Analog read p1.5: %x\n\r", adcin1);

	// set P2.2 to PWM with period of 20ms and duty cycle of 7.5%
	cio_printf("setup 2.2 for PWM: %i\n\r", pin_setup(PIN_2_2, PIN_FUNCTION_PWM));
	dump_regs("p2.2 PWM");

	// only one of the two possible pins on port two are allowed to be set to PWM
	cio_printf("setup 2.1 for PWM: %i\n\r", pin_setup(PIN_2_1, PIN_FUNCTION_PWM));

	// period 
	pin_pwm_function(PIN_2_2, 20000);
	pin_pwm_control(PIN_2_2, adc2dc(adcin1));

	while (1) {
		delay();

		pin_toggle(PIN_1_0);
		pin_toggle(PIN_1_6);

		if(i++ % 2 == 0) {
			pin_toggle(PIN_2_5);
		}

		if(!pin_digital_read(PIN_1_3)) {
			pin_toggle(PIN_1_6);
			while(!pin_digital_read(PIN_1_3)) __asm__("nop");
		}

		adcin2 = pin_analog_read(PIN_1_5); 

		// only output ADC value if delta was more then 5
		if(adcin2 - adcin1 > 5 || adcin1 - adcin2 > 5) {
			adcin1 = adcin2;
			cio_printf("Analog read at p1.5: %x (%i)\n\r", adcin2, adcin2);
			pin_pwm_control(PIN_2_2, adc2dc(adcin1));
		}
	}

	return 0;
}
Exemplo n.º 5
0
int handle_packet_pin_control(unsigned char length, unsigned char *data)
{
	int s = PACKET_STAT_OK;

	// check if length matches for packet-data
	if(length != 2) {
		send_status_packet(PACKET_RETURN_INAVLID_DATA);
		return PACKET_STAT_ERR_DATA;
	}

	packet_data_in_pin_control *pd = (packet_data_in_pin_control *)&data[0];

	switch(pd->control) {
		case PIN_CONTROL_CLEAR:
			if((s = pin_clear(pd->pin)) != PACKET_STAT_OK) {
				send_status_packet(PACKET_RETURN_INVALID_PIN_COMMAND);
			}
			else {
				send_status_packet(PACKET_RETURN_ACK);
			}
			break;
		case PIN_CONTROL_SET:
			if((s = pin_set(pd->pin)) != PACKET_STAT_OK) {
				send_status_packet(PACKET_RETURN_INVALID_PIN_COMMAND);
			}
			else {
				send_status_packet(PACKET_RETURN_ACK);
			}
			break;
		case PIN_CONTROL_TOGGLE:
			if((s = pin_toggle(pd->pin)) != PACKET_STAT_OK) {
				send_status_packet(PACKET_RETURN_INVALID_PIN_COMMAND);
			}
			else {
				send_status_packet(PACKET_RETURN_ACK);
			}
			break;
		case PIN_CONTROL_DIGITAL_READ:
			if((s = pin_digital_read(pd->pin)) < 0) {
				send_status_packet(PACKET_RETURN_INVALID_PIN_COMMAND);
			}
			else {
				packet_data_out_digital_pin_read *pdo = (packet_data_out_digital_pin_read *)&outp.data[0];

				outp.start	= PACKET_OUTBOUND_START;
				outp.length	= 6;
				outp.type 	= PACKET_OUT_DIGITAL_PIN_READ;
	
				pdo->pin   = pd->pin;
				pdo->state = s;

				outp.crc = packet_calc_crc(&outp);

				packet_send(&outp);
			}
			break;
		case PIN_CONTROL_ANALOG_READ:
			if((s = pin_analog_read(pd->pin)) < 0) {
				send_status_packet(PACKET_RETURN_INVALID_PIN_COMMAND);
			}
			else {
				packet_data_out_analog_pin_read *pdo = (packet_data_out_analog_pin_read *)&outp.data[0];

				outp.start	= PACKET_OUTBOUND_START;
				outp.length	= 7;
				outp.type 	= PACKET_OUT_ANALOG_PIN_READ;
	
				pdo->pin       = pd->pin;
				pdo->value_lsb = (0x00FF & s);
				pdo->value_msb = (0x0F00 & s) >> 8;

				outp.crc = packet_calc_crc(&outp);

				packet_send(&outp);
			}
			break;
		case PIN_CONTROL_PULSELENGTH_READ:
			if((s = pin_pulselength_read(pd->pin)) < 0) {
				send_status_packet(PACKET_RETURN_INVALID_PIN_COMMAND);
			}
			else {
				packet_data_out_pulselength_read *pdo = 
							( packet_data_out_pulselength_read *)&outp.data[0];

				outp.start	= PACKET_OUTBOUND_START;
				outp.length	= 7;
				outp.type 	= PACKET_OUT_PULSELENGHT_READ;
	
				pdo->pin   = pd->pin;
				pdo->value_lsb = (0x00FF & s);
				pdo->value_msb = (0x7F00 & s) >> 8;

				outp.crc = packet_calc_crc(&outp);

				packet_send(&outp);
			}
			break;
		default:
			send_status_packet(PACKET_RETURN_INVALID_PIN_COMMAND);
			s = PACKET_STAT_ERR_DATA;
	}

	return s;
}