MSP Taster ansprechen

OP #3344096
Lesenswert?

Hallo zusammen,

ich habe hier ein kleines Problem mit dem MSP430(G2111).
Und zwar habe ich hier eine fertig aufgebaute Schaltung mit dem MSP430, 
mehreren LEDs und ein paa Tastern. Laut Schaltplan liegen die Taster 
ohne Wiederstand direkt gegen GND. Aber egal, wie ich versuche, die 
Pins, an denen die Taster angeschlossen sind zu initialisieren, ich habe 
immer ein HI auf dem entsprechenden Pin. Egal, ob der Taster gedrückt 
ist, oder nicht.

Also die LEDs liegen an P1.5 - P1.7 und der Taster, den ich abfragen 
will an P2.6

Hier mal mein Code dazu:
1
#include <msp430.h>
2

3
#define BUTTON_T   BIT6
4

5
#define LED_GREEN  BIT5
6
#define LED_YELLOW  BIT6
7
#define LED_RED    BIT7
8

9

10
void init(void){
11
  WDTCTL = WDTPW + WDTHOLD;                  
12
  P1DIR |= (LED_GREEN + LED_YELLOW + LED_RED);
13
}
14

15
int main(void) {
16

17
  init();
18

19
  P2DIR &= ~BUTTON_T; // eigentlich nicht nötig, da standardmäßig 0
20
  P2REN |= BUTTON_T; // internen Pulldown aktivieren
21
  P2OUT &= ~BUTTON_T; //eigentlich auch nicht nötig da standardmäßig 0
22

23
  while(1) {
24
    if(P2IN & BUTTON_T){
25
      P1OUT |= LED_GREEN;
26
      P1OUT &= ~LED_RED;
27
    }
28
    else{
29
      P1OUT |= LED_RED;
30
      P1OUT &= ~LED_GREEN;
31
    }
32
  }
33
}

Habe auch schon versucht, statt den Pulldown den Pullup zu aktivieren, 
hat aber auch nichts gebracht...

Hat irgendwer nen Tip für mich?
Gast #3344111
Lesenswert?

Dominik R. schrieb:
> Laut Schaltplan liegen die Taster
> ohne Wiederstand direkt gegen GND. Aber egal, wie ich versuche, die
> Pins, an denen die Taster angeschlossen sind zu initialisieren, ich habe
> immer ein HI auf dem entsprechenden Pin.

Der Taster lässt sich einfach mit einem DMM ausmessen. Genau so die 
Funktion der internen Widerstände.
OP #3344196
Lesenswert?

Also der eine Taster hat offen einen Widerstand von 36kOhm gehen Masse, 
der beim schließen gegen 0 geht (ca. 0,5Ohm), der andere Taster liegt 
offen außerhalb des Messbereichs meines Multimeters (dh. über 2000kOhm) 
und geht beim schließen ebenfalls gegen 0.
Ohne Strom auf der Schaltung liegen beide offen außerhalb des 
Wertebereichs.
Der von mir aktivierte Pulldown scheint also zu funktionieren, oder?

So wirklich weiter hilft mir das allerdings nicht...

Wo liegt jetzt der Fehler?
Gast #3344228
Lesenswert?

Bei den meisten Mikroprozessoren lassen sich die Eingänge, via 
eingebautem pull up, auf einen definierten Pegel (High) ziehen. Der 
außen angeschlossene Taster zieht diesen dann bei Betätigung auf Low.
OP #3344229
Lesenswert?

Ja, so ist ja auch der Plan, aber es funktioniert nicht.
Ich hab schon ohne internen Widerstand, mit Pullup und mit Pulldown 
probiert. Der Pegel scheint immer auf HI zu sein (jedenfalls leuchtet 
die Grüne LED dauerhaft). Ich habe jetzt auch mal den Taster gegen VCC 
gemessen. ohne Widerstand und mit Pullup liegt die Spannung offen und 
geschlossen nur um 0,1V auseinander, mit eingeschaltetem Pulldown ist 
offen auf 0,7V und geschlossen auf 4Volt. Aber die LED leuchtet trotzdem 
konstant... Ich verstehe das nicht!
Gast #3344240
Lesenswert?

Dominik R. schrieb:
> beim schließen gegen 0 geht (ca. 0,5Ohm), der andere Taster liegt
> offen außerhalb des Messbereichs meines Multimeters (dh. über 2000kOhm)
> und geht beim schließen ebenfalls gegen 0.

Dominik R. schrieb:
> mit eingeschaltetem Pulldown ist
> offen auf 0,7V und geschlossen auf 4Volt

Das passt nicht zusammen, oder? Ob die LED leuchtet oder nicht ist erst 
einmal egal. Die Spannungen am Port müssen stimmen. Schau dir den 
Schaltplan an, ob da noch etwas dran hängt.
Gast #3344241
Lesenswert?

Ich kenne den MSP430 nicht, aber von:

> P2REN |= BUTTON_T; // internen Pulldown aktivieren

Pulldown habe ich noch nichts gehört. Wiederspräche aber auch der 
Schaltung mit Tastung nach Masse.

Bei den mir bekannten Prozessoren folgt das Ganze dem Chema:
(Init)Pin = Funktion xy (ev.)
(Init)Pin = Eingang
(Init)Pin = Pull Up (oder Wert = 1)
(Run) Pin auslesen.
Oft unter drei bis vier verschiedenen Registernamen.

Übrigens pulled up müsste sich mit einem Messgerät feststellen lassen. 
Ausnahme: Pin = Output + Output = high bewirkt dasselbe, sollte aber 
nicht getastet werden.
#3344244
Lesenswert?

Benutzt du nicht das MSP430 Launchpad?

Versuch das ganze doch mal Low-aktiv aufzubauen, d.h. du aktivierst 
intern einen Pullup-Widerstand, dann hast du an P2.6 HIGH und wenn du 
den Taster drückst, dann ziehst du den Pin auf Masse, also LOW. Das 
fragst du dann einfach in einer if-Schleife ab, am besten so, dass wenn 
der Pin High ist, die LED aus ist und umgekehrt.

Am besten erstmal ohne Taster, sondern nur mit einer festen Verbindung, 
damit du dann genau siehst, wann Masse an P2.6 liegt und wann nicht.
#3344251
Lesenswert?

Das war glaube ich bisher schon alles richtig.

Hier nochmal der auszug aus dem Manual:


*8.2.4 Pullup/Pulldown Resistor Enable Registers PxREN*
Each bit in each PxREN register enables or disables the pullup/pulldown 
resistor of the corresponding I/O
pin. The corresponding bit in the PxOUT register selects if the pin is 
pulled up or pulled down.
Bit = 0: Pullup/pulldown resistor disabled
Bit = 1: Pullup/pulldown resistor enabled

Wenn du deinen Code den du oben gepostet hast benutzt, dann bedeutet 
das, dass die grüne LED leuchtet, sobald der MC läuft (wenn die 
HIGH-aktiv geschaltet sind, d.h. die Anode an dem Mikrocontroller Pin 
angeschlossen ist).
Wenn du dann P2.6 auf Masse schaltest, würde die rote LED an und die 
grüne LED ausgehen (solange an P2.6 Masse liegt).
Gast #3344260
Lesenswert?

Wie gesagt.

>Ich kenne den MSP430 nicht

Aber das ändert nichts daran, dass ein pull down bei:

>Laut Schaltplan liegen die Taster ohne Wiederstand direkt gegen GND.

sinnlos ist, oder steht etwa "Schaltplanänderung" als Option zur 
Verfügung?
Gast #3344285
Lesenswert?

Du muß das P2SEL Bit für P2.6 noch auf 0 setzen. Das liegt daran, daß 
P2.6 und P2.7 standardmäßig für den Anschluß des externen Quarzes und 
nicht als Eingänge konfiguriert sind. Bei jedem anderen Eingang würde 
Dein Code funktionieren, da sind die P2SEL standardmäßig auf 0, nur bei 
diesen beiden eben nicht.

also noch

P2SEL &= ~BUTTON_T;

dazu, dann sollte es klappen.

Außerdem:

Wenn der Taster an GND liegt, Pullup aktivieren, also:

P2REN |= BUTTON_T;
P2OUT |= BUTTON_T;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren