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