Hallo liebe Community,
erstmal ein Überblick über mein Projekt:
Ich will eine Orgel midifizieren. In dieser Orgel sind unter jeder Tasten ein offener Kontakt.
Jetzt will ich, dass wenn eine Taste gedrückt wird ein Midisignal gesendet wird.
Ich habe schonmal eine funktionsfähige Schaltung aufgebaut, wo ich das anhand von drei Tastern getestet habe.
Da habe ich die Taster an drei ganz normale Eingänge am Atmega8 angeschlossen.
Hat super funktioniert.
Mein Code:
Nachdem ich das aber für ca. 224 Taster machen muss, reichen meine I/O Pins natürlich nicht mehr aus.Code:#include <avr/io.h> #define F_CPU 1000000 // 1 MHz #define BAUD 31250 // MIDI-Baudrate (31,25kBit) #include <util/setbaud.h> #define Taster PD2 uint8_t Keydown; void uart_init(void){ UBRRH = UBRRH_VALUE; UBRRL = UBRRL_VALUE; #if USE_2X // U2X-Modus erforderlich UCSRA |= (1 << U2X); #else // U2X-Modus nicht erforderlich UCSRA &= ~(1 << U2X); #endif UCSRB |= (1<<TXEN); // UART TX einschalten UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1 } void uart_putc(unsigned char c){ while (!(UCSRA & (1<<UDRE))){} // warten bis Senden moeglich UDR = c; // sende Zeichen } void Sendmidinoteon(void){ uart_putc(145); // NOTE-ON-Command uart_putc(65); // Tasten-Nummer 69 (A4) uart_putc(100); // Key-Down-Velocity 100 } void Sendmidinoteoff(void){ uart_putc(129); // NOTE-OFF-Command uart_putc(65); // Tasten-Nummer 69 (A4) uart_putc(0); // Release-Velocity 0 (Default) } int main(void){ uart_init(); // UART initialisieren DDRD |= (1<<PD1); // PD1 Output PORTD |= (1<<Taster); // am Tastereingang Pullup an while(1){ // Endlosschleife if(!(PIND & (1<<Taster))){ // wenn Taste gedrueckt if( Keydown ){ Sendmidinoteon(); Keydown = 0; } } else{ // wenn Taste nicht gedrueckt if( !Keydown ){ Sendmidinoteoff(); Keydown = 1; } } } // Ende Endlosschleife }
Tastenmatrix geht auch nicht, da die ja alle auf die gleiche "Masse-Stange" tasten.
Also habe ich mich für Schieberegister entschieden.
Ich hätte noch sehr viele MC14021 daheim.
Würde das gerne damit lösen.
Jetzt zu meiner Frage, wie schließ ich das denn eigentlich an??
Empfehlt ihr mir eine SPI Ansteuerung oder eine Software mäsige.
Am Atmega8 wären die SPI Pins frei.
Ich Suche jetzt schon seit längerem nach einem Code im Internet.
Habe des Tutorial von mikrocontroller.net über Schieberegister durchgearbeitet, doch die verwenden ein anderes Schieberegister. Mächte aber meins hernehmen.
Habe mir jetzt mal die Pins angeschaut:
Wie muss ich es anschließe??
P1-------|
P2-------|
P3-------|
P4-------|- Die 8 Eingänge, wo die Taster hinkommen
P5-------|
P6-------|
P7-------|
P8-------|
C--------?
P/S------?
Ds-------?
Q6-------?
Q7-------?
Q8-------?
VDD------+5V
VSS------Ground
Müsste natürlich dann auch mehrer Schiebereegister in Reihe schalten.
Wäre super nett, wenn mir jemand Links schicken könnte, oder mir einfach Tipps geben könnte, Codeschnipsel oder irgendwas.
Vielen lieben Dank für eure Unterstützung!!!
Lesezeichen