PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Was ist da bitte schön Falsch ???????



FredWeise
09.02.2009, 18:18
Was ist hier bitte falsch.
Der Asuro soll solange gerade aus fahren bis er irgendwo anstöst.

Bei mir fährt der Asuro nur bei Tasterberührung und dann vorwärts.


#include "asuro.h"

void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}

int main(void)
{
Init();


while(1){
if (PollSwitch()==1){
StatusLED(RED);
MotorSpeed(0,0);
Msleep(350);

}
else{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);}

}
return 0;
}

MFG FredWeise

hai1991
09.02.2009, 19:15
hallo, wenn du abfragts if(PollSwitch()==1), dann überprufst du, ob K6 (wenn ich mich nicht irre) gedrückt ist

wenn du wissen willst, ob kein taster gedrückt ist musst du if(PollSwitch()==0) abfragen
und dem entsprechend if(PollSwitch()!=0), wenn du wissen willst, ob irgend ein taster gedrückt ist

weiters würde ich 2mal abfragen, da bei laufenden motoren die auswertung manchmal fehlerhaft is


t=PollSwitch();
if(t==0 && PollSwitch()==0)
{
//deine Anweisungen
}

FredWeise
09.02.2009, 19:40
also so


#include "asuro.h"

void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}

int main(void)
{
Init();

t=PollSwitch();
while(1){
if(t==0 && PollSwitch()==0){

StatusLED(RED);
MotorSpeed(0,0);
Msleep(350);

}
else {
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);}

}
return 0;


Wenn ichs so mache kommt folgende fehlermeldung

Felix.
09.02.2009, 19:49
lies dir mal die fehlermeldung durch. dann wirste deinen fehler finden

orusa
09.02.2009, 20:30
Versuchs mal mit deklarierter Variable t
oder so:

int main(void)
{
unsigned char t1;
unsigned char t2;

Init ();
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1==0 && t1==t2)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
Msleep(350);
}
else
{
StatusLED(RED);
MotorSpeed(0,0);
}
}
while(1);
return 0;
}

orusa
09.02.2009, 20:39
Mist, jetzt sind meine schönen Einrückungen alle rausgeflogen :-(
Gehört zwar sicher nicht hier her, aber kann mir bitte trotzdem jemand einen Tipp geben, wie ich meinen Code so schön formatiert in so ein aufklappbares Codefenster bekomme?

EDIT: hat sich erledigt, habs inzwischen gefunden :-)



int main(void)
{
unsigned char t1;
unsigned char t2;

Init ();
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1==0 && t1==t2)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
Msleep(350);
}
else
{
StatusLED(RED);
MotorSpeed(0,0);
}
}
return 0;
}


Mein letztes while(1); war natürlich völlig überflüssig, weil das Programm ja nie aus der ersten while- Schleife raus kommen kann. Es steht bei mir eben aus Gewohnheit immer vor dem return 0 und ich hab einfach vergessen, es zu löschen.

FredWeise
10.02.2009, 11:29
int main(void)
{
unsigned char t1;
unsigned char t2;

Init ();
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1==0 && t1==t2)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
Msleep(350);
}
else
{
StatusLED(RED);
MotorSpeed(0,0);
}
}
return 0;

Wenn ich das ausprobiere dann kommt folgende Fehlermeldung
(siehe Bild)

Wieso schreibt man eigendlich

if (t1==0 && t1==t2)

Und warum kürzt ir PollSwitch mit t ab was hat das für ein sinn

liggi
10.02.2009, 12:40
du hast vergessen die asuro.h zu inkluden.

mfg liggi

FredWeise
10.02.2009, 12:55
Danke für die schneele Antwort auf das inkluden von asuro.c hätte ich selber drauf kommen sollen

Das Programm sieht richtig also so aus


#include "asuro.h"
void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}
int main(void)
{
unsigned char t1;
unsigned char t2;

Init ();
while(1)
{
t1=PollSwitch();
t2=PollSwitch();
if (t1==0 && t1==t2)
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
Msleep(350);
}
else
{
StatusLED(RED);
MotorSpeed(0,0);
}
}
return 0;
}


Es kommt auch keine Fehlermeldung mehr.
Wenn ich das Prog ausführe fährt der Asuro nur geradeaus (Status LED GREEN) Die Taster interresieren ihn überhaupt nicht

MFG FREDWEISE

PS Ein paar Zeilen im Prog kann ich noch nicht deuten


unsigned char t1;
unsigned char t2;


t1=PollSwitch();
t2=PollSwitch();

Würde mich über eine kurze Erklärung sehr freuen[/quote]

johns
10.02.2009, 13:16
hallo,

als erstes solltest du dir die funktion Pollswitch() noch einmal genauer ansehen (asuro manual abschnitt 9.2.12.). dann solltest du sehen dass im anfangspost der ausdruck
PollSwitch()==1
nicht dann wahr ist wenn irgendein taster gedrückt ist, sondern nur wenn K6 (und kein anderer gleichzeitig) gedrückt ist. der else block (vorwärtsfahrt) sollte also eigentlich entgegen deiner angabe auch ohne drücken eines tasters ausgeführt werden...!?
weiters siehst du dass PollSwitch ein unsigned char als ergebnis liefert, das sollte dich bei den 'letzten unklarheiten im code' weiterbringen.


Wieso schreibt man eigendlich
if (t1==0 && t1==t2)

das ist eine gute frage auf deren antwort ich auch gespannt bin. eigentlich sollte
if (t1==0 && t2==0)
performanter sein. du kannst auch
if (PollSwitch() == 0 && PollSwitch() == 0)
schreiben, dann sparst du dir die (expliziten) variablen.


Und warum kürzt ir PollSwitch mit t ab was hat das für ein sinn
t steht vermutlich kurz für temp, eine beliebte möglichkeit fehleranfälligen code zu provozieren. man sollte besser möglichst aussagekräftige variablennamen wählen um den code möglichst les- und wartbar zu halten. auch ist temp ansich wenig aussagekräftig. trotzdem ist die verwendung von solchen nicht-aussagekräftigen bezeichnern in codeschnipseln eines forumsbeitrags üblich und auch praktikabel, da es sich ja meist um eine überschaubare anzahl an codezeilen handelt.


EDIT:
ich sehe gerade dass der code immer noch nicht funktioniert. und ich hätte da eine vermutung warum das so ist:
da PollSwitch ja beim ersten aufruf (t1) vermutlich einen falschen wert leifert wird PollSwitch ein weiteres mal aufgerufen (t2), was den korrekten wert liefern soll. also können t1 und t2 nur dann gleich sein, wenn beide ergebnisse richtig, oder beide falsch sind, und dem ist offenbar nicht so.
also sollte man so vorgehen:


PollSwitch(); //das erste ergebnis interessiert nicht, da ohnehin falsch
if (PollSwitch() == 0)
{
//...
}

Anmerkung: da ein richtiges ergebnis von PollSwitch vom ladezustand eines kondensators abhängt, kann es laut asuro manual auch mehrere PollSwitch aufrufe benötigen um ein korrektes ergebnis zu erhalten. ggf also so etwas:


for (int i = 0; i < 4; i++)
{
PollSwitch();
}
if (PollSwitch() == 0)
{
//...
}

oder auch so:

PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
if (PollSwitch() == 0)
{
//...
}

lg

FredWeise
10.02.2009, 13:34
Danke johns für die tolle aussagekräftige erklärung
Trotzdem hätte ich noch ein paar Fragen .

Wenn mit PollSwitch nur tASTER K6 abgefragt wird müsste der Befehl

unsigned char

Ja dann auf irgendeine Weise alle taster abfragen



Im handbuch steht :


unsigned char taste;
.
.
taste = PollSwitch();
if (taste>0) {MotorSpeed(0,0);}


Wieso schreiebn die da auf einmal taste (POLLswitch) >0 und nicht ==1

Mfg FREDWEISE

johns
10.02.2009, 14:23
leider war mein post doch nicht so aussagekräftig... ich versuche es noch einmal :)

Pollswitch liefert eine variable vom typ unsigned char zurück.
char bedeutet dass es sich um eine variable welche 256 verschiedene werte aufnehmen kann handelt (8 bit -> 2 hoch 8 möglichkeiten)
unsigned bedeutet dass es sich um werte ohne vorzeichen handelt, also von 0 aufwärts.
unsigned char hat also einen wertebereich von 0 bis 255.
da PollSwitch ein unsigned char liefert und das ergebnis von PollSwitch im obigen code in einer variable gespeichert werden soll, benötigt man eine variable von diesem typ. eine solche deklariert man eben zb so:
unsigned char t1;

und PollSwitch fragt natürlich alle taster ab, das funktioniert so:
da unsigned char eine 8bit variable ist geht diese (binärdarstellung) von
00000000 bis 11111111
wobei die wertigkeit der einzelnen stellen 2 hoch _wievielte_stelle_(von rechts_gezählt_bei_1_beginnend)_ beträgt.
beispiel: 00010011 wäre in dezimal:
2 hoch 5 plus 2 hoch 1 plus 2 hoch 0 =
= 32 + 2 + 1 = 35

bei PollSwitch wird jetzt den einzelnen stellen der binärrepresentation ein taster zugeordent. also im konkreten fall zb der stelle 1 der taster K6.
das bedeutet dass wenn K6 gedrückt ist, die erste stelle (ganz rechts) eine 1 ist. falls nur K6 und kein anderer taster gedrückt ist, dann sieht der rückgabewert von Pollswitch binär so aus: 00000001 was dezimal einer 1 entspricht. wenn aber zusätzlich zu taster K6 ein weiterer taster gleichzeitig gedrückt ist, dann könnte das so aussehen: 00010001 was dezimal 33 ist.
da sobald mindestens ein taster gefrückt is, im rückgabewert von PollSwitch auch für jeden taster an der zugehörigen stelle der binärdarstellung eine 1 ist, ist der rückgabewert dann immer grösser 0, und umgekehrt ist der rückgabewert genau dann 0, wenn kein einziger taster gedrückt ist (alle 8 bit des unsigned char wertes sind 0).
daher kann man mittels vergleichsrelation (grösser; >) feststellen ob mindestens irgendein taster gedrückt ist!

war das verständlich genug?

lg

FredWeise
10.02.2009, 15:09
Vielen Vielen Vielen Dank
Das war sehr ausführlich

Also müsste das Prog doch dann so aus sehen


#include "asuro.h"
void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}
int main(void)
{
unsigned char t1;
unsigned char t2;
unsigned char t3;
unsigned char t4;
unsigned char t5;
unsigned char t6;

Init ();
while(1)
{

if (PollSwitch()>0)
{
StatusLED(RED);
MotorSpeed(0,0);
}
else
{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
Msleep(350);
}
}
return 0;

Und das funktioniert auch Danke Danke Danke

MFG FredWeise

Wsk8
10.02.2009, 15:34
Hi,
unsigned char t1; ...... usw. musst du nur schreiben wenn du t1 usw. auch zuordnest. Z.B. t1 = Pollswitch();
wenn du nur Pollswitch() verwendest musst du nichts deklarieren.

Zu Pollswitch();:
Alle Taster sind an einem ADC mit verschiedenen widerständen angeschlossen. Pollswitch liest diesen ADC aus. Je nach gedrücktem Taster bekommst du einen anderen Wert. Taster 1=1, Taster 2 = 2, Taster 3 = 4, Taster 4 = 8, Taster 5 = 16, Taster 6 = 32.
Wenn du sagst if (Pollswitch() == 1) dann heist das, dass er nur etwas ausführt wenn Taster 1 gedrückt wurde, wenn ein anderer gedrückt wurde interessiert das den controller nicht, den diese liefern nicht 1, sondern was anderes.

Zu deinem Code:
Wenn du einen Taster drückst wird er stehen bleiben, aber nur wenn er gedrückt ist, sobald du ihn auslässt fährt er vorwärts. Das Msleep(350) brauchst du nicht.

mfg

hai1991
10.02.2009, 16:01
hallo

also es bringt nichts wenn du die variablen t1-t6 definierts (dh. speicherplatz zur verfügung stellst und nichts damit anfangst

wenn du etwas in einer variable speichern willst musst du eine zuweisung machen zb. t1=PollSwitch();
danach kannst du sie weiter verwenden und ihren wert abfragen if(t1>0), um zu überprüfen ob irgend ein taster gedrückt ist

und noch eine kleinigkeit zur tasterabfrage: es muss nicht immer der 1. wert falsch sein, aber die wahrscheinlichkeit, dass 2mal hinter einander der selbe falsche wert kommt, wird häufing die doppelte abfrage verwendet. wenn man auf nummer sicher gehen will kann man auch noch öfter die ergebnisse vergleichen, aber das ist meistens nicht notwendig

nun aber wieder zu deinem programm:
hier mein vorschlag mit komentaren, wie ich es machen würde


#include "asuro.h" //include
void Msleep(int dauer) //funktion zum eingeben einer wartezeit in ms
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}


int main(void)
{
unsigned char t1; //variablen zum abspeichern der tasterwerte
unsigned char t2;

Init (); //initialisierung
while(1) //endlosschleife
{
t1=PollSwitch(); //tasterwerte in die variablen speichern
t2=PollSwitch();
if (t1==t2 && t1==0) //erst prüfen, ob beide werte gleich sind, dann ob KEIN taster drückt ist
{ //falls kein taster gedrückt ist: vorwährts fahren
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);
Msleep(350); //350ms bis zur nächsten auswertung warten (könnte auch weg gelassen werden)
}
else if(t1==t2 && t1!=0) //wenn beide taster den geichen wert haben und ein taster gedrückt ist
{ //stehen bleiben
StatusLED(RED);
MotorSpeed(0,0);
}
else //wenn nichts zutrifft, dh. t1 und t2 nicht den selben wert haben
{} //soll nichts gemacht werden, so dass er sofort wieder zur tasterabfrage kommt

}
return 0;
}


so müsste es eigentlich funktionieren, ich habe es aber nicht getestet

ich hoffe es ist jetzt alles klar mit den variablen und der tasterabfrage

FredWeise
10.02.2009, 16:36
Ja ich habe alles verstanden Danke

MFG FredWeise

ghostkai
14.02.2009, 17:27
ich kenn mich damit nich so gut aus weil ich zwölf bin aberversuchs ma damit

#include "asuro.h"

void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}

int main(void)
{
Init();


while(1){
if (PollSwitch()==1){
StatusLED(RED);
MotorSpeed(4,0);
Msleep(350);

}
else{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED(GREEN);}

}
return 0;
}

radbruch
14.02.2009, 18:05
Wo hast du das denn geklaut?

if (PollSwitch()==1){

Nur wenn K6 gedrückt?

MotorSpeed(4,0);

Erfahrungswerte? Welche MotorDir() wollen wir denn hier?

Diesen Beitrag hättest du dir sparen können. Auch Zwölfjährige sollten vor dem Posten denken!

tom(geppel)
16.02.2009, 18:35
Sei bite nicht so streng zu uns loops^^^, aller anfang ist schwer!!!!


MgG
bin 13