-         
Ergebnis 1 bis 4 von 4

Thema: Schieberegister: Abfrage von mehreren Tastern

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    11.09.2012
    Beiträge
    15

    Schieberegister: Abfrage von mehreren Tastern

    Anzeige

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

    Klicke auf die Grafik für eine größere Ansicht

Name:	MC14021.jpg
Hits:	3
Größe:	5,8 KB
ID:	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!!!

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von BMS
    Registriert seit
    21.06.2006
    Ort
    TT,KA
    Alter
    27
    Beiträge
    1.192
    Hallo,
    erste Anlaufstelle ist grundsätzlich immer das Datenblatt.
    http://www.datasheetcatalog.com/data...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
    "Im Leben geht es nicht darum, gute Karten zu haben, sondern auch mit einem schlechten Blatt gut zu spielen." R.L. Stevenson

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    14.11.2013
    Ort
    Home
    Beiträge
    212
    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

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    11.09.2012
    Beiträge
    15
    Hallo,
    vielen Dank für eure UNterstützung.

    Melde mich nochmal, wenn ich Hilkfe benötige.

    Vielen Dank
    Gruß
    Fabi

Ähnliche Themen

  1. ASURO-Probleme bei Kombination von Tastern
    Von Barbara1 im Forum Asuro
    Antworten: 51
    Letzter Beitrag: 30.03.2011, 14:42
  2. Vernetzung von mehreren ATmega's
    Von Mr. S im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 09.03.2011, 10:11
  3. Wartezeiten von mehreren Minuten
    Von MechMac im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 24.08.2010, 19:41
  4. Auswertung von Tastern (Menüsteuerung)
    Von Duesentrieb im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 08.07.2008, 15:56
  5. Programmieren von mehreren ereignissen
    Von Exodus im Forum AVR Hardwarethemen
    Antworten: 3
    Letzter Beitrag: 19.06.2006, 12:25

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •