PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Falsche Tastererkennung?



sloti
12.12.2007, 18:41
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:

#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);
}
}
}

asuroer
12.12.2007, 19:04
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

sloti
12.12.2007, 19:46
macht nichts^^ ich werd mal schauen was bei rauskommt.
Danke schonmal.
mfg
Erik

sloti
12.12.2007, 20:10
Also ich hab weiterhin nicht die logische verknüpfung && sondern einfach nur & verwendet frag mich nicht wieso aber es geht. :) Hier mein jetziges Programm:



#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

damaltor
12.12.2007, 20:39
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!

sloti
12.12.2007, 20:51
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.



#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

Philipp2195
25.07.2012, 16:58
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?

radbruch
25.07.2012, 17:32
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 (http://sourceforge.net/projects/asuro/files/AsuroLib/asuro%20lib%20V2.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:
https://www.roboternetz.de/community/threads/26974-Die-wichtigsten-Dateien-Quellcodes-Downloads?p=252982&viewfull=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:


#include <avr/io.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
#include <stdlib.h>

Gruß

mic

Philipp2195
02.08.2012, 10:13
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

radbruch
02.08.2012, 11:13
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