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
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.
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?
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.
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!
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.
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.
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.
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? ;->
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).
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?
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;
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