Forum: Mikrocontroller und Digitale Elektronik MSP Taster ansprechen


von Dominik R. (vision)


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?

von erst messen, dann ... (Gast)


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.

von Dominik R. (vision)


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?

von Amateur (Gast)


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.

von Dominik R. (vision)


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!

von erst messen, dann ... (Gast)


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.

von Amateur (Gast)


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.

von W. M. (muhh)


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.

: Bearbeitet durch User
von erst messen, dann ... (Gast)


Lesenswert?

Amateur schrieb:
> Pulldown habe ich noch nichts gehört. Wiederspräche

Der MSP kann Beides: pull up und pull down. Da ist nichts 
widersprüchliches dabei. ;-)

Willy M. schrieb:
> in einer if-Schleife

Was ist das denn? ;->

von W. M. (muhh)


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).

: Bearbeitet durch User
von Amateur (Gast)


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?

von wv (Gast)


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;

von Dominik R. (vision)


Lesenswert?

Super danke. P2SEL auf LOW setzen... darauf muss man erst mal kommen!
Aber jetzt klappt alles.

Nochmal danke!!!

von use datasheet (Gast)


Lesenswert?

Dominik R. schrieb:
> darauf muss man erst mal kommen!

???
Datenblatt Seite 35 und 36!

von Max G. (l0wside) Benutzerseite


Lesenswert?

use datasheet schrieb:
> Dominik R. schrieb:
>> darauf muss man erst mal kommen!
>
> ???
> Datenblatt Seite 35 und 36!

Die MSP430-Doku ist für den Anfänger etwas erschlagend...

Max

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.