// midifs.c // Typ: C-Sourcerfile // Project: MIDI Footswitch // Date: 17.06.2014 // Author: ska #define F_CPU 8000000UL #include #include #include #include "midifs.h" #include "usart.h" volatile unsigned char status_channel, status, channel, data1, data2; volatile unsigned int iBtn1_counter = 0, iBtn2_counter = 0, iBtn3_counter = 0, iBtn4_counter = 0, iSw1_counter = 0, iSw2_counter = 0; volatile unsigned char cBtn1 = 0, cBtn2 = 0, cBtn3 = 0, cBtn4 = 0, cSw1 = 0, cSw2 = 0; volatile unsigned char cChannel = 0, cBank = 0; cTuner = 0; unsigned int cnt = 0; int main (void) { DDRB = 0x00; // PB1..7 as inputs PORTB = 0xFF; // interlan pull-ups for PB0..7y DDRD = 0x30; // PD4..5 as outputs PORTD = 0x0C; // internal pull-ups for PD2..3 OUT_LED = 0x30; // LEDs off // Timer1 init TCCR1A |= (1 << WGM01); // set timer 0 to CTC-Mode TCCR1B &= ~(1 << CS10); // prescaler 8 (1MHz) TCCR1B |= (1 << CS11); TCCR1B &= ~(1 << CS12); OCR1A = 499; // period of 1 ms cli(); // disable interrupts TIMSK |= (1 << TOIE1); // activate timer 1 sei(); // enable interrupts //USART_Init(38400); // initialize USART with 38400 baud (debug) USART_Init(31250); // initialize USART with 31250 baud while (1) { if (iBtn1_counter > BTN_THRESHOLD && cBtn1 == 0) // Button 1 { Bank(cBank); USART_Transmit(0xC0); // Channel 1 USART_Transmit(0x00); cChannel = 0; cTuner = 0; cBtn1 = 1; } else if (iBtn1_counter < BTN_THRESHOLD && cBtn1 == 1) cBtn1 = 0; if(iBtn2_counter > BTN_THRESHOLD && cBtn2 == 0) // Button 2 { Bank(cBank); USART_Transmit(0xC0); // Channel 2 USART_Transmit(0x01); cChannel = 1; cTuner = 0; cBtn2 = 1; } else if (iBtn2_counter < BTN_THRESHOLD && cBtn2 == 1) cBtn2 = 0; if(iBtn3_counter > BTN_THRESHOLD && cBtn3 == 0) // Button 3 { Bank(cBank); USART_Transmit(0xC0); // Channel 3 USART_Transmit(0x02); cChannel = 2; cTuner = 0; cBtn3 = 1; } else if (iBtn3_counter < BTN_THRESHOLD && cBtn3 == 1) cBtn3 = 0; if(iBtn4_counter > BTN_THRESHOLD && cBtn4 == 0) // Button 4 { USART_Transmit(0xB0); // Tuner on USART_Transmit(0x0F); USART_Transmit(0x7F); //OUT_LED |= (1 << LED_RT); // LEDs off //OUT_LED |= (1 << LED_GN); cTuner = 1; cBtn4 = 1; } else if (iBtn4_counter < BTN_THRESHOLD && cBtn4 == 1) cBtn4 = 0; if (iSw1_counter > BTN_THRESHOLD && cSw1 == 0) // Switch Pos. 1 { Bank(0); cBank = 0; cTuner = 0; cSw1 = 1; } else if (iSw1_counter < BTN_THRESHOLD && cSw1 == 1) { cSw1 = 0; } if(iSw2_counter > BTN_THRESHOLD && cSw2 == 0) // Switch Pos. 2 { Bank(1); cBank = 1; cTuner = 0; cSw2 = 1; } else if (iSw2_counter < BTN_THRESHOLD && cSw2 == 1) { cSw2 = 0; } } } void Bank(unsigned char num) { if(num == 0) { USART_Transmit(0xB0); // Bank 1 USART_Transmit(0x00); USART_Transmit(0x00); USART_Transmit(0xC0); USART_Transmit(0x00); USART_Transmit(cChannel); OUT_LED &= ~(1 << LED_RT); // LED green OUT_LED |= (1 << LED_GN); } else { USART_Transmit(0xB0); // Bank 2 USART_Transmit(0x00); USART_Transmit(0x01); USART_Transmit(0xC0); USART_Transmit(0x00); USART_Transmit(cChannel); OUT_LED &= ~(1 << LED_GN); // LED green OUT_LED |= (1 << LED_RT); } } /* interrupt function: TIMER1_OVF1_vect * * Timer interrupt. Increments counters for inputs */ ISR(TIMER1_OVF_vect) { if(++cnt == 250) cnt = 0; if(cTuner == 1 && cnt == 1) { if(cBank == 1) OUT_LED ^= (1< 0) iBtn1_counter--; } if (bit_is_clear(IN_BTN, BTN2)) { // Button 2 if (iBtn2_counter < BTN_MAX) iBtn2_counter++; } else { if (iBtn2_counter > 0) iBtn2_counter--; } if (bit_is_clear(IN_BTN, BTN3)) { // Button 3 if (iBtn3_counter < BTN_MAX) iBtn3_counter++; } else { if (iBtn3_counter > 0) iBtn3_counter--; } if (bit_is_clear(IN_BTN, BTN4)) { // Button 4 if (iBtn4_counter < BTN_MAX) iBtn4_counter++; } else { if (iBtn4_counter > 0) iBtn4_counter--; } if (bit_is_clear(IN_SW, SW1)) { // Switch 1 if (iSw1_counter < BTN_MAX) iSw1_counter++; } else { if (iSw1_counter > 0) iSw1_counter--; } if (bit_is_clear(IN_SW, SW2)) { // Switch 2 if (iSw2_counter < BTN_MAX) iSw2_counter++; } else { if (iSw2_counter > 0) iSw2_counter--; } }