include // Wir brauchen Zugriff auf die I/O's des Controllers #include // Wir wollen sachen ins eeprom schreiben bzw aus diesem lesen #define F_CPU 8000000UL // 8Mhz //verwendete Funktionen definieren void Konfiguration (void); int8_t Midikonfiguration (void); void Normalbetrieb (void); void EinundAusgaengesetzten (void); void UsartInit (void); void UsartSend(uint8_t); void MidiSendProgramChange(uint8_t, uint8_t); void MidiSendCntrolChange(uint8_t, uint8_t, uint8_t); void MidiBankSelect(uint8_t, uint8_t, uint8_t); void Midisenden(void); //Variablen definieren uint8_t Taster0imEeprom EEMEM; // 8 bit integer Variable Taster0 deklarieren und platz im eeprom reservieren uint8_t Taster0; uint8_t Taster1imEeprom EEMEM; uint8_t Taster1; uint8_t Taster2imEeprom EEMEM; uint8_t Taster2; uint8_t Taster3imEeprom EEMEM; uint8_t Taster3; uint8_t Taster4imEeprom EEMEM; uint8_t Taster4; uint8_t Taster5imEeprom EEMEM; uint8_t Taster5; uint8_t Taster6imEeprom EEMEM; uint8_t Taster6; uint8_t Taster7imEeprom EEMEM; uint8_t Taster7; uint8_t MidiKanalTaster0imEeprom EEMEM; uint8_t MidiKanalTaster0; uint8_t MidiKanalTaster1imEeprom EEMEM; uint8_t MidiKanalTaster1; uint8_t MidiKanalTaster2imEeprom EEMEM; uint8_t MidiKanalTaster2; uint8_t MidiKanalTaster3imEeprom EEMEM; uint8_t MidiKanalTaster3; uint8_t MidiKanalTaster4imEeprom EEMEM; uint8_t MidiKanalTaster4; uint8_t MidiKanalTaster5imEeprom EEMEM; uint8_t MidiKanalTaster5; uint8_t MidiKanalTaster6imEeprom EEMEM; uint8_t MidiKanalTaster6; uint8_t MidiKanalTaster7imEeprom EEMEM; uint8_t MidiKanalTaster7; //-----H-A-U-P-T-P-R-O-G-R-A-M-M-------------------------------------------------------------------------------- int main (){ UsartInit(); EinundAusgaengesetzten (); //Alle Variablen aus dem Eeprom lesen eeprom_busy_wait (); eeprom_read_block(&Taster0,&Taster0imEeprom,sizeof(Taster0)); //Speichert Inhalt des Eeproms an der Adresse Taster0imEeprom in Taster0 eeprom_busy_wait (); eeprom_read_block(&Taster1,&Taster1imEeprom,sizeof(Taster1)); eeprom_busy_wait (); eeprom_read_block(&Taster2,&Taster2imEeprom,sizeof(Taster2)); eeprom_busy_wait (); eeprom_read_block(&Taster3,&Taster3imEeprom,sizeof(Taster3)); eeprom_busy_wait (); eeprom_read_block(&Taster4,&Taster4imEeprom,sizeof(Taster4)); eeprom_busy_wait (); eeprom_read_block(&Taster5,&Taster5imEeprom,sizeof(Taster5)); eeprom_busy_wait (); eeprom_read_block(&Taster6,&Taster6imEeprom,sizeof(Taster6)); eeprom_busy_wait (); eeprom_read_block(&Taster7,&Taster7imEeprom,sizeof(Taster7)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster0,&MidiKanalTaster0imEeprom,sizeof(MidiKanalTaster0)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster1,&MidiKanalTaster1imEeprom,sizeof(MidiKanalTaster1)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster2,&MidiKanalTaster2imEeprom,sizeof(MidiKanalTaster2)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster3,&MidiKanalTaster3imEeprom,sizeof(MidiKanalTaster3)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster4,&MidiKanalTaster4imEeprom,sizeof(MidiKanalTaster4)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster5,&MidiKanalTaster5imEeprom,sizeof(MidiKanalTaster5)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster6,&MidiKanalTaster6imEeprom,sizeof(MidiKanalTaster6)); eeprom_busy_wait (); eeprom_read_block(&MidiKanalTaster7,&MidiKanalTaster7imEeprom,sizeof(MidiKanalTaster7)); //Endlosschleife while (1) { //Starte Konfiguration if ( ( PIND & 0b00000001 ) != 0 ){Konfiguration ();} //Starte Normalbetrieb if ( ( PIND & 0b00000001 ) == 0 ){Normalbetrieb ();} } // end of while } // end of main //------------------------------------------------------------------------------------------------- void EinundAusgaengesetzten (void){ //Eingänge DDRA = 0b00000000; //Taster 0-7 DDRB = 0b00000000; //Konfigurationen für Ausgangaktivierung beim drücken von Taster 0-7 //Aus und Eingänge DDRD = 0b11110000; //D0 = Konfigurationsschalter //D1 und //D2 zur Midikanalfestlegung //D1=0 & C2=0 --> Kanal0 //D1=0 & C2=1 --> Kanal1 //D1=1 & C2=0 --> Kanal2 //D1=1 & C2=1 --> Kanal3 //D3 //D4 = Status LED //D5 //D6 //D7 //Pull-up Widerstände setzen PORTA = 0b11111111; PORTB = 0b11111111; PORTD = 0b00001111; //Ausgänge: DDRC = 0b11111111; //Ausgänge } // end of EinundAusgaengesetzten //----K-O-N-F-I-G-U-R-A-T-I-O-N--------------------------------------------------------------------------------- void Konfiguration (void){ PORTD |= (1 << PORTD4); // Setzt Bit bei PORTC0 - Led an //Taster0 einstellen if ( (PINA & 0b00000001) != 0){ Taster0 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster0 = Taster0 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster0 = Taster0 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster0 = Taster0 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster0 = Taster0 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster0 = Taster0 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster0 = Taster0 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster0 = Taster0 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster0 = Taster0 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster0, &Taster0imEeprom, sizeof(Taster0)); //schreibe die Variable Taster1 mit der Länge sizeof(Taster1) an die Stelle von Taster1imEeprom MidiKanalTaster0 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster0, &MidiKanalTaster0imEeprom, sizeof(MidiKanalTaster0)); } // end of if //Taster1 einstellen if ( (PINA & 0b00000010) != 0){ Taster1 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster1 = Taster1 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster1 = Taster1 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster1 = Taster1 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster1 = Taster1 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster1 = Taster1 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster1 = Taster1 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster1 = Taster1 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster1 = Taster1 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster1, &Taster1imEeprom, sizeof(Taster1)); MidiKanalTaster1 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster1, &MidiKanalTaster1imEeprom, sizeof(MidiKanalTaster1)); } // end of if //Taster2 einstellen if ( (PINA & 0b00000100) != 0){ Taster2 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster2 = Taster2 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster2 = Taster2 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster2 = Taster2 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster2 = Taster2 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster2 = Taster2 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster2 = Taster2 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster2 = Taster2 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster2 = Taster2 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster2, &Taster2imEeprom, sizeof(Taster2)); MidiKanalTaster2 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster2, &MidiKanalTaster2imEeprom, sizeof(MidiKanalTaster2)); } // end of if //Taster3 einstellen if ( (PINA & 0b00001000) != 0){ Taster3 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster3 = Taster3 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster3 = Taster3 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster3 = Taster3 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster3 = Taster3 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster3 = Taster3 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster3 = Taster3 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster3 = Taster3 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster3 = Taster3 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster3, &Taster3imEeprom, sizeof(Taster3)); MidiKanalTaster3 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster3, &MidiKanalTaster3imEeprom, sizeof(MidiKanalTaster3)); } // end of if //Taster4 einstellen if ( (PINA & 0b00010000) != 0){ Taster4 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster4 = Taster4 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster4 = Taster4 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster4 = Taster4 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster4 = Taster4 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster4 = Taster4 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster4 = Taster4 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster4 = Taster4 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster4 = Taster4 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster4, &Taster4imEeprom, sizeof(Taster4)); MidiKanalTaster4 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster4, &MidiKanalTaster4imEeprom, sizeof(MidiKanalTaster4)); } // end of if //Taster5 einstellen if ( (PINA & 0b00100000) != 0){ Taster5 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster5 = Taster5 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster5 = Taster5 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster5 = Taster5 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster5 = Taster5 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster5 = Taster5 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster5 = Taster5 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster5 = Taster5 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster5 = Taster5 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster5, &Taster5imEeprom, sizeof(Taster5)); MidiKanalTaster5 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster5, &MidiKanalTaster5imEeprom, sizeof(MidiKanalTaster5)); } // end of if //Taster6 einstellen if ( (PINA & 0b01000000) != 0){ Taster6 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster6 = Taster6 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster6 = Taster6 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster6 = Taster6 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster6 = Taster6 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster6 = Taster6 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster6 = Taster6 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster6 = Taster6 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster6 = Taster6 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster6, &Taster6imEeprom, sizeof(Taster6)); MidiKanalTaster6 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster6, &MidiKanalTaster6imEeprom, sizeof(MidiKanalTaster6)); } // end of if //Taster7 einstellen if ( (PINA & 0b10000000) != 0){ Taster5 = 0b00000000; if(( PINB & 0b00000001 ) != 0){Taster7 = Taster7 + 0b00000001;} if(( PINB & 0b00000010 ) != 0){Taster7 = Taster7 + 0b00000010;} if(( PINB & 0b00000100 ) != 0){Taster7 = Taster7 + 0b00000100;} if(( PINB & 0b00001000 ) != 0){Taster7 = Taster7 + 0b00001000;} if(( PINB & 0b00010000 ) != 0){Taster7 = Taster7 + 0b00010000;} if(( PINB & 0b00100000 ) != 0){Taster7 = Taster7 + 0b00100000;} if(( PINB & 0b01000000 ) != 0){Taster7 = Taster7 + 0b01000000;} if(( PINB & 0b10000000 ) != 0){Taster7 = Taster7 + 0b10000000;} eeprom_busy_wait (); eeprom_write_block(&Taster7, &Taster7imEeprom, sizeof(Taster7)); MidiKanalTaster7 = Midikonfiguration(); eeprom_busy_wait (); eeprom_write_block(&MidiKanalTaster7, &MidiKanalTaster7imEeprom, sizeof(MidiKanalTaster7)); } // end of if } // end of Konfiguration //----M-I-D-I-_-K-O-N-F-I-G-U-R-A-T-I-O-N------------------------------------------------------------------------ int8_t Midikonfiguration (void){ //Midi Kanal 0 if(( PIND & 0b00000010)==0 && (PIND & 0b00000100)== 0){ return 0b00000000;} //0 //Midi Kanal 1 if(( PINC & 0b00000010)==0 && (PIND & 0b00000100)!= 0){ return 0b00000001;} //1 //Midi Kanal 2 if(( PIND & 0b00000010)!=0 && (PIND & 0b00000100)== 0){ return 0b00000010;} //2 //Midi Kanal 3 if(( PIND & 0b00000010)!=0 && (PIND & 0b00000100)!= 0){ return 0b00000011;} //3 else return 0b00000000;} //----M-I-D-I-_N-O-R-M-A-L-B-E-T-R-I-E-B---------------------------------------------------------------- void MidiSenden(int8_t Midikanal) { // vllt brauch ich Control Change //bei Midi Kanal 0 if ((Midikanal) == 0b00000000){ MidiSendProgramChange( 0b11000000, 0b00000000 );} //Channel 0 Programmnummer 0 von 127) //bei Midi Kanal 1 if ((Midikanal) == 0b00000001){ MidiSendProgramChange( 0b11000000, 0b00000001);} //Channel 0 Programmnummer 1 //bei Midi Kanal 2 if ((Midikanal) == 0b00000010){ MidiSendProgramChange( 0b11000000, 0b00000010);} //Channel 0 Programmnummer 2 //bei Midi Kanal 3 if ((Midikanal) == 0b00000011){ MidiSendProgramChange( 0b11000000, 0b00000011);} //Channel 0 Programmnummer 3 else MidiSendProgramChange( 0b11000000, 0b00000000); // sonst Channel 0 Programmnummer 0 } // MidiChannel 1011nnnn (n=1-16/0-15) // MidiProgramNumber 0ppppppp (p=0-127) void MidiSendProgramChange(uint8_t MidiChannel, uint8_t MidiProgramNumber) { UsartSend(MidiChannel); UsartSend(MidiProgramNumber); } // MidiChannel 1011nnnn (n=1-16/0-15) // MidiControlerNumber 0ccccccc (0-119) // MidiControlerValue 0vvvvvvv (0-127) void MidiSendControlChange (uint8_t MidiChannel, uint8_t MidiControlerNumber, uint8_t MidiControlerValue ) { UsartSend(MidiChannel); UsartSend(MidiControlerNumber); UsartSend(MidiControlerValue); } // MidiChannel 1011nnnn (n=1-16/0-15) // MidiControlChangeControlNumber 0ccccccc(1-127) // MidiByteValue 0vvvvvvv (0-127) void MidiBankSelect (uint8_t MidiChannel, uint8_t MidiControlChangeControlNumber, uint8_t MidiByteValue) { UsartSend(MidiChannel); UsartSend(MidiControlChangeControlNumber); UsartSend(MidiByteValue); } //----U-S-A-R-T-_-I-N-I-T-I-A-L-I-S-I-E-R-E-N----------------------------------------------------------------------- //uart initialisieren void UsartInit (void){ #define BAUD 31250UL //Midispezifikation // Berechnungen #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden UCSRB |= (1<> 8; //Baudrate einstellen UBRRL = UBRR_VAL & 0xFF; //Baudrate einstellen } // end of Usartinit //----U-S-A-R-T-_-N-O-R-M-A-L-B-E-T-R-I-E-B--------------------------------------------------------------------------- void UsartSend(uint8_t data){ //warten bis Senden moeglich while (!(UCSRA & (1<