MSP430 einen Taster Abfragen

Hallo liebe Experten.
Ich habe ein kleines Problem mit meinem TI-MSP430 Launchpad:
Wenn ich einen Taster mit einer if-Anweisung abfrage, und ich den Taster dann drücke, wird bei der nächsten Abfrage auch wenn man den Taster nicht drückt, wieder gesagt, dass er gedrückt wurde…
Ich kann das schlecht beschreiben, deswegen hier mal den Code:

void main(void){

WDTCTL = WDTPW + WDTHOLD;
P1DIR |= BIT6;
P1DIR |= BIT7;
P1DIR |= BIT5;
P1DIR &= -BIT3;
P1OUT |= BIT3;
P1REN |= BIT3;

P1OUT = BIT0;
for(;:wink:
{
if ( (P1IN & BIT3) == BIT3){
P1OUT = BIT6;
}else{
P1OUT = BIT0;
P1IN & BIT3;
}
}
}

Kann mir jemand dabei helfen? Ich muss das bald haben.

Hallo Knight2000,

das sieht ja schon eher nach einem überschaubaren Problem aus. Eine garantiert funktionierende Lösung kann ich dir auf die Schnelle nicht anbieten aber hier ein paar Anmerkungen:

  • Port-Initialisierung
  • Endlos-Schleife
  • If-Abfrage

Stimmen die logischen Verknüpfungen?
Was ist der Zustand von Bit0?
Was soll P1IN & BIT3 in der letzten Codezeile bewirken?

Ich bin sicher, du wirst hier relativ schnell eine Lösung finden.

Viele Grüße
Michael

Danke für die schnelle Antwort.
Stimmt die letzte Codezeile war nur ein Versuch… Damit wollte ich den Zustand des Tasters wieder auf den Standart setzten… Hat aber nicht funktioniert.
BIT0 schalt den Pin 1.0 auf high, oder bei mir schaltet er damit Pin 1.6 auf low.

Die Ports werden doch initialisiert, oder?
Eine Endlosschleife brauch ich, um den Vorgang zu wiederholen, da der MCU immer bereit sein soll.

Ja, sieht grundsätzlich so weit richtig aus aber ich fürchte, mehr kann ich auch aus der Entfernung nicht sagen. Es ist halt meistens so: Die ersten 90% der Arbeit sind schnell gemacht und für die letzten 10% geht die meiste Zeit drauf. Aber ich bin sicher, du schaffst das noch :wink:

Hallo,

kann dir leider nicht helfen.
Kenne mich mit dem MSP430 nicht aus.

Gruß
Mathias

Da hast du recht… Schade, dass du mir nicht weiter helfen kannst… Im Internet findet man nur, entweder Englische Informationen (Ich kann zwar einigermaßen englisch, aber das ist dann doch zu kompliziert) oder man findet Informationen die ich nicht verstehe^^

Ok. trotzdem vielen dank

MSP430 ist leder nicht mein Spezialgebiet
Bert

Hallo,
ich kenne die Portstruktur des MSP430 zwar nicht, aber ich vermute mal, dass mit

P1REN |= BIT3;

ein Pull-Up-Widerstand geschaltet wird. Damit ist der Portpin immer auf ‚1‘, solange er nicht auf ‚0‘ gezogen wird. Wenn Du jetzt den Taster gegen Vcc geschaltet hast, dann sieht der Controller entweder eine ‚1‘ vom Taster oder eine ‚1‘ vom Pull-Up…

}else{
P1OUT = BIT0;
P1IN & BIT3;

was soll denn diese Zeile hier machen?? Flankenerkennung geht anders…
In Deinem Fall wäre Flankenerkennung so:
if ( (P1IN & BIT3) == BIT3) && Merkerbit{
P1OUT = BIT6;
Merkerbit = 1;
}else{
P1OUT = BIT0;
Merkerbit = P1IN & BIT3;
}

tschuessle
B.

VIELEN, VIELEN, VIELN DANK^^
Hab P1REN |= BIT3;
gelöscht^^ Es funktioniert :smiley:
Endlich

Den Befehl hatte ich aus einem Tutorial -.- Jetzt geht es. Noch eine Frage: Für was würde man den denn brauchen?

Danke noch mal,

Knight2000

Hallo,

Hab P1REN |= BIT3;
gelöscht^^ Es funktioniert :smiley:

Damit ist Dein Taster wohl gegen Vcc geschaltet…

Den Befehl hatte ich aus einem Tutorial -.- Jetzt geht es.
Noch eine Frage: Für was würde man den denn brauchen?

Wenn der Taster gegen Masse schaltet. Dann macht der Pullup eine ‚1‘ und der Taster die ‚0‘. Gibt dann invertierte Logik, aber für Meldeleitungen wird sowas gerne genommen.

tschuessle
B.

Hallo,

was mir auf den ersten Blick auffällt ist im else Zweig die Anweisung:

P1IN & BIT3;

Die macht so ja keinen Sinn, daher lass diese weg. Du weißt das Ergebnis ja auch keinem Register / Variable zu.

Das sollte allerdings nicht das Problem sein. Kannst du es noch etwas genauer beschreiben? Du sagtest, bei der nächsten if Anweisung wird der Taster als gedrückt erkannt, obwohl er nicht mehr gedrückt ist? Hast du mal an das Prellen des Tasters gedacht? Wird der Taster gedrückt und wieder los gelassen, so schwingt er sozusagen noch etwas, da die Mechanik nachprellt und den Kontakt nochmal schließt.

Liebe Grüße,

TheFan

Danke für deine Antwort^^
Aber das Problem hat sich bereits gelöst.

Knight2000

Hallo Knight2000,

was soll denn die Zeile P1IN & BIT3 deiner Meinung nach bewirken?

Ansonsten fällt mir gerade erstmal nur dazu ein, dass du keine Entprellung (einfach mal googlen) vornimmst und es deswegen zu unerwünschten Ergebnissen kommen kann.

Könnte dein Problem vielleicht auch damit zusammenhängen, dass die Schleife zu schnell durchlaufen wird und du mit deinem Finger noch auf dem Taster bist?

Grüße,
Torsten

Danke, aber:
Noch mal an alle:
Das Problem hat sich geklärt. Ich musste den P1REN|=BIT3; Befehl entfernen.

Die letzte Zeile war ein Überbleibsel von einer anderen Codezeile. Sie wurde von mir entfernt.

Aber es ist trotzdem immer schon zu wissen, dass die Fragen hier wirklich gelesen werden^^
MFG,
Knight2000