-         

Ergebnis 1 bis 4 von 4

Thema: Problem mit dem Taster auf der Snake-Platine

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    17.12.2009
    Beiträge
    18

    Problem mit dem Taster auf der Snake-Platine

    Anzeige

    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???

    Code:
    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
    			}
    Angehängte Dateien Angehängte Dateien

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    17.12.2009
    Beiträge
    18
    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...

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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,

    http://www.roboternetz.de/phpBB2/zei...ag.php?t=53559

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    17.12.2009
    Beiträge
    18
    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.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •