PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hilfe für einen "Blutigen" Anfänger



lamameister
09.08.2007, 19:14
Ein "Hallo" an alle

Ich bin neu hier in der Gegend und besitze seit kurzem einen Aruso
Bis jetzt ging alles glatt aber ich hänge mit meinem Projekt fest.
Aufbau top - Flashen top aber...
sobalt ich einen anderen fertigen File übertrage, rührt er sich nicht mehr.
Der Selbsttest von der CD Rom ist der einzigste File der funzt.
....und der läuft einwandfrei.
Eigendlich brauche ich nur die Funktion der Linenverfolgung.
Was mache ich falsch ?

Gruß Lamameister

damaltor
09.08.2007, 20:03
was willst du denn flashen? zeig mal deinen programmcode...

lamameister
09.08.2007, 21:02
hallo damaltor
schau mal was das ist
Ich habe den verdacht das beim wandeln von dem C quellcode in die Hex was schief läuft.
Wie oder was gibt es zu beachten.?
Danke im vorraus

Quellcode
zb. diesen hier:


#include "asuro.h"

#define SPEED 0x8F

int speedLeft,speedRight;
unsigned int lineData[2];
int ADOffset;

void LineLeft (void)
{
speedLeft += 1; /* links mehr Gas geben */
if (speedLeft > 0xFE) speedLeft = 0xFF;
}

void LineRight (void)
{
speedRight += 1; /* rechts mehr Gas geben */
if (speedRight > 0xFE) speedRight = 0xFF;
}

int main(void)
{
int i;
unsigned char j;

Init();

FrontLED(ON);
for (j = 0; j < 0xFF; j++) LineData(lineData);
LineData(lineData);
ADOffset = lineData[LEFT] - lineData[RIGHT];
speedLeft = speedRight = SPEED;
for(;;) {
LineData(lineData);
i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset;
if ( i > 4) {
StatusLED(GREEN);
LineLeft();
}
else if ( i < -4) {
StatusLED(RED);
LineRight();
}
else {
StatusLED(OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
return 0;
}

damaltor
09.08.2007, 21:36
ich habe deinen beitrag geändert (bitte benutze ab sofort den code button beim posten von quellcode!) und meinen namen geändert XD

bei diesem code steht der roboter still.

das problem ist, dass die geschwindigkeiten immer wieter erhöht werden. du gragst zwar ab, ob die geschwindigkeiten größer als 0xFE werden (bei dieser gelegenheit: warum eigentlich hex-zahlen? man muss ein zeichen mehr tippen, und man spart nichts ein für das programm. eigentlich wird es dadurch nicht übersichtlicher.), und setzt sie dann auf 0xFF. beim nächsten erhöhungsdurchlauf werden die speedwerte jedoch wieder +1 gerechnet (oxFF + 1 = 0x00), und damit steht der roboter.

die Variable ADOffset ist nicht definiert worden.

ich glaube ausserdem nicht dass der compiler for(;;) akzeptiert. setze an diese stelle lieber while(1).

das sind einige grobe fehler. eigetlich dürfte die kompilierung nicht klappen, schon allein weil die variable nicht deklariert ist. kommt beim kompilieren keine fehlemeldung? welche ausgabe bekommst du beim kompilieren? bitte poste auch diese mit dem code button.

lamameister
10.08.2007, 17:58
Hi damaltor
besten dank für deine Antwort.
soweit verstehe ich das ja aber wiederrum verstehe ich nicht warum andere solche codes die nicht funzen auf ihrer website zur verfügung bzw zum download stellen?!?!
Ich musst gestehen das ich noch nicht in der Lage bin selber zu schreiben - aufgrung mangels wissen...... aber es kann doch nicht so schwierig sein eine Linienverfolgung bei möglichst geringer Geschwindigkeit entstehen zu lassen. ( Wo gibt es soetwas) :-)))
Alles was ich bis jetzt kompiliert habe kommt beim kompilieren ohne fehlemeldung. Aller Anfang ist schwer
Danke für deinen Hinweis ... ich lerne immer mehr - oder-?!
Gruß lamameister




D:\Dokumente und Einstellungen\Eigene Dateien\Asuro\asuro_src\ASURO_src\FirstTry>make all
-------- 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 1512 0
.data 0 8388704
.bss 1 8388704
.noinit 0 8388705
.eeprom 0 8454144
.stab 3120 0
.stabstr 1763 0
Total 6396


Size after:
test.elf :
section size addr
.text 1512 0
.data 0 8388704
.bss 1 8388704
.noinit 0 8388705
.eeprom 0 8454144
.stab 3120 0
.stabstr 1763 0
Total 6396


Errors: none
-------- end --------

> Process Exit Code: 0

Mr.Roboto
10.08.2007, 18:23
Weil die alle schw*l sind, die haben nur scheiße auf ihrer CD.
ich hatte am anfang die selben Probleme mit deren mist, den ganzen rotz kannste vergessen, brauchste eh net, lad die die aktuelle lib runter und nimm dir als hilfe beim programmieren die HELP-File von der LIB, die funktionen sind da gut ersichtlich und so sachen wie linienverfolgung-test kannste dir da mal allegemein angucken, aber nicht direkt verwenden

damaltor
10.08.2007, 18:51
beherrsch dich, Mr.Roboto...


lamameister:
wo hsat du den code denn her? die compilation ergab keinen fehler, also scheint doch alles in butter zu sein.

fertige codes runterzuladen, die man nicht versteht, und deren fehler man nicht findet, ist sinnlos. wir werden dir auch keine fertigen codes geben - entweder du findest die im forum, oder du musst doch selbst ran.

mach dir mal einen plan: was muss denn passieren, damit asuro auf der linie bleibt? wie man das in einen programmcode fasst, das können wir später mal schauen. mach dir zuerst mal einen ungefähren plan, indem du schrittweise beschreibst was passieren muss.
wenn du am ende das programm selbst geschrieben hast, ist es besser weil du dann wirklich was gelernt hast, das verstehst was er tut und warum er das tut, und weil du selbst nach fehlern suchen kannst.

harry3
10.08.2007, 20:07
Hallo!

@lamameister und Mr.Roboto:
Ich hab das Programm gerade getestet!
Es ist fehlerfrei und lässt sich ohne irgendwelche Probleme übersetzen.

Auch am Asuro funktioniert es, wenn auch nicht so gut wie wastes PID Regler. Ich würde dir diesen empfehlen da er wirklich sehr sauber arbeitet!

Also nicht immer gleich über andere schimpfen wenn der Fehler bei Euch selbst liegt. Da hat jemand anderer vielleicht viel Arbeit reingelegt...
Seit froh dass so viele Quellcodes öffentlich zugänglich sind.


@damaltor:



die Variable ADOffset ist nicht definiert worden.

ich glaube ausserdem nicht dass der compiler for(;Zwinkern akzeptiert. setze an diese stelle lieber while(1).


ADOffset sowie ein paar andere Variablen sind global definiert worden.
for(;;) ist gleichwertig mit while(1), allerdings ist while(1) eindeutig die "schönere" Schreibweise.

Übrigens hast du deinen Namen noch nicht genug ausgebessert :-D


Grüße,
Harri

damaltor
10.08.2007, 20:32
wusst edoch dass da was net stimmt... XD jetz is besser

Sternthaler
11.08.2007, 02:08
Hallo zusammen,
erst einmal schließe ich mich damaltor an: Mr.Roboto etwas mehr sinnvolles bitte!

@lamameister
Es wurde dir empfohlen, dass du dir die 'aktuelle LIB' runterladen sollt.
Wenn du tatsächlich ein absoluter Anfänger bist, dann lass es im Moment erst einmal lieber sein, da die Installation der LIB noch weitere Probleme für dich bringen wird. Bleib erst einmal bei der Software, die zum Asuro mitgeliefert wurde. (Ist so schon schwer genug.)

damaltor hat dich ja schon darauf hingewiesen. (Ja, ich gebe ihm Code. Tschuldigung damaltor)
Hier das was er meint: Achte auf das 'speedLeft = 0xFE'

void LineLeft (void)
{
speedLeft += 1; /* links mehr Gas geben */
if (speedLeft > 0xFE) speedLeft = 0xFE;
}
Wie damaltor schreibt, würde der Wert von speedLeft in einem weiteren Durchlauf erhöht, so dass er dann 0xFF + 1 = 0 wird. Das ist eben eine Vollbremsung.

P.S: Und es ist doch sehr, sehr schwierig eine Linie wirklich gut zu verfolgen.


Dann noch zu dem ADOffsetwert mal ein kleines Bild, da hier etwas Erklärung dazu gehört. (Lasst ADOffset einfach weg, wenn ihr eine Linie unter dem Sensor habt.)

harry3
11.08.2007, 14:22
ADOffset soll auch die Unterschiede der beiden Transistoren ausgleichen. Wenn beide Transistoren sich auf genau gleich hellem Untergrund befinden, so ist trotzdem ein kleiner Unterschied zwischen dem linken und dem rechten Transistor festzustellen(bei mir so ca. 5-10)

Grüße,
Harri

Sternthaler
12.08.2007, 02:50
Hallo harry3,
das ist mir schon klar, dass bei gleich hellem/dunklen Untergrund ein netter Ausgleich zu erreichen ist. Aber der Ausgleich bringt nichts, wenn ich den Asuro nur 'lieblos' auf eine Linie stelle. Dann verschiebe ich die Linie rein mathematisch unter dem Asuro, und bekomme das oben geschilderte Problem. Dann ist es wegen der verlorengegangenen Regelleistung aber eben auch viel schneller möglich dass der Asuro die Linie verläßt. Und das wollen wir ja verhindern.
Es gibt, unter anderem, folgende Threads zu diesem Thema:
Beitrag von mir: Hell-/Dunkel-Erkennung (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=108945#108945)
und, viel spannender: Vollausschlag für die Fotosensoren (https://www.roboternetz.de/phpBB2/viewtopic.php?t=29109)