PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit dem Taster auf der Snake-Platine



Zehplusplus
11.04.2010, 19:02
Ich habe ein Problem mit dem Taster auf der Snake-Platine. Zur Absicht: Ich möchte 2 Betriebsarten (Vor der Wärmequelle flüchten, und ihr folgen) einrichten, die vor dem Abarbeiten des Programmes über die Kollisionstaster eingegeben werden (jeder Taster steht für ne Betriebsart) und mit dem Taster der Snake-Platine bestätigt werden. Dafür benutze ich eine Funktion, deren Quellcode ich angehängt habe. Diese funzt aber nicht, deshalb hab ich sie mal aufs simpelste zerlegt. Sie soll jetzt bei gedrücktem Taster ( if ((PIND&(1<<6))==1) ) die linke BackLED anmachen, bei nicht-gedrücktem Taster (if ((PIND&(1<<6))==0) ) die rechte. Wird ein Kollisionstaster gedrückt, werden beide ausgemacht. Der Asuro arbeitet allerdings folgendes ab:
Bei gedrücktem Taster macht er nicht, wie verlangt, die Linke an, sondern die Rechte. Bei gedrücktem Kollisionstaster macht er sie aus (braver Asuro).
Bei nicht gedrücktem Taster (und dieser Zustand herrscht zu Beginn der Schleife) leuchtet keine der beiden LED. Und diese Schleife wird auch NIE abgearbeitet!
Mysteriös, kann mir einer helfen???


int Betriebsart(int b) //ACHTUNG, was passiert, wenn keine Betriebsart ausgewählt wird, aber der Taster gedrückt wird???
{
int a,x,Taster;
for (x=0; x< 999; x++) //diese Schleife steht, um durch die rote LED zu signalisieren,
{ //dass der Prozessor die Schleife überhaupt abarbeitet
StatusLED(RED);
Sleep(216);
}
while (Taster==0) //solange der int Taster null ist, (und er ist es verdammt lange,
{ //diese Schleife abarbeiten
if ((PIND&(1<<6))==1) //falls der Schalter der Snake-Platine gedrückt ist, //Mit dem Taster der Snakeplatine wird hierdurch die Betriebsart bestätigt, um eine Korrektur der Wahl...
{ //... zu gewährleisten. Weiter wird verhindet, dass der Kollisionstaster noch gedrückt ist, wenn ins Programm gesprungen wird
BackLED(ON,OFF); //... die linke BackLED anschalten
}
if ((PIND&(1<<6))==0) //falls der Schalter nicht gedrückt ist,
{
BackLED(OFF,ON); //die rechte on
}
// BackLED(OFF,OFF);

a=PollSwitch(); //falls einer der Kollisionstaster gedrückt wird, //Bit0(1) Taster 6, Bit 5 (32) =Taster1
if (a!=0)
{
BackLED(OFF,OFF); //die BackLED`s wieder ausschalten
}

Zehplusplus
11.04.2010, 19:04
PS kann mir ergänzend einer erklären, wie ich den Quellcode anhängen kann, sodass ihr euch nicht die txt-file runterladen müsst? bin da scheinbar bissl doof...

radbruch
11.04.2010, 19:22
Hallo

Ich habe deinen Quellcode in einem Code-Tag eingefügt, aber nicht wirklich überprüft. Die Ursache für dein Problem steckt wohl hier:

if ((PIND&(1<<6))==1)

(1<<6) ist 0b01000000 oder 64, bei gesetztem Eingang PD6 ist das Ergebniss von PIND & 64 genau 64. Ein Vergleich mit 1 ist deshalb immer false.

Wie gewünscht wird das aber trotzdem nicht funktionieren, weil der Snaketaster doch gegen GND schaltet, der Eingang also low ist, wenn der Taster gedrückt wird:

if ((PIND&(1<<6))==0) //falls der Schalter nicht gedrückt ist,

https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=53559

Gruß

mic

Zehplusplus
11.04.2010, 19:44
Oh mann, hab da einen Hänger gehabt, klar, der Schalter is gegen Masse geschaltet.
Bzgl. des false Wertes bei if ((PIND&(1<<6))==1), hab jetzt ungleich " !=0 " eingefügt, und es funzt. Jetz gehts weiter zum nächsten PRoblem ;) Danke dir.