/** * 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); }
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; }
/** * 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); }
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; }
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; }