PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wo liegt der fehler? - Asuro fährt nicht wie er soll



Weiti
22.01.2008, 15:45
hallo, mein asuro fährt scheinbar willkürlich. ich glaube es liegt am code.
er soll, wie im bild beschrieben, erst gerade aus gegen eine wand fahren, dann einen 180° bogen rückwärts machen und dann wieder geradeaus gegen die nächste wand fahren. dann anhalten und aufhören.

ps: die odometrie geht nicht. beim bogen kommt es nicht auf genauigkeit an. ist erstmal nur grob.



#include <stdlib.h>
#include "asuro.h"
#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))

void MSleep (int dauer)
{
int z;
for (z = 0; z < dauer; z++)
Sleep (36);
}


int main(void){
int i=0;
Init();
while(1) {

while (keine_taste) {
StatusLED(RED);
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(120,152);
}
if (PollSwitch()>0){
while (i<30) {
BackLED(ON,ON);
MotorDir(RWD,RWD);
MotorSpeed(120,152);
i++;
MSleep(36);
}
MotorSpeed(0,0);
i=0;
while (i<250) {
MotorDir(RWD,RWD);
MotorSpeed(120,0);
i++;
MSleep(36);
}
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(120,152);
i=0;
StatusLED(YELLOW);
if (PollSwitch()>0){
StatusLED(GREEN);
MotorSpeed(0,0);
while (1){
MotorSpeed(0,0);
}
}

}

}

}




http://www.picupload.net/s-8c871b060630e60f1bb5f946e44fbc54-jpg.php

FredericStep
22.01.2008, 16:30
warum machst du nicht einfach:




#include <asuro.h>
int main (void)
{
Init();
int p;
MotorDir(FWD,FWD);
MotorSpeed(255,255);

for(;PollSwitch()==0;);
MotorDir(BREAK,RWD);
MotorSpeed(0,255);
for(p=0;p<1*1000;p++)
{Sleep(72);}
MotorDir(FWD,FWD);
MotorSpeed(255,255);
for(;PollSwitch()==0;);
MotorDir(BREAK,BREAK);

for(;;);
}



mfg Freddy

radbruch
22.01.2008, 16:32
Hallo Weiti

Ich habe dein Program etwas umgestellt:

#include "asuro.h"
//#include <stdlib.h>

#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))

void MSleep (int dauer) // 1/1000 sek
{
int z;
for (z = 0; z < dauer; z++)
Sleep (36); // bei der orginalen Library muss hier 72 stehen
}

int main(void)
{
Init();

StatusLED(RED); // vorwärts bis Hinderniss
BackLED(OFF,OFF);
MotorDir(FWD,FWD);
MotorSpeed(120,120);
while (keine_taste);

BackLED(ON,ON); // zurück
MotorDir(RWD,RWD);
MotorSpeed(120,120);
MSleep(1080); // 36*30
MotorSpeed(0,0);
Msleep(200);

MotorDir(RWD,RWD); // drehen
MotorSpeed(0,120);
MSleep(2000); // 250*36=9000?
MotorSpeed(0,0);
Msleep(200);
BackLED(OFF,OFF);

MotorDir(FWD,FWD); // vorwärts bis nächstes Hinderniss
MotorSpeed(120,120);
StatusLED(YELLOW);
while (keine_taste);

StatusLED(GREEN); // fertig
MotorSpeed(0,0);
while (1);
return(0);
}



Deine Version lief mit meinem asuro auch nicht. Msleep() benötigt als Parameter die Zeit in Millisekunden (1/1000). Der wiederholte Aufruf von MotorSpeed() könnte dazu führen, das die PWM-Register nicht richtig funktionieren. Deshalb keine Schleife, sondern erst Motor setzen und dann warten.

Gruß

mic


warum machst du nicht einfach:
Weil PollSwitch() nicht immer das erwartete zurückliefert

Weiti
22.01.2008, 17:14
die lösung mit dem while (keine_taste); ist genial. die ganzen schleifen sind total unsinnig. da habt ihr recht. allerdings musste ich die großschreibung bei Msleep() anpassen und beim drehen Msleep(14500) eingeben;
der motor braucht mehr zeit um 180° zu machen.

vielen dank an euch.

gruß weiti

damaltor
22.01.2008, 17:22
14500 sind 14,5 sekunden. braucht er wirklich so lange?

radbruch
22.01.2008, 17:58
Hallo


allerdings musste ich die Großschreibung bei Msleep() anpassen
Oh, da hat sich bei mir ein kleiner Fehler eingeschlichen. Die Funktion heist mit Absicht MSleep() um sie auch mit einer Library nutzen zu können die Msleep() kennt. Blöderweise habe ich das bei der Verzögerung nicht beachtet, deshalb steht da fälschlicherweise Msleep(200);

Da du eine Fehlermeldung hattest, verwendest du wohl die orginale CD-Version von asuro.c Hier läuft der Timer noch mit 72kHz, deshalb muss in der Funktion MSleep() das Sleep(36) auf Sleep(72) geändert werden. 72000 Ticks/Sekunde*72 ergibt die gewünschten 1/1000 Sek Verzögerung. Mit Sleep(36) wären 14500 immer noch über 7 Sekunden, das erscheint mir auch etwas viel Zeit für's Wenden. Irgendwas stimmt mit deinem Antrieben nicht, darauf weisen auch deine sehr unterschiedlichen Powerwerte der Motoren hin.

Gruß

mic

Weiti
23.09.2008, 17:52
hallo auch. ich habe nach ewigkeiten mal wieder den asuro programmiert. nun geh dieses programm hier aber nicht mehr.
ich benutze im moment KEINE libs aus dem forum, also nur die standart-sachen von der cd.
das notepad gibt folgende fehler aus:



C:\Asuro\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) 3.3.1
Copyright (C) 2003 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 1528 0
.data 0 8388704
.bss 1 8388704
.noinit 0 8388705
.eeprom 0 8454144
.stab 3156 0
.stabstr 1704 0
Total 6389


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
test.c:7: error: parse error before string constant
test.c: In function `main':
test.c:16: warning: implicit declaration of function `Init'
test.c:18: warning: implicit declaration of function `StatusLED'
test.c:18: error: `RED' undeclared (first use in this function)
test.c:18: error: (Each undeclared identifier is reported only once
test.c:18: error: for each function it appears in.)
test.c:19: warning: implicit declaration of function `BackLED'
test.c:19: error: `OFF' undeclared (first use in this function)
test.c:20: warning: implicit declaration of function `MotorDir'
test.c:20: error: `FWD' undeclared (first use in this function)
test.c:21: warning: implicit declaration of function `MotorSpeed'
test.c:22: error: `PINC' undeclared (first use in this function)
test.c:22: error: `PC4' undeclared (first use in this function)
test.c:24: error: `ON' undeclared (first use in this function)
test.c:25: error: `RWD' undeclared (first use in this function)
test.c:27: warning: implicit declaration of function `Msleep'
test.c:40: error: `YELLOW' undeclared (first use in this function)
test.c:43: error: `GREEN' undeclared (first use in this function)
make: *** [test.o] Error 1

> Process Exit Code: 2

radbruch
23.09.2008, 18:08
Hallo

test.c:7: error: parse error before string constant

Da stimmt was nicht in Zeile 7. Zeig uns mal das Programm dazu.

test.c:27: warning: implicit declaration of function `Msleep'

Bei der CD-Lib muss es MSleep() lauten. Programm zeigen ;)

Gruß

mic

Weiti
23.09.2008, 18:15
hab das von radbruch korregierte. geht aber schon, es war so, das ich alle Msleep mit kleinem s hatte. wenn alle mit großem S sind gehts.

radbruch
23.09.2008, 18:25
hab das von radbruch korregierte
Ojeoje. Keine Ahnung was mich damals geritten hatte. Eigentlich sollte alles MSleep() lauten um die in der orginalen Lib nicht vorhandene Funktion zu ergänzen und keinen Konflikt mit der erweiterten Funktion Msleep() zu provozieren. Warum ich dann dieses Mischmasch abgeliefert habe weiß ich echt nicht mehr. Na, Hauptsache es läuft jetzt bei dir :)