commit 3a92b9a242ffd43047d2da3e6fc21ccdb8d60bc3 Author: Stefan Kalscheuer Date: Sat Sep 8 12:04:46 2018 +0200 Initial Git import from existing sources diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eea6c54 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*~ +.idea +firmware/*.o +firmware/*.elf +firmware/*.hex +hardware/*.b#* +hardware/*.s#* \ No newline at end of file diff --git a/firmware/Makefile b/firmware/Makefile new file mode 100755 index 0000000..8c327d8 --- /dev/null +++ b/firmware/Makefile @@ -0,0 +1,16 @@ +CC=avr-gcc +CFLAGS=-g -Os -Wall -mcall-prologues -mmcu=attiny2313 +OBJ2HEX=avr-objcopy +AVRDUDE=avrdude +TARGET=midifs + +program : $(TARGET).hex + $(AVRDUDE) -p t2313 -c stk500v2 -P /dev/ttyS0 -U $(TARGET).hex +%.obj : %.o + $(CC) $(CFLAGS) $< -o $@ + +%.hex : %.obj + $(OBJ2HEX) -R .eeprom -O ihex $< $@ + +clean : + rm -f *.hex *.obj *.o diff --git a/firmware/midifs.c b/firmware/midifs.c new file mode 100644 index 0000000..44da299 --- /dev/null +++ b/firmware/midifs.c @@ -0,0 +1,196 @@ +// 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--; + } +} + diff --git a/firmware/midifs.h b/firmware/midifs.h new file mode 100644 index 0000000..4315956 --- /dev/null +++ b/firmware/midifs.h @@ -0,0 +1,39 @@ +// midi-to-parport.h +// Typ: C-Headerfile +// Project: MIDI-to-Parallelport interface +// Date: 27.08.2012 +// Author: ska + +#define IN_SW PIND +#define SW1 PD2 +#define SW2 PD3 + +#define IN_BTN PINB +#define BTN1 PB0 +#define BTN2 PB1 +#define BTN3 PB2 +#define BTN4 PB3 + +#define OUT_LED PORTD +#define LED_RT PD5 +#define LED_GN PD4 + +#define BTN_THRESHOLD 50 +#define BTN_MAX 100 + + +void delayms(unsigned int millis) { +// uint16_t loop; + while ( millis ) { + _delay_ms(1); + millis--; + } +} + +void delayus(unsigned long millis) { +// uint16_t loop; + while ( millis ) { + _delay_us(1); + millis--; + } +} diff --git a/firmware/midifs.hex b/firmware/midifs.hex new file mode 100644 index 0000000..d3b06cd --- /dev/null +++ b/firmware/midifs.hex @@ -0,0 +1,84 @@ +:1000000012C01FC01EC01DC01CC07BC01AC019C0BA +:1000100018C017C016C015C014C013C012C011C03C +:1000200010C00FC00EC011241FBECFEDCDBF20E009 +:10003000A0E6B0E001C01D92AD37B207E1F74AD1AA +:1000400070C2DECF009741F0EFECF7E03197F1F7A7 +:1000500000C000000197F6CF089561157105810574 +:10006000910549F022E02A95F1F700C0615071092D +:1000700081099109F2CF08959B01AC0184E0220F20 +:10008000331F441F551F8A95D1F760E072E18AE75C +:1000900090E025D22150310932B929B9539A86E02E +:1000A00083B908955F9BFECF8CB108955D9BFECF11 +:1000B0008CB908955F9B02C08CB1FCCF089581116B +:1000C00010C080EBF3DF80E0F1DF80E0EFDF80EC59 +:1000D000EDDF80E0EBDF80916500E8DF9598949A92 +:1000E000089580EBE3DF80E0E1DF81E0DFDF80EC9B +:1000F000DDDF80E0DBDF80916500D8DF9498959AA2 +:1001000008951F920F920FB60F9211248F939F9311 +:10011000809160009091610001968A3F910529F0DD +:10012000909361008093600004C01092610010926F +:1001300060008091620090916300019781F480914A +:10014000600090916100019751F48091640092B336 +:10015000813011F480E101C080E2892782BBB0992F +:100160000DC0809176009091770084369105A8F4B7 +:10017000809176009091770001960BC08091760077 +:1001800090917700892B49F08091760090917700CB +:1001900001979093770080937600B1990DC080917C +:1001A00074009091750084369105A8F480917400D4 +:1001B0009091750001960BC080917400909175002C +:1001C000892B49F08091740090917500019790936C +:1001D000750080937400B2990DC080917200909167 +:1001E000730084369105A8F4809172009091730099 +:1001F00001960BC08091720090917300892B49F099 +:100200008091720090917300019790937300809396 +:100210007200B3990DC08091700090917100843686 +:100220009105A8F4809170009091710001960BC027 +:100230008091700090917100892B49F0809170003D +:100240009091710001979093710080937000829952 +:100250000DC080916E0090916F0084369105A8F4D6 +:1002600080916E0090916F0001960BC080916E009E +:1002700090916F00892B49F080916E0090916F00F2 +:10028000019790936F0080936E0083990DC08091C9 +:100290006C0090916D0084369105A8F480916C00FB +:1002A00090916D0001960BC080916C0090916D0053 +:1002B000892B49F080916C0090916D00019790938B +:1002C0006D0080936C009F918F910F900FBE0F90E7 +:1002D0001F90189517BA8FEF88BB80E381BB9CE015 +:1002E00092BB82BB8FB582608FBD8EB58E7F8EBD77 +:1002F0008EB582608EBD8EB58B7F8EBD83EF91E013 +:100300009BBD8ABDF89489B7806889BF789462E103 +:100310007AE780E090E0B0DEC1E001E010E080919B +:10032000760090917700C397A8F080916B008111BF +:1003300011C08091640090E0C2DE80ECB7DE80E006 +:10034000B5DE109265001092630010926200C093B7 +:100350006B000CC08091760090917700C29730F4CA +:1003600080916B00813011F410926B0080917400C9 +:1003700090917500C397A8F080916A00811111C017 +:100380008091640090E09BDE80EC90DE81E08EDE68 +:10039000C09365001092630010926200C0936A00DF +:1003A0000CC08091740090917500C29730F48091D8 +:1003B0006A00813011F410926A008091720090916D +:1003C0007300C397B0F080916900811112C08091D1 +:1003D000640090E074DE80EC69DE82E067DE82E03B +:1003E000809365001092630010926200C0936900D0 +:1003F0000CC08091720090917300C29730F480918C +:100400006900813011F41092690080917000909120 +:100410007100C39788F08091680081110DC080EB56 +:1004200045DE8FE043DE8FE741DE109363000093EB +:100430006200C09368000CC08091700090917100C0 +:10044000C29730F480916800813011F410926800F6 +:1004500080916E0090916F00C39780F0809167004B +:1004600081110CC080E090E02ADE109264001092AE +:10047000630010926200C09367000CC080916E0010 +:1004800090916F00C29730F480916700813011F431 +:100490001092670080916C0090916D00C39780F07E +:1004A0008091660081110CC081E090E008DEC0936D +:1004B00064001092630010926200C09366002FCF18 +:1004C00080916C0090916D00C29708F028CF8091C8 +:1004D0006600813009F023CF1092660020CFA1E2A0 +:1004E0001A2EAA1BBB1BFD010DC0AA1FBB1FEE1FAE +:1004F000FF1FA217B307E407F50720F0A21BB30BF9 +:10050000E40BF50B661F771F881F991F1A9469F774 +:1005100060957095809590959B01AC01BD01CF01D0 +:060520000895F894FFCFDE +:00000001FF diff --git a/firmware/usart.h b/firmware/usart.h new file mode 100644 index 0000000..931593b --- /dev/null +++ b/firmware/usart.h @@ -0,0 +1,36 @@ +void USART_Init( unsigned long baud ) +{ + /* Calculate UBRR */ + unsigned int ubrr_val = (unsigned int)((F_CPU/(baud*16L))-1); + /* Set baud rate */ + UBRRH = (unsigned char)(ubrr_val>>8); + UBRRL = (unsigned char)ubrr_val; + /* Enable transmitter */ + UCSRB |= (1<