PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Weiß jemand wo hier der Prpgrammierfehler liegt?



ostoff
29.12.2007, 13:31
ich habe heute mit "c" angefangen und habe etwas Probleme mit einigen errormeldungen:

Wo liegt hier der Fehler?:


#include "asuro.h"

int main (void){
unsigned char taste;
Init();
taste=PollSwitch();

if (taste=0);

{MotorDir(FWD,FWD);
MotorSpeed(140,120);
StatusLED(GREEN);
}

else
{MotorSpeed(0,0);
Sleep(200);
MotorDir(RWD,RWD);
MotorSpeed(140,120);
Sleep(1000);
MotorDir(RWD,FWD);
MotorSpeed(120,140);}





while(1);
return;}




Die Errormeldung:


> "C:\Users\Christoph\Documents\ASURO_src\FirstTry\Te st-all.bat"


C:\Users\Christoph\Documents\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 (GCC) 4.2.2 (WinAVR 20071221)
Copyright (C) 2007 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.

Size before:
test.elf :
section size addr
.text 2558 0
.data 256 8388704
.bss 1 8388960
.stab 888 0
.stabstr 95 0
.debug_aranges 64 0
.debug_pubnames 263 0
.debug_info 988 0
.debug_abbrev 388 0
.debug_line 1060 0
.debug_frame 288 0
.debug_str 410 0
.debug_loc 457 0
Total 7716


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-20071221/bin/../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:8: warning: suggest parentheses around assignment used as truth value
test.c:15: error: expected expression before 'else'
test.c:29: error: expected declaration or statement at end of input
make: *** [test.o] Error 1

> Process Exit Code: 2
> Time Taken: 00:00

Weiti
29.12.2007, 13:35
Bitte die code-funktion benutzen!
Dafür schreibst du "code" in eckigen klammern [] vor den code und /code in klammern dahinter.

sloti
29.12.2007, 13:38
Hi ostoff,

erstmal solltest du Code immer in die Code tags packen, damit die posts nicht so lang werden. Zu deinem Programm solltest du auf jeden fall erstmal das semikolen wegnehmen. If bedingungen sehen immer so aus:

if (Bedingung) {hier soll was gemacht werden...}
und dann solltest du das Programm in die Endlosschleife schreiben, da er sonst nur einmal die Tasterabfragt und dann nie wieder. Probleme könntest du noch kriegen, weil du nur einmal die PollSwitch funktion abgefragt hast. Die gibt nämlich oft falsche werte zurück, daher immer lieber mindestens 2 mal abfragen (dazu findest du sehr viel hier im Forum geh mal auf die Suche ;)) und soweit ich weiß ist die Logische verknüpfung auf gleich so "==" und nicht so "=". Ich hoffe das war soweit alles verständlich, wenn nicht frag nach.

mfg
Erik

robocat
29.12.2007, 13:53
if (taste=0);
falscher gehts schon fast nimmer ;)

das "=" ist in c eine zuweisung, der variablen "taste" wird also der wert 0 zugewiesen, danach wird (wegen dem strichpunk hinter der klammer) nichts gemacht.

sollte besser so aussehen:

if (taste==0)
{
....
}

gruesse

EDIT:
ausserdem um alles ab Init(); eine groooosse while-schleife, also

Init();
while(1)
{
taste=PollSwitch();
....
}

ostoff
29.12.2007, 19:46
Hab euer Tips versucht umzusetzen:




#include "asuro.h"

int main(void)
{
unsigned char taste;

Init();
while(1)
{
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
taste = PollSwitch();
if(taste == 0)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(150,150);
else
{
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(150,150);
Sleep (36);
MotorDir(FWD,RWD);
StatusLED(RED);
MotorSpeed(100,90);
Sleep (36);
SerWrite("Mann ich hab zu tun, verschwinde! Ich muss weiter!",40);
MotorSpeed(0,0);
}
}
}



Doch irgendwie Stottert der Motor nur.



GrußChristoph[/code]

asuroer
29.12.2007, 20:11
also hi erstmal

nach der if bedingung musst du eine geschlossene Klammer setzen, um dem programm zu sagen, wo diese endet. da du diese geschwiffeneklammer hinter die else anweisung gemacht hast, kann diese nie aufgerufen werden.
warum der motor stottert kann ich dir nicht sagen, doch ich nehme an, das pollswitch nie 1 zurückliefert, der motor also eigentlich garnicht angesteuert wird.
vllt solltest du calso mal ein programm schreiben, das dir pollswithc anden pc sendet, um dies festzustellen.

MfG

Jan

ostoff
29.12.2007, 20:39
Sorry ich kann dir nicht ganz folgen. Was ist eine geschlossene Klammer?

Danke für deine Hilfe!

lg Christoph

Martin.
29.12.2007, 21:47
Was er meint:



if (Bedingung)
{
}
else {
}

du musst jeden Block mit einer geschweiften Klammer "{" eröffnen und schliesen "}".
du hast nach if zwar eine geöffnete Geschweifte Klammer gesetzt ( { ) doch nie den Block mit einer geschlossen. Also vor dem else noch eine } einfügen!

damaltor
29.12.2007, 22:26
ostoff: habe deinen ersten post geändert und die code-tags eingefügt. ;)

ostoff
30.12.2007, 16:51
Sorry ich wusste net das man den Code so setzen kann.

ostoff
30.12.2007, 17:42
Irgendwie sprint der immer in else. Der Läuft das Programm einfach von oben nach unten durch.

Woran kann das liegen?

Hier noch mal das Programm:





#include "asuro.h"

int main(void)
{
unsigned char taste;

Init();
while(1)
{
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
PollSwitch();
taste = PollSwitch();
if(taste == 0)
{
StatusLED(GREEN);
MotorDir(FWD,FWD);
MotorSpeed(150,150);}
else
{
MotorSpeed(0,0);
MotorDir(RWD,RWD);
MotorSpeed(150,150);
Sleep (36);
MotorDir(FWD,RWD);
StatusLED(RED);
MotorSpeed(100,90);
Sleep (36);
SerWrite("Mann ich hab zu tun, verschwinde! Ich muss weiter!",40);
MotorSpeed(0,0);
}
}
}



Lg christoph[/code]

sloti
30.12.2007, 17:56
Hast du mal geprüft welche Werte die Taster zurückgeben? Vielleicht sind bei dir die Taster werte falsch und er bekommt immer einen Wert zurück der größer als null ist.

mfg
Erik

datobbs
31.12.2007, 00:17
Hallo ostoff,

ich hatte bei meinen ersten Versuchen auch erstmal ein paar Rückschläge zu verkraften, wie ich jetzt weiß oft aufgrund von falschen Vorstellungen was die Sensoren zurückgeben würde. Naiv wie ich war glaubte ich, ich könnte in etwa mit den Werten aus dem Handbuch rechnen.(Blasphemie, zumindes bei odo und line Sensoren ^^)
Nachdem ich mir ein paar Programme gebastelt hatte um die einzelnen Sensorwerte auszulesen und über das Hyperterminal auszugeben, lief es dann besser.

Hier das Programm um die Taster auszulesen, im Anhang das hex-File.
Eigentlich einfach, nur müssen die Zahlen die die Sensoren liefern in einen string, sozusagen die Ziffern aufgedröselt werden.


#include "asuro.h" //die asuro-funktionen
#include <stdlib.h> // hier kommt itao() her

int main(void) {
unsigned char taste; //der taster-wert
unsigned char ctaste[3]; //taster-wert als string
Init();
while(1) { //endlosschleife
PollSwitch(); //tasterwerte auslesen
PollSwitch(); //tasterwerte auslesen
PollSwitch(); //tasterwerte auslesen
taste = PollSwitch(); //tasterwerte auslesen und speichern

if (taste != 0) { //wenn was gedrückt wurde
itoa((int)taste,ctaste,10); //zahl in string(ziffern) umwandeln
SerWrite(ctaste,3); //string uber IR senden
SerWrite("\n\r",2); //neue zeile, return zum zeilen-anfang
}
}
return 0;
}


Ach ja die Taster-Werte sollten sein, von rechts nach links (wieder von hinten): 1, 2, 4, 8, 16, 32
Ich habe das große Glück, dass bei mir alle Taster-Werte passen.

Ich habe dein proggi mal in meinen Asuro geflasht, was mir auffällt:

1. Deine Verzögerungen mit sleep sind zu kurz, die Zeit die gewartet wird ergibt sich aus "übergebene Zahl" / 72000 in Sekunden. (bei Verwendung der lib aus dem RN 36000)

2. Wenn man einen der drei rechten Taster (von hinten gesehen) erwischt, wechselt die StatusLED mal mehr mal weniger oft zu rot, obwohl der Taster schon längst wieder losgelassen wurde. Vielleicht kommt das vom prellen der Taster, obwohl ich dachte die wären mechanisch entprellt.

radbruch
31.12.2007, 01:06
Hallo

Was der mehrfache Aufruf von PollSwitch() bewirken soll, habe ich nie kapiert. Die Tastenwerte zum Terminal zu senden ist schon mal ein guter Ansatz. Wenn die Werte nicht genau 1,2,4,8,16 oder 32 sind, kann man die Taster auch kalibrieren. Dazu muss man in asuro.c die Formel am Ende der Funktion PollSwitch() ändern. Meist reicht es, wenn man mit dem 60er-Wert etwas spielt. Beispiel für meinen asuro:

return ((10240000L/(long)i-10000L)*63L+5000L)/10000;

Wirklich sinnvoll ist auch die mehrfache Überprüfung der von PollSwitch() zurückgelieferten Werte:
https://www.roboternetz.de/phpBB2/viewtopic.php?t=36760

Übrigends ist das Forum voll von asuro-Tastenproblemen und Lösungen dafür, man sollte mal die Suchfunktion (https://www.roboternetz.de/phpBB2/search.php) verwenden: "asuro AND tasten AND werte" oder "asuro AND pollswitch AND falsch" (ohne "" eingeben)

Sleep(36) verzögert eine tausendstel Sekunde, das ist kaum merklich. Deshalb kann man es in eine Schleife packen:

unsigned int i;
for (i=0;i<1000;i++) Sleep(36);

Gruß

mic

damaltor
31.12.2007, 16:24
der mehrfache aufruf vom pollswitch entlädt den kondensator C6 (?) welcher mitschuld an den fehlerhaften werten hat.