// // apa.io.c // // APA I/O node // // set lfuse to 0x5E for 20 MHz xtal // // Neil Gershenfeld // CBA MIT 7/3/11 // // (c) Massachusetts Institute of Technology 2011 // Permission granted for experimental and personal use; // license for commercial sale available from MIT. // #include #define PWM_pin (1 << PA5) #define PWM_port PORTA #define PWM_direction DDRA // // process the packet // void apa_process_packet(struct apa_port_type *port) { uint16_t ad, pwm; unsigned char pwml, pwmh, adl, adh; // // execute command // switch (port->payload_out[0]) { case 'u': // // u: PWM up // pwm = OCR1B; pwm += -1; OCR1B = pwm; pwmh = pwm >> 8; pwml = pwm & 255; port->payload_out[0] = pwmh; port->payload_out[1] = pwml; port->payload_out_length = 2; break; case 'd': // // d: PWM down // pwm = OCR1B; pwm += 1; OCR1B = pwm; pwmh = pwm >> 8; pwml = pwm & 255; port->payload_out[0] = pwmh; port->payload_out[1] = pwml; port->payload_out_length = 2; break; case 'n': // // n: PWM on // OCR1B = 0; pwmh = 0; pwml = 0; port->payload_out[0] = pwmh; port->payload_out[1] = pwml; port->payload_out_length = 2; break; case 'f': // // f: PWM off // OCR1B = 1023; pwmh = 3; pwml = 255; port->payload_out[0] = pwmh; port->payload_out[1] = pwml; port->payload_out_length = 2; break; case 'r': // // r: PWM read // pwm = OCR1B; pwmh = pwm >> 8; pwml = pwm & 255; port->payload_out[0] = pwmh; port->payload_out[1] = pwml; port->payload_out_length = 2; break; case 'w': // // w: PWM write // wxxxx writes 16-bit hex value // pwm = apa_hex_int(&port->payload_out[1]); OCR1B = pwm; pwmh = pwm >> 8; pwml = pwm & 255; port->payload_out[0] = pwmh; port->payload_out[1] = pwml; port->payload_out_length = 2; break; case '0': // // 0: read A/D input pin 0 // ADMUX = (1 << REFS1) | (0 << REFS0) | (0 << MUX5) | (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (0 << MUX0); // PA2, Vcc ref ADCSRA |= (1<> 8; adl = ad & 255; port->payload_out[0] = adh; port->payload_out[1] = adl; port->payload_out_length = 2; break; case '2': // // 2: read A/D input pin 2 // ADMUX = (1 << REFS1) | (0 << REFS0) | (0 << MUX5) | (0 << MUX4) | (0 << MUX3) | (0 << MUX2) | (1 << MUX1) | (1 << MUX0); // PA3, Vcc ref ADCSRA |= (1<> 8; adl = ad & 255; port->payload_out[0] = adh; port->payload_out[1] = adl; port->payload_out_length = 2; break; case ' ': // // do nothing // port->path_out_length = 0; port->payload_out_length = 0; default: // // unknown command // port->payload_out[0] = '?'; port->payload_out_length = 1; break; } } // // main // int main(void) { static struct apa_port_type port_0, port_1, port_2; // // set clock divider to /1 // CLKPR = (1 << CLKPCE); CLKPR = (0 << CLKPS3) | (0 << CLKPS2) | (0 << CLKPS1) | (0 << CLKPS0); // // initialize ADC // ADCSRB &= ~(1<