PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Schieberegister: Abfrage von mehreren Tastern



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!!!

BMS
05.03.2014, 13:00
Hallo,
erste Anlaufstelle ist grundsätzlich immer das Datenblatt.
http://www.datasheetcatalog.com/datasheets_pdf/M/C/1/4/MC14021B.shtml

C ist der Takteingang (CLOCK)
P/S wählt zwischen paralleler und serieller Arbeitsweise
Ds ist ein serieller Dateneingang
Q6, Q7 sind Ausgänge des sechsten und siebten Flipflops, die werden hier nicht benötigt
Q8 ist der Ausgang des letzten Flipflops.

Kaskadierung mehrerer 4021 kann über die Verbindung Q8 , Ds geschehen.

An deiner Stelle würde ich SPI verwenden. Hardware-SPI läuft schneller als eine Software-Variante und ist auch schneller programmiert.
Wenn das Lesen der Tastenzustände zu lange dauert, gibt es später unschöne Verzögerungen beim Orgelspielen.

Grüße, Bernhard

fredred
05.03.2014, 16:40
Hallo Berhard,

mein Vorschlag wäre ein I2C- Bus zu nutzen. Nur mit einem PCF8574 IC kannst, du 255 Tasterabfragen realisieren.
Kann Hardware Hilfe anbieten. Umfangreiche Softwarehilfe im Bereich Bus-Systeme kann ich mit BASCOM-Code zu Verfügung stellen.

Gruß
fredred

fabiii9
05.03.2014, 20:40
Hallo,
vielen Dank für eure UNterstützung.

Melde mich nochmal, wenn ich Hilkfe benötige.

Vielen Dank
Gruß
Fabi