Forum: Projekte & Code 6 IO Pins für 6 Taster und 2 Duo LED (Bauteile z.B. von Pollin)


von Thorsten S. (whitejack)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe nun meine kleine Software fertig und möchte sie hier zur 
verfügung stellen.

Es werden 6 Tasten und 2 Duo LEDs bedient. Dafür werden 5 Pins am 
Prozessor gebraucht.

Es wird nach dem Prinzip des Charlieplexings gesteuert. Dazu werden die 
Taster mit Dioden zwischengeschaltet.

Es können mehrere Tasten gleichzeitig gedrückt und ausgewertet werden.

Files:

Hardwareabfrage:

io.c
io.h
fdf.h (makros)

Schritt 1:

Die Funktionen "spiegeln" den Status der LED und der Taster in internen 
Variablen wieder. Auf diesen Daten kann man aufsetzen als wäre jede/r 
LED/Taster an einen eigenen Pin, es gibt also im Prinzip 6 Bits für die 
Taster, und 4 Bits für die 2 Duo LED. Die Pins und Register werden im 
Header für die entsprechende Hardware eingesetllt. Es gibt 5 Pins:


#define IO_PIN_COM_GREEN_BTNLFT     0    //Schaltplan E
#define IO_PIN_COM_REDUP_BTNMID     0    //Schaltplan D
#define IO_PIN_COM_REDDN_BTNRGT     1    //Schaltplan C
#define IO_PIN_BTN_A                0    //Schaltplan A
#define IO_PIN_BTN_B                1    //Schaltplan B


Beitrag "Re: 6 IO Pins für 6 Taster und 2 Duo LED"

Die Funktion:

io_update()

sollte rund alle 5ms aus dem Main aufgerufen werden.

Schicht 2:

Darauf setzt eine weitere "Schicht" auf:

btn.c
btn.h

Diese Dateien fungieren als "container" und verwerten die Übergabebits 
weiter. Die "button" Dateien bieten die Möglichkeit des Entprellens und 
des Autorun für eine Taste. (Autorun: wenn ein Taster eine Zeit x 
gedrückt wird, erzeugt er automatisch wiederkehrende Funktionsaufrufe) 
Wobei sich die Zeit hier direkt an die Aufrufhäufigkeit von io hängt.

Ein klassischer Aufruf zur Auswertung im Main sähe dann so aus:

    if(BTN_IS_ACT(0))
    {
        BTN_DEACT(0);

        do_my_func();
    }

Die hinter dem Makro steckende Funktion ist selbstsperrend, man kann sie 
direkt ins Main einbauen - fertig.

Das Timingverhalten ist an die Funktion:

io_update()

gebunden. Es kann in btn.h für das Entprellen, die Zeit bis Autorun 
startet und wie schnell es im Autorun laufen soll eingestellt werden. 
Dieser Service kostet natürlich Variablen. Für jede Taste 2x8Bit in 
btn.c, darin enthalten sind counter für die eingestellten Timings und 
bits zum sperren und steuern.

btn.c und io.c kommunizieren über diese beiden Funktionen:

void btn_pushed (uint8_t btn)
void btn_released (uint8_t btn)

Das hat den Vorteil das man btn.c für jede Tastenhardware einsetzen 
kann. Man muss nur die Hardwareschicht entsprechend anpassen.

Es werden keine weiteren Hardwarespezifischen Teile des uc genutzt, die 
Softwareschnipsel laufen auf jedem uc. Wie man die LEDs ein und 
ausschaltet ist im io header beschrieben.

Es wurde bewusst auf möglichst viele Funktionsaufrufe verzichtet um Zeit 
sparen zu können und trotzdem den Eindruck zu erwecken es wäre 
gekapselt.

Gruß,
T.S:

Bauteile von Pollin:

http://www.pollin.de/shop/dt/OTg5OTc1OTk-/Bauelemente_Bauteile/Mechanische_Baulemente/Schalter_Taster/Eingabetaster_6_fach.html

http://www.pollin.de/shop/dt/Njg2OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/LEDs/LED_Zeile.html

: Verschoben durch Moderator
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.