Forum: Mikrocontroller und Digitale Elektronik MSP430 PIN-Abfrage immer True


von mwstui (Gast)


Lesenswert?

Hallo Forum,

ich hab momentan ein Problem mit der Abfrage eines Pins am MSP430.

Meine Abfrage:
1
if(P1IN & BIT3)
2
{
3
    Do1();
4
} else
5
{
6
    Do2();
7
}

An P1.3 liegen dabei 4V oder 0V an. In beiden Fällen wird aber die 
Funktion Do1() ausgeführt.

Weiß jemand wo das Problem liegt?

-mwstui

von Karol B. (johnpatcher)


Lesenswert?

Du solltest vielleicht einmal den gesamten Quellcode (bzw. ein minimales 
noch (bzw. nicht mehr) "funktionierendes" Beispiel) posten, insbesondere 
also inkl. der Initialisierung, und wo genau im Code deine Abfrage 
stattfindet. I.d.R. geht bei Vereinfachungen, so wie du sie oben 
durchgeführt hast, nämlich einiges schief.

Mit freundlichen Grüßen,
Karol Babioch

von mwstui (Gast)


Lesenswert?

Hi Karol,

wo es "noch" lief.. naja, wenn Do1() oder Do2() einzeln ablaufen...

der Quellcode mit Initialisierung:
1
//INIT:
2
  P1OUT &= 0x00;        // Shut down evrything
3
  P1DIR &= 0x00;        // evrything is a input
4
5
  P1IE  |= BIT1 + BIT2;    // P1.1/.2 interrupt enabled
6
  P1SEL &= ~BIT1 + ~BIT2;    // P1.1/.2 Selected
7
8
  P1REN |= BIT1 + BIT2;    // Enable internal pull-up/down resistors
9
  P1OUT |= ~BIT1 + ~BIT2;    // Select pull-downmode for P1.1/.2 (PD == BitX = 0; PD--> Defaultwert = 0; PU = 1)
10
  P1IES |= 0x00;        // P1.1/P1.2 Lo/Hi-edge
11
12
  P1IFG &= ~BIT1;        // P1.1 IFG cleared (Interrupt Flag Register -> reports when an interupt os raised)
13
                //-->should be cleard at the end of a ISR
14
  P1IFG &= ~BIT2;
15
16
//Quest:
17
if(P1IN & BIT3)
18
{
19
    Do1();
20
} else
21
{
22
    Do2();
23
}

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


Lesenswert?

Wie sind BIT1...3 definiert?

von schrieb (Gast)


Lesenswert?

Wie wird bei P1.3 der Pegel erzeugt? Es gibt daran keinen 
Pull-Widerstand.

Um welchen µC geht es genau. Nicht das da eine alternate function aktiv 
ist.



mwstui schrieb:
> P1IE  |= BIT1 + BIT2;
und so ein Mischmasch ist nicht schön, besser
  P1IE  |= BIT1 | BIT2;

Wenn mehr als ein Bit dahinter stecken, geht 's in die ...

von wv (Gast)


Lesenswert?

>> P1IE  |= BIT1 + BIT2;
>und so ein Mischmasch ist nicht schön, besser
>  P1IE  |= BIT1 | BIT2;

was in diesem Fall noch egal wäre, es ist lediglich besserer Stil. Aber 
richtig grob wirds dann in der nächsten Zeile:

>P1SEL &= ~BIT1 + ~BIT2;    // P1.1/.2 Selected

sicherlich möchte der TO hier die beiden select-Bits auf Null setzen, 
aber:

 BIT1: 00000010
~BIT1: 11111101

 BIT2: 00000100
~BIT2: 11111011

       11111101
      +11111011
      ---------
     =111111000

mit &= auf einen 8bit Port geschrieben werden die letzten drei Bits auf 
Null gesetzt. P1SEL steht aber nach dem Einschalten sowieso auf 0, also 
kann man die Zeile auch einfach weglassen.

>P1OUT |= ~BIT1 + ~BIT2;    // Select pull-downmode for P1.1/.2(PD =  BitX = 0; 
PD--> Defaultwert = 0; PU = 1)

hier wieder der gleiche Fehler, auch hier könnte man die Zeile 
weglassen, da P1OUT = 0 nach dem Reset.

Die Interrupt-Enable-Register-Bits braucht man auch nicht setzen, da 
hier die Interrupts garnicht mit einer Interrupt-Routine behandelt 
werden, es wird ja nur der P1IN in der Hauptroutine abgefragt, das hat 
mit Interrupts nichts zu tun.

Die Hauptroutine wird hier aber in ein paar Microsekunden nur einmal 
durchlaufen, dann endet das Programm im Exit-Status. Die Abfrage sollte 
in einer while(1) Schleife stehen.

Sind die Schalter gegen +VCC geschaltet(wegen Pulldown)?

Ach nochwas: die Pulldown - Widerstände sind für P1.1 u. P1.2 aktiviert, 
abgefragt wird aber P1.3, da wird also wahrscheinlich nichts passieren, 
außer da ist ein externer Widerstand dran, also bitte mal mit ein paar 
Strichen die "Schaltung" aufmalen.

Gruß wv

von mwstui (Gast)


Lesenswert?

Lothar Miller schrieb:
> Wie sind BIT1...3 definiert?

Hallo Lothar, beim MSP430 wird bei einer Zeile wie PXIn/Out & BitY 
wirklich PX.Y angesprochen. Die Definition kommt daher von TI selbst.

schrieb schrieb:
> Wie wird bei P1.3 der Pegel erzeugt? Es gibt daran keinen
> Pull-Widerstand.

Direkt von der USB-Verbindung über einen 1k Widerstand.

wv schrieb:
> Die Interrupt-Enable-Register-Bits braucht man auch nicht setzen, da
> hier die Interrupts garnicht mit einer Interrupt-Routine behandelt
> werden, es wird ja nur der P1IN in der Hauptroutine abgefragt, das hat
> mit Interrupts nichts zu tun.

Stimmt, aber es werden auch nicht die P1.1 bzw. P1.2 abgefragt, die 
werden tatsächlich in einer ISR behandelt. Angegeben habe ich nur einen 
Ausschnitt aus der Initialisierung und der betreffenden Abfrage meines 
Quellcodes, durch den ganzen wird wohl keiner mehr Lust haben sich 
durchzuwurschteln.

wv schrieb:
> Sind die Schalter gegen +VCC geschaltet(wegen Pulldown)?
Ja, das sind sie.

wv schrieb:
> Ach nochwas: die Pulldown - Widerstände sind für P1.1 u. P1.2 aktiviert,
> abgefragt wird aber P1.3, da wird also wahrscheinlich nichts passieren,
> außer da ist ein externer Widerstand dran, also bitte mal mit ein paar
> Strichen die "Schaltung" aufmalen.

Ein 1k Widerstand.

Danke bis hierhin
-mwstui

von mwstui (Gast)


Lesenswert?

Sorry für den Doppelpost, aber ich hab gerade eine "halbwegslösung" 
Lösung gefunden, bzw. damit auch das Problem:

Ich benutzte nun einen Integer 'mode' als Flag und Frage vor der 
Hauptschleife seinen Wert ab, in der Hauptschleife, bei der hier 
gezeigten If-Abfrage, setze ich den Integer als Wahrheitswert (ok, ein 
bool würde es dafür allein auch tun, aber so kann ich noch bisschen was 
mit dem Flag anstellen). So Funktioniert das ganze. PullDown habe ich 
auch gesetzt, allein reicht das aber nicht aus. Es scheint (trotz 
anderer Messwerte) irgendein Fehler in meiner Schaltung zu geben der 
eine statische Aufladung an den Pin erzeugt welches mir dann den Fehler 
"schenkt".

Aber so geht das ganze (es ist kein Schalter, sondern nur eine Prüfung 
ob der Strom aus der USB-Buchse oder einer Batterie kommt) erstmal.

von wv (Gast)


Lesenswert?

>Direkt von der USB-Verbindung über einen 1k Widerstand.

ist etwas mutig, der MSP430 verträgt keine 5V auf den Eingängen. Besser 
wäre ein richtiger Spannungsteiler 5V : 3,3V.

Wenn die Abfrage vor der Hauptschleife kommt, dann teste mal eine 
Warteschleife vor der Abfrage.

Gruß wv

von qwertz (Gast)


Lesenswert?

>  P1IE  |= BIT1 + BIT2;    // P1.1/.2 interrupt enabled
Nicht schön. Wenn es um Bits geht, sollte Bitoperationen benutzt werden

>  P1SEL &= ~BIT1 + ~BIT2;    // P1.1/.2 Selected
Auch hier gilt, wenn es um Bits geht, sollte Bitoperationen benutzt 
werden
Was bei der Addition rauskommt hat wv ja bereits entschlüsselt.

Grundsätzlich möglich wäre:
>  P1SEL &= ~(BIT1 + BIT2);

Aber die bevorzugte Schreibweise ist:
>  P1SEL &= ~(BIT1 | BIT2);

von Helper (Gast)


Lesenswert?

läuft auf einem G2553 ohne Probleme:
1
#include "io430.h"
2
3
void Do1 (void)
4
{
5
  static int foo11; 
6
  foo11++;
7
}
8
9
void Do2 (void)
10
{
11
  static int foo22; 
12
  foo22++;
13
}
14
15
int main( void )
16
{
17
  WDTCTL = WDTPW + WDTHOLD;
18
19
  while (1)
20
  {
21
    if(P1IN & BIT3)
22
    {
23
      Do1();
24
    } else
25
    {
26
      Do2();
27
    }
28
  }
29
30
  return 0;
31
}

von Klaus R. (klara)


Lesenswert?

mwstui schrieb:
>> Wie wird bei P1.3 der Pegel erzeugt? Es gibt daran keinen
>> Pull-Widerstand.
>
> Direkt von der USB-Verbindung über einen 1k Widerstand.

Ja das war es dann wohl für den MSP430.
mfg klaus

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

mwstui schrieb:
> P1OUT &= 0x00;        // Shut down evrything
> P1DIR &= 0x00;        // evrything is a input


Hier ist &= lediglich eine stilistische Unschönheit (sauberer, weil den 
Sachverhalt darstellend, wäre ein einfache Zuweisung mit =).

Aber das hier

> P1IES |= 0x00;        // P1.1/P1.2 Lo/Hi-edge

macht nicht das, was erwartet wird. Es verändert den Inhalt von P1IES 
nämlich überhaupt nicht.

Und daß

> P1SEL &= ~BIT1 + ~BIT2;    // P1.1/.2 Selected

und

>  P1OUT |= ~BIT1 + ~BIT2;    // Select pull-downmode for P1.1/.2

daneben sind, das wurde ja bereits erwähnt.

von mwstui (Gast)


Lesenswert?

Klaus Ra. schrieb:
> Ja das war es dann wohl für den MSP430.

Nein, das funktioniert, du kannst auch 5V direkt anlegen, solange der 
Strom unterhalb von (ich glaube) 6 mA bleibt ist alles i.o.

Helper schrieb:
> läuft auf einem G2553 ohne Probleme

Sollte es auch, das Problem lag ja auch nicht an der SW sondern an einer 
statischen Aufladung. Ein externer Pulldown (47k) behebt das Problem.

@Rufus & quertz,

ist ja schon geändert, ich hatte das von jemanden übernommen.
Und ich muss auch sagen, im Studium wurde mir immer beigebracht das man 
auch Zustände die Anfangs eigentlich feststehen nochmal definiert setzen 
soll. Das hilft einem später (wenn man sich nach einigen Monaten seine 
Arbeit nochmal anschaut) oder einer anderen Person die Vorgänge zu 
verstehen und vermeidet Fehler durch irgendwelche "Späße" die durch 
statische Ladungen oder "ungewollte/ unbeabsichtigte" Signale entstehen.

wv schrieb:
> Wenn die Abfrage vor der Hauptschleife kommt, dann teste mal eine
> Warteschleife vor der Abfrage.

Dann tritt das Problem wieder auf... Ich weiß aktuell nicht genau wo das 
Problem herkommt, aber die gefundene Lösung reicht vollkommen aus.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

mwstui schrieb:
> Nein, das funktioniert, du kannst auch 5V direkt anlegen, solange der
> Strom unterhalb von (ich glaube) 6 mA bleibt ist alles i.o.

Das ist Pfusch. Nur ganz wenige MSP430 haben 5V-tolerante Eingänge, die 
'G2xx-Reihe definitiv nicht. 6 mA sind mehr als ausreichend, um einen 
kompletten MSP430 mit Strom zu versorgen. Wenns ein paar µA wären, 
könnte man vielleicht noch drüber weg sehen.

Was spricht gegen einen einfachen Spannungsteiler? Ist Dir der zweite 
Widerstand zu viel?

von Perfektionist (Gast)


Lesenswert?

mwstui schrieb:
> Ich weiß aktuell nicht genau wo das
> Problem herkommt, aber die gefundene Lösung reicht vollkommen aus.

Au Backe!

von mwstui (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Das ist Pfusch. Nur ganz wenige MSP430 haben 5V-tolerante Eingänge, die
> 'G2xx-Reihe definitiv nicht. 6 mA sind mehr als ausreichend, um einen
> kompletten MSP430 mit Strom zu versorgen. Wenns ein paar µA wären,
> könnte man vielleicht noch drüber weg sehen.

Ich benutze einen MSP430 F2410, der hat 5V Tolerante Eingänge, ein 
anderer Gast benutzt einen G2xx. Die Stromversorgung für die MCU hat nun 
auch nicht unbedingt etwas mit den maximalen Eingangsstrom in die MCU zu 
tun. Das musst du auseinanderhalten.

Rufus Τ. Firefly schrieb:
> Was spricht gegen einen einfachen Spannungsteiler? Ist Dir der zweite
> Widerstand zu viel?

Es ist einfach nicht nötig, es wäre auch denkbar einen höheren 
Vorwiderstand (2k) zu verwenden damit mehr Spannung über diesen abfällt. 
Das hätte sogar den Vorteil das der Strom sich ebenfalls (knapp) 
halbieren würde und somit die Gesamtstromaufnahme sinkt.

@Perfektionist,
So ist das nunmal. Warum soll man Stunden für die Suche nach der 
"perfekten" Lösung suchen wenn es eine Lösung die man nach wenigen 
Minuten fand auch tut?

von Perfektionist (Gast)


Lesenswert?

mwstui schrieb:
> wenn es eine Lösung die man nach wenigen
> Minuten fand auch tut?

mwstui schrieb:
> Ich benutzte nun einen Integer 'mode' als Flag und Frage vor der
> Hauptschleife seinen Wert ab, in der Hauptschleife, bei der hier
> gezeigten If-Abfrage, setze ich den Integer als Wahrheitswert (ok, ein
> bool würde es dafür allein auch tun, aber so kann ich noch bisschen was
> mit dem Flag anstellen).

Das nennst du Lösung? Du musst damit ja kein Geld verdienen, oder?

von mwstui (Gast)


Lesenswert?

Perfektionist schrieb:
>
> Das nennst du Lösung? Du musst damit ja kein Geld verdienen, oder?

Ja, nenn ich. Und: Nein, noch nicht.

von Perfektionist (Gast)


Lesenswert?

mwstui schrieb:
> Nein, noch nicht.

Wirst du so auch nicht.

von mwstui (Gast)


Lesenswert?

Perfektionist schrieb:
> Wirst du so auch nicht.

Glaub ich weniger, aber jemand der hier noch keinen konstruktiven 
Beitrag geleistet hat wird das bestimmt besser wissen...

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.