fabiii9
05.03.2014, 11:15
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:
#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
}
Nachdem ich das aber für ca. 224 Taster machen muss, reichen meine I/O Pins natürlich nicht mehr aus.
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:
27673
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!!!
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:
#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
}
Nachdem ich das aber für ca. 224 Taster machen muss, reichen meine I/O Pins natürlich nicht mehr aus.
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:
27673
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!!!