PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei if-Abfrage



sebwolf
13.03.2008, 16:18
Hallo,
ich habe ein Problem bei der if-Abfrage der Taster.
Wenn bei if zwischen den geschweiften Klammern mehr als ein Befehl steht, dann führt der ASURO immer diese aus, obwohl die Bedingung nicht erfüllt ist.
Steht zwischen den geschweiften Klammern nur ein Befehl dann klappt alles, wie es soll.
Ich habe schon alle Möglichkeiten, die ich kenne ausprobiert,
Ich hoffe auf baldige Hilfe.

radbruch
13.03.2008, 16:27
Hallo

Wenn du nicht nur irgendwelche Glaskugelsprüche lesen möchtest solltest du uns dein Programm zeigen.

Gruß

mic

PicNick
13.03.2008, 16:28
Zeig mal her die fraglichen Zeilen. Beim C gibt's nix esoterisches, da hast du irgendeinen formalen Hund drinnen.

sebwolf
13.03.2008, 16:38
so hier ist der code


#include "asuro.h"

void RWD(void)
{
MotorDir(RWD,RWD);
MotorSpeed(200,200);
Msleep(1000);
}

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

Init();
while (1)
{
PollSwitch();
PollSwitch();
t1 = PollSwitch();
t2 = PollSwitch();
MotorDir(FWD,FWD);
MotorSpeed(250,250);
if(t1 && t2 && t1 ==t2){
if(t1>0x00) {
RWD;
}
}
}
return 0;
}

Reeper
13.03.2008, 17:02
Hallo sebwolf,

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

Was willst du genau? Arbeite evtl. mit mehr Klammern (eindeutig)

sebwolf
13.03.2008, 17:08
Da frag ich ab ob beide Variablen die gleichen Tasterwerte liefern.
Und ich will dass der ASURO, wenn ein Taster gedrückt wird, rückwärts fährt(die Funktion RWD ausführt)

Reeper
13.03.2008, 17:13
Meinst du " if (t1==t2) " ?

sebwolf
13.03.2008, 17:17
Ja, aber selbst wenn ich es so ändere,fährt er trotzdem immer rückwärts

Reeper
13.03.2008, 18:07
Habe mir mal die Anleitung durchgelesen:
wieso führst du 2x Pollswitch gleich nacheinander aus (evtl. kurze Pause durch warten oder besser per IRQ) und speicherst das Ergebnis in 2 unterschiedliche Variablen?

Laut Anleitung bekommst du ein Byte mit dem Ergebniss zurück und kannst dies auswerten.

Somit brauchst du eigentlich keine Variable sondern einfach nur if (PollSwitch()>0){} (Anleitung S.60)

Wenn du wie oben direkt nacheinander das Ergebnis in unterschiedliche Variablen abspeicherst und vergleichst, wird dies wahr ergeben und die nächste Abfrage, sofern ein Taster gedrückt wurde ebenfalls.

radbruch
13.03.2008, 18:37
Hallo

Die Überprüfung von PollSwitch() ist sinnvoll, vor allem bei laufenden Motoren "lügt" die Funktion recht häufig. RWD ist ein reserviertes Wort weil es in asuro.h definiert ist. Mir ist schleierhaft wie ihr solchen Mist fehlerfrei kompilieren könnt:



#include "asuro.h"

void xRWD(void)
{
MotorDir(RWD,RWD);
MotorSpeed(200,200);
Msleep(1000);
}

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

Init();
while (1)
{
//PollSwitch();
//PollSwitch();
t1 = PollSwitch();
t2 = PollSwitch();
MotorDir(FWD,FWD);
MotorSpeed(250,250);
if(t1 ==t2){
if(t1>0x00) {
xRWD();
}
}
}
return 0;
}


Gruß

mic

sebwolf
14.03.2008, 11:52
Ich verwende Programmers Notepad und zwar so wie es in der Anleitung beschrieben ist. Bei mir Kommt beim kompilieren von meinem eigenen Programm aber auch beim geänderten:
avr-gcc -c -mmcu=atmega8 -I. -g -Os -ID:/ASURO_SRC/library2.7.1/lib/inc -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o
test.c:5: error: expected identifier or '(' before numeric constant
test.c: In function 'main':
test.c:27: warning: statement with no effect
test.c:32:2: warning: no newline at end of file
make: *** [test.o] Error 1

Könnte es vllt. sein, dass das gar kein Fehler in dem Programm ist(selbes .hex file funktioniert auf dem ASURO von nem Freund), sondern dass einfach der Prozessor/Speicher/sonstwas an der Hardware kaputt ist?

radbruch
14.03.2008, 12:13
Hallo

Wenn bei beiden Varianten die selben Fehlermeldungen (inclusive der Zeilennummern!) kommen, ist es wohl auch der selbe Quellcode. Der erste Fehler in Zeile 5 verursacht Folgefehler/-Warnungen weil der Kompiler durcheinander kommt. Ein Fehler im Mikrokontroller kann der Kompiler nicht erkennen, ein Hardwarefehler scheidet bei deinem Problem definitiv aus.

Grundsätzlich solltest du immer den Progammcode mit den Fehlermeldungen zusammen posten, sonst können wir nur raten was nicht stimmt. Und speichern vor dem Kompilieren nicht vergessen!

Wenn beim Kompilieren Fehler auftreten ist das erzeugte Hex-File (wenn es überhaupt erzeugt wird) nicht funktionsfähig! Es kann also auch nicht bei deinem Kumpel funktionieren. Irgendwas macht ihr wohl falsch. Flasht ihr die richtige Datei? Hat sich nach dem Kompilieren die Uhrzeit der Dateierstellung oder die Größe der Datei geändert? Du kannst Hex-Dateien auch als Anhang anfügen, dann können wir es auf unseren asuros testen.

Gruß

mic

Ceos
14.03.2008, 12:23
was mir grad auffällt...



MotorDir(FWD,FWD);
MotorSpeed(250,250);


sollte nach möglichkeit nur EINMAL aufgerufen werden und zwar wenn der asuro steht oder fertig ist mit rückwärts fahren, wenn du das permanent ausführst kann es gut sein das du die autoencodefunktion für die odometrie damit blockierst ... das sollte sowieso der fall sein wenn du dauernd pollswitch aufrufst ... liess die taster besser über interrupt aus und prüf einfach ob die switched variable gesetzt ist oder nicht

radbruch
14.03.2008, 12:39
Hallo

Die von mir weiter oben gepostete Variante funktioniert. Kritisch ist das Wiederholte aufrufen von MotorSpeed() wenn es zu schnell geschied, z.B. mit while(1) MotorSpeed(123,123);. Wir haben aber zwei AD-Wandlungen, die If-Abfrage und die endlos-while-Sprünge dazwischen.

Ich bin kein Freund der erweiterten Library-Funktionen. Man entfernt sich zunehmend von der Hardware und ihrer Funktionenweise wenn man nur den vorgekauten Library-Brei verwendet. Zum Lösen der Aufgabe genügt hier die orginale Lib mit PollSwitch(), MotorDir() und MotorSpeed() vollkommen.

Gruß

mic

Ceos
14.03.2008, 12:43
naja gut ok, ich meine ja nur weil er ein "anfänger" ist und sich nciht unbedingt selber die odometrie schreiben will kann das später problematisch werden wenn er mal autoencode verwendet ... in meinem kleinen projekt bin ich fast verzweifelt warum meine odometrie nicht geklappt hat bis mir klar wurde das ich linedata nicht zu oft pollen darf!!!

sebwolf
14.03.2008, 13:36
Ich habe nun die Datei neu kompiliert.
Jetzt kommt keine Fehlermeldung mehr!
Der ASURO fährt aber trotzdem weiterhin rückwärts, allerdings stockt er regelmäßig(sieht so aus als ob er kurz vorwärts fährt), fährt dann aber weiter rückwärts.
Als Attachement ist das .hex file angehängt

radbruch
14.03.2008, 17:30
Hallo sebwolf

Mit meinem asuro funktioniert deine Hex-Datei tadellos.

Vermutlich sind die Tasten an deinem asuro nicht richtig kalibriert/ falsch bestückt/ Lötfehler...

Lösungsmöglichkeiten: Noch eine (oder mehrere) Werte einlesen und vergleichen:

t1 = PollSwitch();
t2 = PollSwitch();
t3 = PollSwitch();
t4 = PollSwitch();
if((t1 == t2) && (t1 == t2) && (t1 == t3) && (t1 == t4)){

und/oder anschliessend auf spezielle Tasten prüfen, z. B. die beiden vorderen Tasten:

if((t1 == 2) || (t1 == 16)){

Gruß

mic

sebwolf
06.04.2008, 06:22
So jetzt hab ich mal wieder meinen ASURO programmiert.

Ich habe deine Version des Programms mit den 4 Variablen ausprobiert:
und siehe da er fährt vorwärts(auch wenn die Schalter gedrückt sind).

Meiner Meinung nach bedeutet dass das die Schalter gering unterschiedliche Werte zurückgeben.

Ich habe mal gehört, dass man im makefile die Schalterwerte irgendwie anpassen kann.

Macht das hier Sinn und wenn ja wie muss ich diese Werte anpassen?


Vllt. könnte ja auch jemand aus dem Forum bitte hier eine funktionierende .hex-Datei für Kollisionserkennung hochladen(am besten auf nem ASURO getestet). Dann wüsste ich ob mein ASURO kaputt ist oder mein Compiler