PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Programm, es funktioniert, nur bei mir nicht !!!



chido72
27.02.2011, 22:13
](*,)
Hallo, habe ein Problem mit meinen Asuro, mit einem simplen Programm!

Kurz vorweg, unsere Asuros sind neu, frisch zusammengebaut und es sind unsere ersten Gehversuche damit. Löten und Mechnik alles kein Problem, Programmieren geht so für den Anfang, aber irgenwo ist der Wurm in meinem Asuro!!!

Es funktioniert super im Asuro meines Bruders, läuft bis die Akkus leer sind! Aber in meinem läuft es ca 15 Sekunden, dann hängt er sich irgendwie auf, es passiert nichts mehr, nur manchmal macht er das weiter wo er gerade war, also weiterfahren in irgend eine richtung! nach einem Neustart geht es wieder, für kurze zeit, dann wieder das selbe!

Auch mein Chip funktioniert super im anderen Asuro, nur bei mir nicht!

Also am Programm oder Chip kanns nicht liegen, funktioniert ja im anderen Asuro!
Irgenwo ist der Fehler auf der Platine oder bei Bauteilen! Aber ich brauche wohl nicht zu erwähnen, das wir ALLES schon mind. 15x kontrolliert haben!

Hat jemand ne Idee wo ich noch suchen könnte oder hatte jemand schonmal so eim Problem!

Hier das einfache Programm einer Linienverfolgung:



#include "asuro.h"

#define SPEED 175

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

void LineLeft (void)
{
speedLeft += 1; /* links mehr Gas geben */
speedRight -= 1; /* rechts weniger Gas geben */
if (speedLeft > 200) speedLeft = 200;
if (speedRight < 75) speedRight = 75;
}

void LineRight (void)
{
speedRight += 1; /* rechts mehr Gas geben */
speedLeft -= 1; /* links weniger Gas geben */
if (speedRight > 200) speedRight = 200;
if (speedLeft < 75) speedLeft = 75;
}

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

Init();

for (j = 0; j < 255; j++);
LineData(lineData);
ADOffset = lineData[LEFT] - lineData[RIGHT];
speedLeft = speedRight = SPEED;
FrontLED(ON);
StatusLED(GREEN);
for (;;)
{
LineData(lineData);
i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset;

if ( i >= 4)
{
BackLED(OFF,ON);
StatusLED(RED);
LineLeft();
}
else if ( i <= -4)
{
BackLED(ON,OFF);
StatusLED(RED);
LineRight();
}
else
{
BackLED(OFF,OFF);
StatusLED(GREEN);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}


while(1);


Vielen Dank schonmal!

Gruß aus Paderborn!

TobiKa
27.02.2011, 23:01
for (j = 0; j < 255; j++);
Blödsinn, wird eventuell eh wegoptimiert. Dann spart ihr euch auch das Byte für "j".

while(1);
Auch Blödsinn, dort sollte er nie hinkommen.


Zum Problem:
Der µC funktioniert mit dem Programm im anderen Asuro tadellos... na dann solltet ihr euch ihn vll nochn 16tes mal anschauen.

Valen
27.02.2011, 23:02
Es fehlt noch etwas am ende von deinem Programm.

Im Allgemeinheit, jeder Asuro wird mit andere werten anfangen zu laufen mit seine Motoren. Das ist wegen mechanische Verlusten, aber auch Bautoleranzen in dem Teilen der H-brucke, und den Batterie/Akku-spannung. Und natürlich gilt das auch fur den Sensoren. Die Asuro von deine Freund und deiner wird eine andere Empfindlichkeit haben. Deshalb solltest du die SpeedLeft und SpeedRight Entscheidungswerten in dem LineLeft und LineRight Funktionen nicht für Wahrheit halten. Eben so die Wert i das 'den Richtung der Linie' angebt. Vielleicht kommt das bei dir Asuro überhaupt nicht an den Wert 4 oder -4.

chido72
28.02.2011, 11:56
Hallo,
das mit den unterschiedlichen Werten mag ja sein, aber auf unserer "Teststrecke" fährt meiner ja auch ca. 1,5 Runden,
steigt dann aber aus, oft bleibt er einfach stehen, die Status-LED blinkt rot-grün, eine Back-LED ist an, Front-LED geht aus und er reagiert gar nicht mehr!

Nach neuem starten das gleiche Spiel...

Selten hängt er sofort nach den Start...

Es kann nur was an der Hardware sein, aber wie gesagt, alles schon zigmal
geprüft !!!

Hatte noch niemand ein ähnliches Problem?

Wo könnte ich "noch genauer" hinsehen?

Danke!

Valen
28.02.2011, 12:23
Zur erkennen ob das ein Bord-Spannung induzierte Reset ist wurde ich dich empfehlen die StatusLED(RED); Befehlen raus zu nehmen. Wann es dann noch Rot-Grün wechselt (Gelb leuchtet) dann ist das wirklich ein Hardware/Spannung Problem. Wann es nur Grün bleibt dann geht das Programm irgendwie merkwürdig. Nächste Schritt wurde ich sagen ist einer Art von Telemetrie Funktion hin zu fügen, das die Aktuelle Messwerten zum Rechner sendet. (Zum Beispiel die Bordspannung und Linie-werten in deinem Fall)

Außerdem ist mir noch etwas aufgefallen. Was aber wahrscheinlich nicht dein Problem verursacht. Den Ordnung der Befehlen zur Berechnung von ADOffset ist meines wissen nicht in eine Logische Folge. Du berechnet erst diese wert mit FrontLED aus, und danach schaltest du diese ein. Dann seit Linien-fahren mit FrontLED an berechnet er die Ist-wert i auf Basis der (Dunkle) ADOffset. Ist den Ist-wert mit FrontLED an immer noch 0 wann er nicht über eine Linie steht?


...
FrontLED(ON);
LineData(lineData);
ADOffset = lineData[LEFT] - lineData[RIGHT];
speedLeft = speedRight = SPEED;
// FrontLED(ON); //Nicht hier! Weil ADOffset auf Basis von leuchtende FronLED sein soll.

TobiKa
28.02.2011, 12:28
Hast du vll. beim PullUp für den Resetpin einen falschen Widerstand erwischt?

Valen
28.02.2011, 12:30
Asuro hat kein Pull-up Widerstand an dem Reset-pin. (oder es ist nur den eingebaute im Atmega8) Den Reset-pin ist direkt an Vcc verbunden.

TobiKa
28.02.2011, 12:37
Stimmt, hab nicht dran gedacht das es garkeinen Programmer gibt der ihn gegen Masse ziehen müsste...

chido72
28.02.2011, 21:55
hallo,

hab versucht alle tips zu befolgen...

hier der code:



#include "asuro.h"

#define SPEED 150

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

void LineLeft (void)
{
speedLeft += 1; /* links mehr Gas geben */
speedRight -= 1; /* rechts weniger Gas geben */
if (speedLeft > 200) speedLeft = 200;
if (speedRight < 100) speedRight = 100;
}

void LineRight (void)
{
speedRight += 1; /* rechts mehr Gas geben */
speedLeft -= 1; /* links weniger Gas geben */
if (speedRight > 200) speedRight = 200;
if (speedLeft < 100) speedLeft = 100;
}

int main(void)
{
int i;

Init();
FrontLED(ON);
LineData(lineData);
ADOffset = lineData[LEFT] - lineData[RIGHT];
speedLeft = speedRight = SPEED;
for (;;)
{
LineData(lineData);
i = (lineData[LEFT] - lineData[RIGHT]) - ADOffset;

if ( i >= 4)
{
BackLED(OFF,ON);
LineLeft();
}
else if ( i <= -4)
{
BackLED(ON,OFF);
LineRight();
}
else
{
BackLED(OFF,OFF);
speedLeft = speedRight = SPEED;
}
MotorSpeed(speedLeft,speedRight);
}
}



in bezug auf die leds...

obwohl kein befehl status led grün drin steht ist die status led nach dem init grün die back leds leuchten je na sensor eingang auf, dann irgendwann flackert (in den meisten fällen) die satus led rot/grün, motoren aus und die front led glimmt schwach...

nach nen neustrt das gleiche...

noch jemand nen tip ?

danke!

Valen
28.02.2011, 22:30
...
obwohl kein befehl status led grün drin steht ist die status led nach dem init grün die back leds leuchten je na sensor eingang auf, dann irgendwann flackert (in den meisten fällen) die satus led rot/grün, motoren aus und die front led glimmt schwach..StatusLED(Green) steht schon im Init() Funktion im asuro.c datei. Deshalb leuchtet es um sonnst.

Ich vermute das dein Asuro tätsachlich ein Reset-modus oder Unterspannung Situation erreicht. Was den Ursach ist habe ich kein genaue ahnung von. Vielleicht kannst du es noch etwas ausschliessen durch simmulieren von das linien-fahren, aber nun ohne Rad-belastung. Also mit den Rädern von den Boden und mit den Hand die Liniensensoren langsam über eine Linie schieben. Tritt das abschalten immer noch auf nach lange Zeit, oder nur mit Reibungslast? Weitere versuchen kannst du dann auch machen mit Komplett abgeschaltete Motoren. Also kein MotorSpeed Änderungen. Dann kannst du nur die Linien-erkennung laut das leuchten der BackLEDs erkennen. Tritt das Abschalten dann immer noch auf dann ist den Ursach vermutlich nicht den H-brucke.

chido72
01.03.2011, 19:40
hallo,

so langsam wird alles noch komischer...

jetzt ist es schon mehrmals passiert, das er kurz funktioniert wie gewollt, aber dann aussteigt...

bei einem neustart kommt der ca. 3sek init, status led gelb, die beiden back-leds an, dann wird die status-led grün, die font-led blinkt kurz auf und geht aus, das wars, kein motor bewegt sich und keine reaktion, auf garnichts!!! auch erneutes einschalten bringt nichts...
ich kann ihn dann neu flashen und dann gehts wieder, er funktioniert und steigt aus...

kann das geflashte programm vom asuro irgenwie zerstört werden??? wenn ja, wie? vielleicht ist das ja ein ansatz zur fehlersuche...

bin für jeden rat und vorschlag dankbar!

gruß

Valen
01.03.2011, 20:22
Das Programm kann nur überschrieben werden durch Flashen mit AsuroFlash. Ich denken nicht das den IC kaputt gegangen ist. Ist das letzte Verhalten immer noch mit das Programm oben? Passiert das abbrechen auch ohne Motor-Befehlen? Versuch zbs mal das ganz einfachste Programm FirstTry zu compilieren und zu flashen. Wirklich, das ist die einfachste Methode den mögliche Fehler zu lokalisieren. Irgend ein Teil der Asuro-Schaltung ist nicht in Ordnung. Und verursacht vermutlich ein kleines Kurzschluss im Betrieb. Die Lösung: Eins für eins Teilen ausprobieren.

chido72
02.03.2011, 10:11
aber warum startet der asuro nur einmal korrekt, dann passiert nix mehr, auch nach mehrmaligem neustart (aus -> an) ??? geht erst wieder nach neuem flashen !

Valen
02.03.2011, 11:56
Ich habe keine Erklärung dafür. Hast du schon andere Programmen versucht?

Herbert A.
06.03.2011, 08:13
ich hatte das auch schonmal,das lag bei mir aber glaube ich auch am Programm.

ich habe ein funktionierendes Linienfolgeprogramm, auch wenn es etwas ruckelt:


#include "asuro.h" // Linienverfolgung auf die einfachste Art

int main(void)
{
unsigned int data[2]; //Speicher bereitstellen
Init();

FrontLED(ON); // Linienbeleuchtung einschalten
MotorDir(FWD,FWD); // Beide Motoren auf vorwärts

while(1) // Endlosschleife, ASURO soll beliebig
// lang einer Linie nachfahren
{
LineData(data); // aktuelle Helligkeitswerte der
// Fototransistoren einlesen

if (data [0] > data [1] ) // links heller als rechts...
{MotorSpeed(140,80);

MotorDir(FWD,RWD);} // ... dann links mehr Gas geben...

LineData(data); // aktuelle Helligkeitswerte der
// Fototransistoren einlesen

if (data [1] > data [0] ) // links heller als rechts...
{MotorSpeed(80,140);

MotorDir(RWD,FWD);

} // ... dann rechts mehr Gas geben...

else
{MotorSpeed(120,120);} // ... sonst beide gleich!

}

return 0;
}


mfG

Herbert A.
06.03.2011, 09:57
danke, dass du die codebox eingefügt hast, wie geht das??

Codebox einfügen:

Unter der Eingabebox (Editor) auf [erweitert] klicken und dann entweder auf https://www.roboternetz.de/community/images/editor/code.png "Code einfügen" für eine normale Codebox oder auf https://www.roboternetz.de/community/images/editor/php.png "PHP-Code einfügen" für eine PHP-Codebox klicken. Entweder zuvor den Bereich markieren der in die Box soll oder den Programmcode nachträglich einfügen.

In einer Codebox bleibt die Formatierung des Quellcodes (sofern vorhanden) bestehen, in der PHP-Box werden zusätzlich codeabhängige Farben angezeigt. Da PHP ähnliche Syntaxregeln wie Assembler, Bascom oder C hat, passt die Darstellung in etwa. Im Zweifel besser die normale Box mit https://www.roboternetz.de/community/images/editor/code.png auswählen.

chido72
06.03.2011, 19:07
am programm wirds glaube ich nicht liegen, denn es funktioniert sauber auf zwei anderen asuro´s !!! ich habe alles zigmal gecheckt, nachgelötet und durchgemessen, alles wie bei den anderen asuros...
habt ihr noch irgendein tip?

DANKE !!!

Herbert A.
06.03.2011, 19:28
danke, radbruch, jetzt bin ich auch eun Bisschen schlauer.