diff --git a/midi_test.c b/midi_test.c index abfff2ebd52e59db6fee9707ac796c6b555f9470..442c22c39bba03f16a1bf100a165f6e6354b3cf2 100644 --- a/midi_test.c +++ b/midi_test.c @@ -29,6 +29,7 @@ #define pin_test(pins,pin) (pins & pin) // test for port pin #define bit_test(byte,bit) (byte & (1 << bit)) // test for bit set #define bit_delay_time 8.5 // bit delay for 115200 with overhead +//#define bit_delay_time 31.82 // bit delay for 31250 with overhead #define bit_delay() _delay_us(bit_delay_time) // RS232 bit delay #define half_bit_delay() _delay_us(bit_delay_time/2) // RS232 half bit delay #define char_delay() _delay_ms(10) // char delay @@ -40,84 +41,65 @@ #define serial_pin_out (1 << PA1) #define led_pin (1 << PB2) -#define input_pin (1 << PA5) void put_char(volatile unsigned char *port, unsigned char pin, char txchar) { - // - // send character in txchar on port pin - // assumes line driver (inverts bits) - // - // start bit - // - clear(*port,pin); - bit_delay(); - // - // unrolled loop to write data bits - // - if bit_test(txchar,0) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - if bit_test(txchar,1) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - if bit_test(txchar,2) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - if bit_test(txchar,3) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - if bit_test(txchar,4) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - if bit_test(txchar,5) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - if bit_test(txchar,6) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - if bit_test(txchar,7) - set(*port,pin); - else - clear(*port,pin); - bit_delay(); - // - // stop bit - // - set(*port,pin); - bit_delay(); - // - // char delay - // - bit_delay(); - } - -void put_string(volatile unsigned char *port, unsigned char pin, char *str) { - // - // print a null-terminated string - // - static int index; - index = 0; - do { - put_char(port, pin, str[index]); - ++index; - } while (str[index] != 0); - } - -#define input_pin (1 << PA5) + // send character in txchar on port pin + // assumes line driver (inverts bits) + // + // start bit + clear(*port,pin); + bit_delay(); + + // unrolled loop to write data bits + if bit_test(txchar,0) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + if bit_test(txchar,1) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + if bit_test(txchar,2) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + if bit_test(txchar,3) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + if bit_test(txchar,4) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + if bit_test(txchar,5) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + if bit_test(txchar,6) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + if bit_test(txchar,7) + set(*port,pin); + else + clear(*port,pin); + bit_delay(); + + // stop bit + set(*port,pin); + bit_delay(); + + // char delay + bit_delay(); +} + int main(void) { // Set the clock prescaler to 1. @@ -141,7 +123,7 @@ int main(void) { // If it's been 10ms, reset the timer and increment count. if (TCNT0 >= 200) { TCNT0 = 0; - ++count + ++count; // When count reaches 100, turn the LED on and send a note on command. if (count == 100) { @@ -152,9 +134,11 @@ int main(void) { } // When count reaches 200, turn the LED off and send a note off command. - else if (++count == 200) { + else if (count == 200) { PORTB &= ~led_pin; - put_char(&serial_port, serial_pin_out, 144); // note off + put_char(&serial_port, serial_pin_out, 128); // note off + put_char(&serial_port, serial_pin_out, 70); // note (A4) + put_char(&serial_port, serial_pin_out, 100); // velocity count = 0; } }