-
ja genau dass will ich ja !
aber nach einem mal aufrufen ist sense !
und wenn ich es anders mache wird es immer aufgerufen !?!?!?!?!
gibt es irgendwelche andere funktionen die switch beeinflussen könnten ?
ich hab schön langsam alle mir erdenklichen varianten durch ?!?!
-
@bloodyDragon
Dein Programm wartet nicht auf das loslassen des Tasters um dann wieder auf das Drücken zu warten.
Eventuell hilft folgendes:
Code:
StartSwitch();
while(1) {
PrintInt(switched);
if(switched == TRUE) { // Tastendruck
t1 = PollSwitch();
t2 = PollSwitch();
PrintInt(t1);
PrintInt(switched);
SerPrint ("\n\r");
while (switched == TRUE) {
switched = FALSE;
StartSwitch();
Sleep (10); // muesste ueberfluessig sein
}
}
}
oder 'logisch' lesbarer:
Code:
switched = FALSE;
StartSwitch();
while(1) {
while (switched == FALSE)
; // warte auf druecken
t1 = PollSwitch();
t2 = PollSwitch();
PrintInt(t1);
SerPrint ("\n\r");
while (switched == TRUE) { // warte auf loslassen
switched = FALSE;
StartSwitch();
Sleep (10); // muesste ueberfluessig sein
}
}
Der sleep in der inneren while-Schleife hat nichts mit dem oben angesprochenen warten zu tun. Hab ich nur mal vorsichtshalber da hingeschrieben, da ja auch der Interrupt Zeit braucht bis er die switched-Variable gesetzt hat.
Das 'PrintInt(switched);' habe ich mal entfernt, da ich glaube, dass du das nur zum testen eingebaut hast.
-
ahh danke !
eine frage noch ..
gibt es eine möglichkeit das ganze ohne poiling zu realisieren ?
( ich habe alles in state machines realisiert )
und wenn mein asuro an die wand gefahren ist sollte er sofort wieder zurückfahren oder ? )
-
0switched 4
0switched 1 // nach dem einschalten
0switched 4
0switched 1
11switched 2 // taste eins gedrückt
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1 // schon seit langem taste ausgelassen ..
1switched 3
1switched 1
1switched 3 // wtf ?
1switched 1
Code:
void tastenCheck(void)
{
static unsigned char pressed = 0;
unsigned int t1,t2;
PrintInt(switched);
SerPrint("switched 1 \n\r");
if(switched == TRUE && pressed == 0) { // Tastendruck
pressed = 1;
t1 = PollSwitch();
t2 = PollSwitch();
taste = (t1+t2+1)/2;
PrintInt(taste);
PrintInt(switched);
SerPrint("switched 2 \n\r");
}
if(pressed == 1 && switched == TRUE) {
StopSwitch();
switched == 0;
PrintInt(switched);
SerPrint("switched 3 \n\r");
}
if(switched == 0) {
pressed = 0;
StartSwitch();
PrintInt(switched);
SerPrint("switched 4 \n\r");
}
}
kann mir jemand erklären wo der fehler liegt ?
es ist nichtmehr meine ursprüngliche static versuchsvariante da ich herumprobiert habe
.. das ergebnis war immer das selbe ?!?!
whats wrong ?
-
Hab den Code nur Überflogen, glaube es ist die Zeile:
if(pressed == 1 && switched == TRUE) {
StopSwitch();
switched == 0; <---------------------------------da
-
thx ^^
immer wieder die noobie fehler oO
yehaaaa das GEHT :D:D:D
ich hab die letzte if jetzt noch an den anfang gestellt
ändert eigentlich nix und es gibt fix keine probs mit startswitch()
0switched 1
0switched 4
0switched 1
0switched 4
0switched 1
0switched 4
321switched 2
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
1switched 3
1switched 1
0switched 3
0switched 1
0switched 4
0switched 1
Code:
void tastenCheck(void)
{
// Switched 1
static unsigned char pressed = 0;
unsigned int t1,t2;
if(switched == FALSE) {
pressed = 0;
StartSwitch();
// Switched 4
}
if(switched == TRUE && pressed == 0) { // Tastendruck
pressed = 1;
t1 = PollSwitch();
t2 = PollSwitch();
taste = (t1 > t2) ? t1:t2;
// Switched 2
}
if(pressed == 1 && switched == TRUE) {
// Switched 3
switched = FALSE;
StartSwitch();
}
}
ich kann mich täuschen aber es wäre vl praktisch eine leserlichere version hiervon bei der dokumentation von der asurolibary zuzufügen...
( als anfänger ( wie ich *g* ) vergisst mann schnell mal dass eine taste auch bei einem mal drücken mehrmals abgefragt wird )
naja .. nur ein vorschlag =)
-
@bloodyDragon: Freut mich, dass das Prinzip funktioniert.
Nepi hat deinen Fehler ja schon gefunden. (Und ich sehe gerade, dass du es schon umgebaut hast)
Mit dem Polling ist das so eine Sache.
Zum einen wird dein Hauptprogramm ja immer die berühmte while(1)-Schleife haben in der alles zum leben des Asuros getan wird.
Innerhalb dieser Haupt-Schleife prüfst du mit deiner Funktion tastenCheck() die Tasten. Das Ergebnis steht dir ja danach in der globalen Variable taste zur verfügung. (Bestimmt startes du darüber die Motoren um mal ein Stück geradeaus zu fahren.)
Wenn du zum Fahren z.B. die Funktion Go() aus der Lib (dank an stochri für die Funktion) benutzt, wirst du jetzt Pech haben mit den Tasten.
Die Go()-Funktion kommt nämlich erst dann in deine Haupt-Schleife zum nächsten Tastenlesen zurück, wenn die komplette Strecke gefahren wurde.
Hier wäre es nun deine Aufgabe die Go()-Funktion auch noch in eine Status-Maschine umzubauen, so dass auch sie zurückkommt nachdem sie sich z.B. 'nur' mal eben um das Geradeausfahren gekümmert hat. Ein weiterer Status in der Funktion müsste dann natürlich auch noch das erfolgreiche Abfahren der gewünschten Strecke anzeigen und bearbeiten.
Wäre bestimmt eine interessante Lösung für die Lib. Dann aber bitte auch gleich für die Turn()-Funktion ;-)
Falls du nicht Go() und/oder Turn() benutzt, würde es mich (und die anderen Helfer bestimmt auch) sehr stark interessieren was du bis jetzt komplett programmiert hast. Da bekommt man dann doch eher eine Übersicht was du so treibst und wo dann evl. geholfen werden kann.
-
Die Go() funktion habe ich kopiert und in eine state machine umgewandelt
wenn meine drive funkion das 1. mal aufgerufen wird wird sie mit den benötigten werten initialisiert ( hat auchnoch den vorteil dass ich die standardabweichung der motoren von anfang an großteils korrigiert habe ) und fährt solange gerade aus bis eine andere funktion aufgerufen wird
turn habe ich auch in einer state machine variante aber bei mir dreht sich nur ein rad
^^ ich erkläre mich gerne bereit die turn und go umzubauen
vermutlich mache ich dann eine LoadGo und eine LoadTurn
mit der man die distanz und speed bestimmen kann .
naja ich bin momentan bei 1120 zeilen code :D
iss schon einiges mittlerweile und da ich am samstag fertig sein sollte und momentan meine i2c_modis aus irgendeinem grund nicht genau so machen wie ich möchte hab ich etwas stress -> wenn ich das machen soll/kann/darf mach ichs nächste woche
eine frage noch
Code:
position = (i2c_lLine>i2c_rLine) ? OFF_RIGHT : OFF_LEFT;
wenn true ist positon = OFF_RIGHT wenn FALSE ist position = OFF_LEFT oder ?
-
test.c:449: error: 'for' loop initial declaration used outside C99 mode
(was heisst das ?? )
die for ist in einer if in einer state machine ... ?
EDIT: scheinbar darf man in einer for(
kein for(int i = 0; etc. machen
-
richtig, das darf nur in einer schleife der obersten ebene gemacht werden. also musst du die variablen vorher deklarieren...