197 lines
4.4 KiB
C
197 lines
4.4 KiB
C
// midifs.c
|
|
// Typ: C-Sourcerfile
|
|
// Project: MIDI Footswitch
|
|
// Date: 17.06.2014
|
|
// Author: ska
|
|
|
|
#define F_CPU 8000000UL
|
|
|
|
#include <avr/io.h>
|
|
#include <util/delay.h>
|
|
#include <avr/interrupt.h>
|
|
#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<<LED_GN);
|
|
else OUT_LED ^= (1<<LED_RT);
|
|
}
|
|
|
|
if (bit_is_clear(IN_BTN, BTN1)) { // Button 1
|
|
if (iBtn1_counter < BTN_MAX) iBtn1_counter++;
|
|
} else {
|
|
if (iBtn1_counter > 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--;
|
|
}
|
|
}
|
|
|