-         

Ergebnis 1 bis 3 von 3

Thema: Tastenmatrix 3x4 mittels Interrupt abfragen?

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.06.2010
    Beiträge
    6

    Tastenmatrix 3x4 mittels Interrupt abfragen?

    Anzeige

    Da ich kein Pollingverfahren verwende, möchte ich über eine 3x4
    Tastenmatrix die einzelnen Tasten über Interrupts abfragen. (Siehe
    Datei)


    Die 3 Spalten sind mit den Interruptpins Int0, Int1 und Int2 des
    Controllers verbunden. Die 4 Zeilen mit den Pins PC4...PC7.
    Spaltenpins = als Eingänge geschaltet
    Zeilenpins = als Ausgänge geschaltet

    Die 3 Spalten ergeben sich über die einzelnen Interrupts, das ist mir klar. Wie mache ich das aber am einfachsten mit den Zeilen und wie werte ich die Tasten aus?

    Hier mein vorläufiger Code.

    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <avr/wdt.h>
    #include <avr/sleep.h>
    
    int main (void)
    {
      DDRC =     (1<<PC4)|(1<<PC5)|(1<<PC6)|(1<<PC7);    // Datenrichtung der Zeilen = Ausgang
      DDRD =     (0<<PIND6);                  // Datenrichtung Eingang (für Int 0)
      DDRB =     (0<<PINB2)|(0<<PINB5);          // Datenrichtung Eingang (für Int 1, Int 2)
      DDRB =     (1<<DDB4)|(1<<DDB3)|(1<<DDB0)|(1<<DDB1);  // LEDs = Ausgang
      PORTD |=   (1<<PD6);                  // Pull-up
      PORTB |=   (1<<PB2)|(1<<PB5);              // Pull-up
    
      EIMSK |=  (1<<INT0)|(1<<INT1)|(1<<INT2);        // Set Int0 - 2 enable
      EICRA |=   (1<<ISC01)|(1<<ISC11)|(1<<ISC21);       // Set Int0 - 2 on falling edge
    
      sei();                          // enable all Interrupts
    
      while (1)             
      {
        PORTB ^= (1<<PB3);      // Led on/off
        _delay_ms(500);        // Warten
      }
    }
    
    ISR(INT0_vect)              // Aufruf Interrupt Service Routine INT0
    {
      PORTB ^= (1<<PB4);        // Led0 on
      _delay_ms(100);
    }
    
    ISR(INT1_vect)              // Aufruf Interrupt Service Routine INT1
    {
      PORTB ^= (1<<PB0);        // Led1 on
      _delay_ms(100);
    }
    
    ISR(INT2_vect)              // Aufruf Interrupt Service Routine INT2
    {
      PORTB ^= (1<<PB1);        // Led2 on
      _delay_ms(100);
    }
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken tastenmatrix.jpg  

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Eine Idee: Bei den Interrupt-Pins (Inputs) den Pullup einschalten.
    Die anderen (Zeilen) als Ausgang und auf Low schalten.
    Wird eine Taste gedrückt, reagiert der Interrupt.

    Im Interrupt jetzt das ganze umdrehen: Zeilen als Eingang mit aktivem Pullup, den entsprechenden Interrupt als Ausgang und Low.
    Und jetzt einfach die 4 Zeilen-Pins einlesen und schauen, welcher low ist => der gedrückte.
    #ifndef MfG
    #define MfG

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.06.2010
    Beiträge
    6
    Super! Das hilft mir weiter.

    Danke!

Berechtigungen

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