Forum: Mikrocontroller und Digitale Elektronik Kurze Frage zum Entprellen


von Andreas M. (Gast)


Lesenswert?

Hallo,
Ich hab seit gestern die Beiträge in dem Thread "Tastatur Matrix 
entprellen" zum Thema Entprellen einer Matrix verfolgt.
Heute hab ich gesehen ihr hab den Thread dicht gemacht.

Der Threaderöffner hat sich aber auch angestellt!

Aber egal, jedenfalls hab ich auch vor in nächster Zeit ein Projekt mit 
einer Tastaturmatrix zu realisieren.
Und da könnte ich diese Routine auch gut gebrauchen!
Mir ist allerdings noch nicht so richtig klar, wie ich die Routine in 
die Timer gesteuerte Entprellung von Peter einbringe.
Vielleicht stehe ich auch gerade aufm Schlauch aber vielleicht könnte 
mir kurz jemand helfen.

Ich hoffe ihr habt die Nase nicht völlig voll vom Matrix Entprellen und 
verstoßt mich nicht gleich!

Also besten Dank schon mal im Voraus und einen Schönen Abend!

#include <avr/io.h>

#define ROW0    (1<<PB0)
#define ROW1    (1<<PB2)
#define COL0    (1<<PB1)
#define COL1    (1<<PB3)

#define NOP()           _asm_ volatile("nop"::)

uint8_t keyscan()
{
  uint8_t val;

  DDRB  &=  ~(ROW0 | ROW1 | COL0 | COL1); // Inputs
  PORTB |=  ROW0 | ROW1 | COL0 | COL1;  // with pullup

  PORTB &= ~COL0;                       // Low
  DDRB  |=  COL0;                       // Output
  NOP();                                // load Input latch !
  val = (PINB & (ROW0 | ROW1)) << 1;    // Bit 1, 3

  DDRB  &= ~(ROW0 | ROW1 | COL0 | COL1); // Inputs
  PORTB |=  ROW0 | ROW1 | COL0 | COL1;  // with pullup

  PORTB &= ~COL1;                       // Low
  DDRB  |=  COL1;                       // Output
  NOP();                                // load Input latch !
  val |= PINB & (ROW0 | ROW1);          // add Bit 0, 2

  return val;
}

von Karl H. (kbuchegg)


Lesenswert?

Andreas M. schrieb:

> Mir ist allerdings noch nicht so richtig klar, wie ich die Routine in
> die Timer gesteuerte Entprellung von Peter einbringe.
> Vielleicht stehe ich auch gerade aufm Schlauch aber vielleicht könnte
> mir kurz jemand helfen.


Die Funktion liefert ein Byte, in dem bitweise codiert ist, welche Taste 
gerade gedrückt ist.

Im Entprellcode ist das hier die Stelle
1
  i = key_state ^ ~KEY_PIN;

an der die jetzt gerade gedrückten Tasten (in Form einer Abfrage des PIN 
Registers der Tasten) in die Entprellung eingehen.

Bei dir kriegst du die gerade gedrückten Tasten nicht durch Abfrage des 
PIN Registers, sondern durch den Aufruf der Funktion. Also wirst du 
KEY_PIN ersetzen durch ....

Aufpassen musst du jetzt nur darauf, ob aus der Funktion eine gedrückte 
Taste mit einem 1-Bit oder mit einem 0-Bit repräsentiert wird. Der 
Originalcode der Entprellung ist auf eine 0-Bit/Taste_gedrückt Situation 
ausgelegt. Daher auch das ~. Wenn das in der Funktion anders rum ist, 
dann fällt eben die ~ weg.

von Andreas M. (Gast)


Lesenswert?

Hallo
Besten Dank für deine schnelle Anwort!!!

Jetzt ist es klar, wie ichs machen muss!

Gruß Andreas

von Andreas M. (Gast)


Lesenswert?

Hallo,
hab noch mal ne kurze Frage.
Habs gerade mal ausprobiert zu Programmieren.

Aber wie muss ich denn jetzt eigendlich die Tasten aufrufen?

Ohne Matrix Routine muss man ja "get_key_short( 1<<KEY1 )"aufrufen aber 
was muss ich den jetzt anstatt des KEY1 eintragen?

In der Variable val werden ja die Bit gespeichert aber wie kann ich die 
dort prüfen?

Besten Dank schon mal!

Is wahrscheinlich ganz einfach aber komme gerade nicht drauf! Liegt 
vielleicht am Wetter, da will man sich eig gleich zum Schlafen hinlegen.

Andreas

von Andreas M. (Gast)


Lesenswert?

Hab gerade noch ne Idee gehabt!

Kann man es vielleicht so machen?

#define Tasten      val
#define Taste0      0
#define Taste1      1
#define Taste2      2
#define Taste3      3

Und dann so aufrufen "get_key_short( 1<<Taste1 )"

oder is das ne dumme Idee? Dann streich ich sie gleich wieder!

Andreas

von Andreas M. (Gast)


Lesenswert?

Habs gerade mal mit nem Atmega 16 aufgebaut und ausprobiert. Aber so 
richtig gut scheint meine Idee nicht zu sein.
Es funktionieren leider nur zwei Tasten!

Könnste mir jemand helfen, damit es klappt?

Andreas

von Karl H. (kbuchegg)


Lesenswert?

Andreas M. schrieb:
> Habs gerade mal mit nem Atmega 16 aufgebaut und ausprobiert. Aber so
> richtig gut scheint meine Idee nicht zu sein.
> Es funktionieren leider nur zwei Tasten!
>
> Könnste mir jemand helfen, damit es klappt?

Ehe du mit der Entprellung weiter machst ...
taste doch erst mal die Matrix-Funktion für sich alleine. Häng 4 LED an 
einen Port, Pins 0 bis 4 und sieh nach, ob die sauber aufleuchten, wenn 
du die entsprechende Taste drückst.
1
....
2
3
int main()
4
{
5
  uint8_t keys;
6
7
  DDRD = 0xFF;
8
   ....
9
10
  while( 1 )
11
  {
12
    keys = keyscan();
13
    PORTD = keys;
14
  }
15
}

Ihr macht immer den gleichen Fehler: Zuviel ungetesteten Code auf 
einmal. Und wenn dann nichts geht, dann weiß man nicht, wo man mit der 
Sucherei anfangen soll.
Die Entprellung ist darauf angewiesen, dass die keyscan() Funktion 
einwandfrei eine gedrückte Taste erkennt. Ist das nicht gegeben, dann 
kann die Entprellung auch nichts machen. Also muss man das erst mal 
testen, ob das Scannen der Tasten-Matrix funktioniert, ob die Hardware 
richtig aufgebaut und angeschlossen ist, was passiert eigentlich wenn 
man mehrere Tasten drückt etc. etc.
Bei jeder einzelnen der gedrückten Tasten muss sich an den LEDs was tun 
(entweder ausgehen oder leuchten, je nachdem wie die LED angeschlossen 
sind). Jede Taste ist mit einem Bit in 'keys' verknüpft und die 
wiederrum (durch die Ausgabe) mit jeweils einer LED.


Beim Testen fängt man immer mit der einfachsten Softwareschicht an. Jede 
weitere darüber liegende Schicht macht die Dinge komplexer und nicht 
einfacher. Je komplexer .. desto schwieriger ist es Fehler in den 
untersten Schichten zu diagnostizieren. Also muss man sich die untersten 
Schichten mal losgelöst von allem anderen vornehmen.

Das heißt nicht, dass dort jetzt ein Problem sitzt. Aber es könnte eines 
dort sein und selbst wenn man nichts findet, ist das dann schon mal ein 
potentieller Fehlerpunkt den man ausschliessen kann.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.