Forum: Mikrocontroller und Digitale Elektronik Taster abfragen


von Wolle G. (wolleg)


Lesenswert?

Mittels Taster soll über einen µC eine LED (später ein Motor) geschaltet 
werden, was mir aber nichr gelingt.

hier mein Programmschnipsel
1
 
2
#include <MSP430x16x.h>                   // für MSP430F1611
3
4
int main(void)
5
   {
6
    WDTCTL = WDTPW + WDTHOLD;   // Stop watchdog timer
7
  
8
    P4DIR |= BIT0 + BIT1;        // für LED   P4.0 + P4.1
9
    P2DIR |= BIT4 + BIT5;       // P2.4 + P2.5 ausgang motor 
10
    P4OUT |= BIT0;              // LED rot   P4.0 AUS
11
    P4OUT |= BIT1;              // LED gelb  P4.1 AUS
12
    while(1)
13
    {
14
    if (!(P3IN&BIT0) == BIT0) (P4OUT &=~BIT0); // (P4OUT &=~BIT0) LED rot
15
    }
16
    }
17
  -----------------------------------------------------------------------
P3.0 liegt mittels des 2k2 Widerstands auf Masse. Der Taster schaltet 
bei Betätigung P3.0 auf +3V.
1
                      
2
                            | +3V
3
                            |
4
                            |
5
                               | Taster
6
                            |
7
                            |---------- P3.0
8
                            |     |
9
                            |   R=2k2
10
                            |     |
11
                            |     |
12
                             Masse

mit if (!(P3IN&BIT0) == BIT0)(P4OUT &=~BIT0);//(P4OUT &=~BIT0) LED rot
ist die LED ohne und mit Betätigung des Tasters immer EIN

mit if ((P3IN&BIT0) == BIT0)(P4OUT &=~BIT0);// (P4OUT &=~BIT0) LED rot
ist die LED ohne und mit Betätigung des Tasters immer AUS

Ziel ist, dass die LED solange eingeschaltet ist, wie der Taster 
gedrückt ist.

Vermutlich ist das Problem rel. einfach, aber ich komme nicht zum Ziel.
Was mache ich falsch?

: Bearbeitet durch Moderator
von Sebastian R. (sebastian_r569)


Lesenswert?

MSPs sind nicht meine Stärke, aber ein paar Anmerkungen:

- Müsstest du den Taster-Pin nicht noch als Eingang definieren?

- Dir fehlt ein else-Zweig, ansonsten wird der andere Zustand der LED 
nicht erreicht.
1
if(taste gedrueckt)
2
{
3
   led an;
4
} else 
5
{
6
   led aus;
7
}

von hps (Gast)


Lesenswert?

Zunächst solltest Du den Taster hardwaremäßig "entprellen", indem du 
z.B. einen 100nF Kondensator parallel zum Taster verlötest.

In der Software frage ich den Eingang zyklisch ab, z.B. alle 20 
Millisekunden, und inkrementiere einen Zähler. Nur, wenn der Eingang 
mindestens 3 mal hintereinander denselben Wert hat (enspricht 60ms), 
akzeptiere ich das als "echtes Signal" und aktiviere die betreffende 
Funktion. Sollte der Input-Wert vorher hin- und hertoggeln, verwerfe ich 
das, indem ich den Zähler wieder auf "0" setze.

VG von HPS

von michael_ (Gast)


Lesenswert?

hps schrieb:
> Zunächst solltest Du den Taster hardwaremäßig "entprellen", indem du
> z.B. einen 100nF Kondensator parallel zum Taster verlötest.

Nö, in seinem Fall braucht es das nicht.

wolle g. schrieb:
> Ziel ist, dass die LED solange eingeschaltet ist, wie der Taster
> gedrückt ist.

Siehe:

wolle g. schrieb:
> Ziel ist, dass die LED solange eingeschaltet ist, wie der Taster
> gedrückt ist.

von hps (Gast)


Lesenswert?

@Michael: Da aktuell weder in der Hardware noch in der Software 
entprellt wird, entspricht der Kondensator einer guten und 
kostengünstigen elektronischen Praxis.
Man weiss ja nie, welche "Spikes" es je nach Taster geben kann.
Wenn man keinerlei Entprellung hat, kann beim alternierenden Ein-und 
Ausschalten elektrischer Verbraucher auf der Ausgangsseite hochfrequente 
Strahlung erzeugt werden, was wiederum andere elektronische Geräte 
empfindlich stören kann.

von michael_ (Gast)


Lesenswert?

Bei einer LED stört das nicht. So schnell kannst du nicht gucken.

Den späteren Motor wird das auch nicht stören.
Und sooo schnell ist das Prellen auch wieder nicht.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

hps schrieb:
> Wenn man keinerlei Entprellung hat, kann beim alternierenden Ein-und
> Ausschalten elektrischer Verbraucher auf der Ausgangsseite hochfrequente
> Strahlung erzeugt werden
Jede Schaltflanke erzeugt solche "Störungen". Aber das ist hier völlig 
irrelevant. Denn ein prellender Taster würde solche "Störungen" auch 
erzeugen, wenn er die LED direkt, ganz ohne µC, schalten würde.
Und der Ausgang würde an der LED ganz ohne Taster die "Störungen" auch 
erzeugen, wenn die LED z.B. mit 1kHz PWM geschaltet würde. Und dann 
dauernd und vielfach.

> entspricht der Kondensator einer guten und kostengünstigen
> elektronischen Praxis.
Ich mache sowas nur bei Schaltern, die einen gewissen Mindeststrom zum 
"Freibrennen" der Oxidschicht brauchen. Als allgemeine "Regel" ist so 
eine "Bastlerfaustformel" völlig ungeeignet. Und zum Thema "gute 
Praxis": an keinem meiner üblichen Taster, die auf Logikpegel agieren, 
ist ein solcher Kondensator. Keine davon ist negativ aufgefallen. Auch 
nicht im EMV-Test.

hps schrieb:
> Zunächst solltest Du den Taster hardwaremäßig "entprellen", indem du
> z.B. einen 100nF Kondensator parallel zum Taster verlötest.
Bei solchen "Entprellkondensatoren" , die dann vom Taster 
kurzgeschlossen werden, sollte man aber genau wissen, ob man das schon 
tun darf. Generell ist das der Lebensdauer des Tasters eher nicht 
zuträglich.

Und wenn man schon einen µC hat und die Anwendung eine Entprellung 
braucht, dann macht man das in Software.

@ wolle g. (wolleg)
Diese Abfrage macht mit der Invertierung erst mal einen Knoten ins Hirn:
1
if (!(P3IN&BIT0) == BIT0)
Warum schreibst du nicht so:
1
if ( P3IN&BIT0 )    // Eingangspegel = high?
2
    P4OUT &=~BIT0;  // j: Augang = low --> LED = ein
3
else                
4
    P4OUT |=BIT0;   // n: Augang = high --> LED = aus

Die Abfrage auf
1
if ( P3IN&BIT0 )
reicht aus, denn ein if macht den if-Pfad dann, wenn der Ausdruck in der 
Abfrage ungleich 0 ergibt. Und wenn der Ausdruck 0 ist, dann macht er 
den else-Pfad.
Und wenn ich am P3In das gewünschte Bit 1 ausmaskiert habe, dann kommt 
da bei gedrücktem Taster 2 raus oder bei nicht gedrücktem eine 0. Fazit: 
da muss nichts mehr weiter invertiert und verglichen werden...


BTW:
Warum schaltest du den Schalter so umständlich?
Der MSP hat doch sicher schaltbare Pullups. Den schaltest du ein und 
klemmst den Taster zwischen Eingangspin und GND. Und dann musst du nur 
noch die Programmlogik umkehren. Oder die LED mitsamt Vorwiderstand 
ebenfalls zwischen Vcc und Ausgangspin schalten (aber das ist sie nach 
deinem Kommentar sowieso).

: Bearbeitet durch Moderator
von Max M. (max_m250)


Lesenswert?

Unser EMV-Prof war wenn es um Kondensatoren an Tastern ging immer ein 
Fan von 470pF Funkenlöschkondensatoren. Von 100nF war da nie die Rede.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Max M. schrieb:
> Unser EMV-Prof war wenn es um Kondensatoren an Tastern ging immer ein
> Fan von 470pF Funkenlöschkondensatoren.
Mit welcher Begründung? Welche Störung lassen sich damit bei welchen 
Spannungen und welcher Verdrahtungstopografie reduzieren?

von Wolle G. (wolleg)


Lesenswert?

Vielen Dank für die vielen Hinweise.
Der Groschen war eigentlich schon gestern Abend nach Sebastian R. 
Beitrag gefallen.
Ursprünglich hatte ich schon else mit eingebaut, aber da hatte ich 
falsch gedacht und deshalb lief es bei mir nicht.

Noch etwas zu einigen der hier aufgeworfenen Punkte:
Lothar M. schrieb:
@ wolle g. (wolleg)
Diese Abfrage macht mit der Invertierung erst mal einen Knoten ins Hirn:
if (!(P3IN&BIT0) == BIT0)
Warum schreibst du nicht so:
if ( P3IN&BIT0 )    // Eingangspegel = high?
    P4OUT &=~BIT0;  // j: Augang = low --> LED = ein
else
    P4OUT |=BIT0;   // n: Augang = high --> LED = aus

Ja so ist es mit dem Knoten.
Die Zeile  if (!(P3IN&BIT0) == BIT0)  habe ich irgendwann mal 
übernommen. Deshalb bin ich hier wahrscheinlich auch nicht zum Ziel 
gekommen.
Lothar M. schrieb:
"Warum schaltest du den Schalter so umständlich?
Der MSP hat doch sicher schaltbare Pullups."
Die Frage kann ich nicht so richtig beantworten, da ich dazu nicht tief 
genug in der Materie stecke. Aber ich werde mich noch einmal damit 
beschäftigen müssen.

Berichtigung: In meiner "Zeichnung" ist die Verbindung  zwischen P3.0 
und Masse zu viel.
Daduch wird R=2k2 in der "Zeichnung"  kurz geschlossen.

: Bearbeitet durch User
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.