-         

Ergebnis 1 bis 10 von 10

Thema: Falsche Tastererkennung?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384

    Falsche Tastererkennung?

    Anzeige

    Moin Moin,

    ich wollte mich jetzt mal an die Taster heranwagen und hab mir ein tolles Labyrinth aus Büchern gebaut. Der Code den ich geschrieben hab funktioniert allerdings nicht so wie er soll. Er soll eigentlich bei allen Tastern auf der linken seite rechtsherum drehen und bei allen tastern auf der rechten Seite linksherum drehen. Allerdings dreht er sich immer rechtsherum, egal welcher taster gedrückt wurde.
    Hier der Code:
    Code:
     #include "asuro.h"
    
    int main(void)
    {
    unsigned char a,b,c;
    
    
       Init();
       
       while(1)
       {
    	a=PollSwitch();
    	b=PollSwitch();
    	c=PollSwitch(); 
    	
        
    	   if ((a==b)&(b==1))
         
        {
    
            StatusLED (YELLOW);
    		MotorDir(RWD,FWD);
    		MotorSpeed(150,80);
          
                         
             Msleep(500);
    	}	
    	
    	else if ((a==b)&(b==2))
         
        {
    
            StatusLED (YELLOW);
             MotorDir(RWD,FWD);
             MotorSpeed(80,80);
                         
             Msleep(500);
    	}
    	
    	else if ((a==b)&(b>=3))
         
        {
    
            StatusLED (YELLOW);
             MotorDir(RWD,FWD);
             MotorSpeed(80,80);
                         
             Msleep(500);
    	}
    	
    	else if ((a==b)&(b>=6))
         
        {
    
            StatusLED (YELLOW);
             MotorDir(FWD,RWD);
             MotorSpeed(80,80);
                         
             Msleep(500);
    	}
    	else if ((a==b)&(b>=12))
         
        {
    
            StatusLED (YELLOW);
             MotorDir(FWD,RWD);
             MotorSpeed(80,80);
                         
             Msleep(500);
    	}
    		else if ((a==b)&(b>=20))
         
        {
    
            StatusLED (YELLOW);
    		MotorDir(FWD,RWD);
    		MotorSpeed(80,80);
          
                         
             Msleep(500);
    	}
    		
    		
    			     
          else
          {
             StatusLED (GREEN);
             MotorDir(FWD,FWD);
             MotorSpeed(120,120);
          }       
       }               
    }

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    31.01.2007
    Ort
    kerken
    Alter
    24
    Beiträge
    69
    hi


    also dein fehler dürfte sein, das du schreibst, >= einmal zum beispiel b>=3 und dannach else if b>=6 kann dann niemals aufgerufen werden, da das zweite ja nur ausgeführt wird, wenn das erste nicht stimmt, dann kann das zweite aber garnicht stimmen.
    Ausserdem musst du glaub ich zumindest zum &-verknüpfen zwei & maschen.

    Du solltest also z.B. schreiben:
    if((a==b)&&(b>=3)&&(b<6)...


    MfG

    Jan

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    macht nichts^^ ich werd mal schauen was bei rauskommt.
    Danke schonmal.
    mfg
    Erik

  4. #4
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Also ich hab weiterhin nicht die logische verknüpfung && sondern einfach nur & verwendet frag mich nicht wieso aber es geht. Hier mein jetziges Programm:

    Code:
      #include "asuro.h"
    
    int main(void)
    {
    unsigned char a,b;
    
    
       Init();
       
       while(1)
       {
    	a=PollSwitch();
    	b=PollSwitch();
    	
        
    	   if ((a==b)&&#40;b==1))
         
        {
    
            StatusLED (RED);
    		BackLED(OFF,ON);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(100,100);
    		Msleep(350);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
    		MotorDir(RWD,FWD);
    		MotorSpeed(100,100);
            Msleep(500);
    	}	
    	
    	else if ((a==b)&&#40;b==2))
         
        {
    
            StatusLED (RED);
    		BackLED(OFF,ON);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(100,100);
    		Msleep(350);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(RWD,FWD);
            MotorSpeed(100,100);
            Msleep(500);
    	}
    	
    	else if ((a==b)&&#40;b==4))
         
        {
    
            StatusLED (RED);
    		BackLED(OFF,ON);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(100,100);
    		Msleep(350);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(RWD,FWD);
            MotorSpeed(100,100);
            Msleep(500);
    	}
    	
    	else if ((a==b)&&#40;b==8))
         
        {
    
            StatusLED (RED);
    		BackLED(ON,OFF);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(100,100);
    		Msleep(350);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(FWD,RWD);
            MotorSpeed(100,100);
            Msleep(500);
    	}
    	else if ((a==b)&&#40;b==16))
         
        {
    
            StatusLED (RED);
    		BackLED(ON,OFF);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(100,100);
    		Msleep(350);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(FWD,RWD);
            MotorSpeed(100,100);
            Msleep(500);
    	}
    		else if ((a==b)&&#40;b>=25))
         
        {
    
            StatusLED (RED);
    		BackLED(ON,OFF);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(100,100);
    		Msleep(350);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
    		MotorDir(FWD,RWD);
    		MotorSpeed(100,100);
            Msleep(500);
    	}
    		
    		
    	 
          else
          {
    		BackLED(OFF,OFF);
    		FrontLED(OFF);
            StatusLED (GREEN);
            MotorDir(FWD,FWD);
            MotorSpeed(120,120);
          }       
       }               
    }
    mfg
    Erik

  5. #5
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.912
    das das geht ist reiner zufall. in anderen konstellationen geht das nicht! ich empfehle dir auf jeden fall das & zu einem && zu ändern. & ist für bitweise manipulationen (die hier zufällig ähnlich den wahrheitswerten sind) und das && ist für wahrheitswerte.

    asuroer: ich habe deinen dreifachpost entfernt. bitte klicke nur EINMAL auf die senden taste, und warte dann ab. manchmal dauerts länger!
    kleinschreibung ist cool!

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Hi damaltor,
    danke für die Erklärung hab den Code auch noch ein wenig verfeinert, was die Msleep zeiten angeht das ganze sieht jetzt so aus.

    Code:
     #include "asuro.h"
     #define WAIT1 	200
     #define WAIT2 	400
     #define SPEED 	100
     #define SPEED2	120 
    int main(void)
    {
    unsigned char a,b;
    
    
       Init();
       
       while(1)
       {
    	a=PollSwitch();
    	b=PollSwitch();
    	
        
    	   if ((a==b)&&(b==1))
         
        {
    
            StatusLED (RED);
    		BackLED(OFF,ON);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(SPEED,SPEED);
    		Msleep(WAIT1);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
    		MotorDir(RWD,FWD);
    		MotorSpeed(SPEED,SPEED);
            Msleep(WAIT2);
    	}	
    	
    	else if ((a==b)&&(b==2))
         
        {
    
            StatusLED (RED);
    		BackLED(OFF,ON);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(SPEED,SPEED);
    		Msleep(WAIT1);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(RWD,FWD);
            MotorSpeed(SPEED,SPEED);
            Msleep(WAIT2);
    	}
    	
    	else if ((a==b)&&(b==4))
         
        {
    
            StatusLED (RED);
    		BackLED(OFF,ON);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(SPEED,SPEED);
    		Msleep(WAIT1);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(RWD,FWD);
            MotorSpeed(SPEED,SPEED);
            Msleep(WAIT2);
    	}
    	
    	else if ((a==b)&&(b==8))
         
        {
    
            StatusLED (RED);
    		BackLED(ON,OFF);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(SPEED,SPEED);
    		Msleep(WAIT1);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(FWD,RWD);
            MotorSpeed(SPEED,SPEED);
            Msleep(WAIT2);
    	}
    	else if ((a==b)&&(b==16))
         
        {
    
            StatusLED (RED);
    		BackLED(ON,OFF);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(SPEED,SPEED);
    		Msleep(WAIT1);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
            MotorDir(FWD,RWD);
            MotorSpeed(SPEED,SPEED);
            Msleep(WAIT2);
    	}
    		else if ((a==b)&&(b>=25))
         
        {
    
            StatusLED (RED);
    		BackLED(ON,OFF);
    		FrontLED(ON);
    		MotorDir(RWD,RWD);
    		MotorSpeed(SPEED,SPEED);
    		Msleep(WAIT1);
    		FrontLED(OFF);
    		BackLED(OFF,OFF);
    		StatusLED(YELLOW);
    		MotorDir(FWD,RWD);
    		MotorSpeed(SPEED,SPEED);
            Msleep(WAIT2);
    	}
    		
    		
    	 
          else
          {
    		BackLED(OFF,OFF);
    		FrontLED(OFF);
            StatusLED (GREEN);
            MotorDir(FWD,FWD);
            MotorSpeed(SPEED2,SPEED2);
          }       
       }               
    }
    mfg
    Erik

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2012
    Beiträge
    7
    Ich beschäftige mich derzeit mit der selben Problematik. Wenn ich deinen Code übernehme, steht bei mir:




    C:\ASURO_src\FirstTry>make all
    set -e; avr-gcc -MM -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c \
    | sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > test.d; \
    [ -s test.d ] || rm -f test.d
    -------- begin --------
    avr-gcc --version
    avr-gcc (WinAVR 20100110) 4.3.3
    Copyright (C) 2008 Free Software Foundation, Inc.
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

    avr-gcc -c -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
    In file included from asuro.h:34,
    from test.c:1:
    c:/winavr-20100110/lib/gcc/../../avr/include/avr/signal.h:36:2: warning: #warning "This header file is obsolete. Use <avr/interrupt.h>."
    test.c: In function 'main':
    test.c:28: warning: implicit declaration of function 'Msleep'
    avr-gcc -mmcu=atmega8 -I. -g -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.o test.o asuro.o --output test.elf -Wl,-Map=test.map,--cref -lm
    test.o: In function `main':
    C:\ASURO_src\FirstTry/test.c:64: undefined reference to `Msleep'
    C:\ASURO_src\FirstTry/test.c:116: undefined reference to `Msleep'
    C:\ASURO_src\FirstTry/test.c:122: undefined reference to `Msleep'
    make: *** [test.elf] Error 1

    > Process Exit Code: 2


    Ich bin totaler Anfänger im Programmieren und weiß leider nicht genau was das bedutet!? könnt ihr mir helfen?

  8. #8
    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

    Du verwendest die Library die auf der CD mitgeliefert wurde. (Library = Die Dateien asuro.h und asuro.c in denen die Einstellung und Grundfunktionen zur Verfügung gestellt werden) Inzwischen wurde diese Lib erweitert und kennt neue zusätzliche Funktionen wie z.B. Msleep(). Alle (im Roboternetz) entwickelte Versionen findest du hier:

    http://sourceforge.net/projects/asuro/files/AsuroLib/

    Ich empfehle die Version 2.3, die ich selbst auch verwende. Das "Update" beschränkt sich auf den Austausch der beiden Lib-Dateien.

    Die aktuelle Library kennt noch einige Funktionen mehr und ist speichersparender, entfernt den Anwender aber weiter von der Hardware als diese einfachen Ur-Libraries:
    http://www.roboternetz.de/community/...l=1#post252982


    Zur "This header file is obsolete. Use <avr/interrupt.h>."-Warnung:

    signal.h wurde inzwischen durch interrupt.h ersetzt. In asuro.h kannst du das anpassen:

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    //#include <avr/signal.h>
    #include <stdlib.h>
    Gruß

    mic
    Geändert von radbruch (02.08.2012 um 12:15 Uhr) Grund: Versionsnummer nach 2.3 geändert und direkt verlinkt

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

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    25.07.2012
    Beiträge
    7
    Vielen Dank für die schnelle Antwort!

    Wenn ich oben genannten link öffne, kann ich lediglich zwischen den versionen 2.1-2,8.0 auswählen. Meintest du vielleicht version 2.3 die zu empfehlen ist?
    Kannst du den letzten Teil etwas genauer beschreiben?
    Vielden Dank und Gruß

    Philipp

  10. #10
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    Upps, selbstverständlich meinte ich Version 2.3. Bitte entschuldige.

    In der Datei asuro.h muss man bei den #define-Zeilen signal.h durch interrupt.h ersetzen.

    Gruß

    mic

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

Berechtigungen

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