PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : warum geht dieses Programm nicht?



fxt
02.10.2006, 20:40
Ich wollte ein Prgramm für meinen ASURO schreiben, das den ASURO geradeaus fahren lässt. Wenn er gegen etwas stößt soll er kurz zurückfahren und dann wieder weiter geradeaus fahren. Aus irgendeinem Grund fährt der ASURO aber bei diesem Programm nur noch rückwärts sobald Msleep ins Spiel kommt:

#include "asuro.h"
int main(void) {
Init();
while (1) {
if (PollSwitch()>0) {
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(180,180);
Msleep(600);}
else{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED (GREEN);}
}
}
[/code][/stream]

maze2k
02.10.2006, 20:48
Hast du schonmal andere Werte für das Msleep probiert? Ich weiss noch aus der Zeit, als ich mehr mit dem Asuro gemacht hab, dass die Asuro Sleep Funktionen manchmal Probleme gemacht haben (in manchen Fällen war die Angabe nicht Millisekunden, sondern Sekunden). Gib einfach mal 1 als Parameter für die Msleep funktion ein, um die Länge zu testen.

Die andere Möglichkeit ist, dass es an deiner IF-Abfrage hängt. Hast du mal getestet, was die PollSwitch-Funktion so ausgibt? Wenn das Ergebnis immer größer 0 ist, wird der else-Teil nie erreicht.

fxt
02.10.2006, 21:07
Es muss wohl an dem Msleep liegen. Ich hab mal verschiedene Werte für Msleep eingegeb: Bei 1 fährt er noch gerade aus, bei zwei auch noch aber bei 10 fährt er nur noch rückwräts.

izaseba
02.10.2006, 21:10
Hallo,
Poste mal den Code dieser Msleep Funktion.

Gruß Sebastian

fxt
02.10.2006, 21:16
Meinst du diesen Code:


#include "asuro.h"
int main(void) {
Init();
while (1) {
if (PollSwitch()>0) {
StatusLED (RED);
MotorDir(RWD,RWD);
MotorSpeed(180,180);
Msleep(2);}
else{
MotorDir(FWD,FWD);
MotorSpeed(200,200);
StatusLED (GREEN);}
}
}

izaseba
02.10.2006, 21:39
Nein ich meine eher das:


void Msleep(int dauer)
{
int z;
for(z=0;z<dauer;z++) Sleep(72);
}


darin wird die Funktion Sleep aufgerufen :


/* uses 72kHz timer => Sleep(x) = x/72kHz [sec] */
void Sleep(unsigned char time72kHz)
{ unsigned char ziel=(time72kHz+count72kHz) & 0x00FF;
while (count72kHz != ziel);
}

cout72kHz wird in der ISR inkrementiert :



SIGNAL (SIG_OUTPUT_COMPARE2)
{
count72kHz ++;
if (!count72kHz) timebase ++;
}

Ich hab heute keine Lust mehr das weiter zu verfolgen, vielleicht kannst Du hier Antworten darauf finden warum es mit 2 geht und 600 nicht...

Gruß Sebastian

maze2k
02.10.2006, 23:14
Scheint wohl wirklich die Angabe in Sekunden zu sein.

stochri
03.10.2006, 11:24
Nein, Msleep bedeutet Millisekunden Sleep.

Msleep(1000);

warete für 1 Sekunde.

Gruss,
stochri

_goto
03.10.2006, 14:31
Ist Msleep() eine Standardfunktion aus der asuro.h-Headerdatei?
In dem Handbuch vom Asuro wird nur die Funktion Sleep() vorgestellt.
Gibt es zur Programmierung des Asuros, noch ein umfrangreichere Hilfe?

fxt
03.10.2006, 14:55
@_goto
Msleep kommt nicht bei der "normalen" bibliothek vor.

Leider habe ich immer noch nicht verstanden warum es mit 2 geht und mit 600 nicht und wie man das Problem löst weiß ich auch noch nicht. Könnt ihr mir bitte helfen!

izaseba
03.10.2006, 17:41
Genau, Msleep soll Milisekunden warten, ich weiß auch nicht warum es bei Dir nicht klappt.

Als Alternative kann man sich die avr-gcc Funktionen angucken und zwar
_delay_us und _delay_ms zu finden in util/delay.h .

Was man dabei bedenken muß ist die Optimierung einzuschalten.

http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

Gruß Sebastian

Norki
03.10.2006, 17:51
Moin!

Vielleicht ist das Problem eher die PollSwitch Funktion. Wenn Asuro 600ms rückwärts fährt, soll er ja sofort wieder vorwärts fahren. Da er aber viel Schwung hat, geht beim Geschwindigkeitswechsel die Batteriespannung in die Knie und die PollSwitchfunktion gibt fälschlicherweise einen Wert aus. Genau das gleiche passiert häufig, wenn sich Asuro festfährt (am Teppich z.B), dann gibt es bei mir auch einen Wert für PollSwitch ohne Tasterdruck.

Das würde ich mal untersuchen.
Mach doch nach Msleep mal MotorSpeed auf 0 dann nochmal Msleep(100) (damit er wirklich steht) und dann lässte ihn wieder fahren.
Vllt gehts dann.
gruß
Norki

fxt
03.10.2006, 17:53
Ehrlich gesagt hab ich keine Ahnung was ich mit dem Inhalt der Seite : http://www.nongnu.org/avr-libc/user.....l/group__util__delay.html jetzt anfangen soll?

stochri
03.10.2006, 17:56
Ist Msleep() eine Standardfunktion aus der asuro.h-Headerdatei?

Jain, Msleep findes Du in späteren Versionen der asuro.c

hier: http://sourceforge.net/projects/asuro

stochri
03.10.2006, 18:05
Vielleicht ist das Problem eher die PollSwitch Funktion. Wenn Asuro 600ms rückwärts fährt, soll er ja sofort wieder vorwärts fahren. Da er aber viel Schwung hat, geht beim Geschwindigkeitswechsel die Batteriespannung in die Knie und die PollSwitchfunktion gibt fälschlicherweise einen Wert aus.
Wie es der Zufall so will, habe ich mich genau heute morgen mit diesem Problem beschäftigt. Ich habe deshalb eine Funktion geschrieben, welche die ADC-Messung umgeht und einfach den Int1 Portpin abfragt. Damit wird absolut zuverlässig detektiert, ob eine Taste gedrückt ist.



uint8_t KeyPressed(void)
{
uint8_t flag;

DDRD &= ~SWITCHES; // High Impedance ( Input )

if(PIND&SWITCHES)flag=FALSE;
else flag=TRUE;

return flag;
}

izaseba
03.10.2006, 18:17
Genau das stochri, das wollte ich auch gerade schreiben,
Wenn man nicht genau wissen will welche Taste gedrückt wurde,ist der externe Interrupt sehr gut!

So habe ich das auch gemacht, wo ich seiner Zeit den Asuro in Assembler programmiert habe...



Ehrlich gesagt hab ich keine Ahnung was ich mit dem Inhalt der Seite : http://www.nongnu.org/avr-libc/user.....l/group__util__delay.html jetzt anfangen soll?


Tja, wenn Du das nicht weiß kann ich Dir auch nicht helfen.
Es geht sich hier in erster Linie um avr-gcc und das ist halt die wichtigste Seite zu diesem Thema...

Gruß Sebastian

stochri
03.10.2006, 18:27
Hallo Sebastian,
das freut mich ja, dass wir die selbe Idee hatten.

Hast Du eigentlich schon mal das ASURO-Rätsel ausprobiert: https://www.roboternetz.de/phpBB2/viewtopic.php?p=214818

Gruss,
stochri

izaseba
03.10.2006, 18:37
Hallo stochri,


Hast Du eigentlich schon mal das ASURO-Rätsel ausprobiert:

Leider nein, ich habe mal meinen Asuro teilweise auseinandergebaut, weil da mal was wichtiges drauf war, was ich unbedingt haben müßte ](*,)
Seitdem liegt er in der Ecke und wartet darauf, wiedermal zusammengebaut zu werden.

Ich fand es auch sehr schade, wo ich Dein Rätsel las, und warte darauf, das man endlich mal sagt, in was für ein "Monster" Du ihn verwandelt hast :-) aber nee, es ist immer noch geheim :-(

Gruß Sebatian

stochri
03.10.2006, 18:58
Leider nein, ich habe mal meinen Asuro teilweise auseinandergebaut, weil da mal was wichtiges drauf war, was ich unbedingt haben müßte

Oh neeeeiiinn ! :-s So wichtig kann ja gar kein Teil sein !



Ich fand es auch sehr schade, wo ich Dein Rätsel las, und warte darauf, das man endlich mal sagt, in was für ein "Monster" Du ihn verwandelt hast Freudig aber nee, es ist immer noch geheim Traurig


Ok, ich werd's Dir hier veraten ( in diesem Thread vermutet ja keiner die Lösung =P~ ).
Obwohl ich es nicht tun sollte, weil es für Dich ja sonst keine Anreitz gibt, den ASURO wieder zu reparieren.

Ich habe eine spezielle Sensormethode um das Programm zu starten benutzt, von der ich geglaubt habe, dass ich als erster herausgefunden habe. War aber nicht so, Arexx-Henk hat es mal in einem seiner Programme benutzt, wie ich später bemerkt habe.
Die Radencoder-Dioden werden mit 36Khz getaktet. Hält man die Hand in einem bestimmten Winkel über den ASURO, kann man das Programm starten ( daran haben sich viele bei dem Rätsel die Zähne ausgebissen ).

Das Programm benutzt die Motoren als Lautsprecher. Das hat Henk auch schon mal gemacht, allerdings nur um einfache periodische Frequenzen zu erzeugen ( OK, er hat eine 2 stimmige Bach Sonate implementiert ).
Bei mir wird ein etwas komplexeres Signal erzeugt, nämlich die Immitation einer schneller werdenden Dampflokomotive.
Ein Dampflokgeräsusch etnseteht, wenn Dampf schnell aus einem Druckzylinder entweicht. D.h. es ist am Anfang laut und am Schluss leiser. Umgesetzt also: Ein Rauschgenerator der von laut nach leise moduliert wird.
Ursprünglich hatte ich Zweifel, dass die Motoren in der Lage sind, ein Breitbandiges Signal ohne grosse Eigenresonanzen zu übertragen ( sodass eher ein Pfeifen als ein Rauschen entsteht ). Aber das Ergebnis war ein echt gut klingendes Dampflokomotivengeräsuch.

izaseba
03.10.2006, 19:06
Hallo stochri,
super Sache :-)
Das mit der Lok hab ich mir ja schon bei dem RN-Treff angeguckt hat wirklich gut geklungen.
Ich werde meinen Asuro bei der nächsten Gelegenheit wieder fit machen.
Das Programm von Arexx-Henk kenn ich auch, es ist allgemein sehr lustig daß man Motoren als Lautsprecher benutzen kann :-)

Danke für die Lösung, ich hoffe, es wird keiner hier reinschauen :-)

Gruß Sebastian

_goto
03.10.2006, 21:13
Ist Msleep() eine Standardfunktion aus der asuro.h-Headerdatei?

Jain, Msleep findes Du in späteren Versionen der asuro.c

hier: http://sourceforge.net/projects/asuro
Vielen Dank für den Link. :D
Da gibts ja mehr als 10mal so viele Funktionen, oder sind im Handbuch vom Asuro nicht alle Funktionen aufgelistet?
Eine Frage hätte ich aber noch, wie installiere ich die neuere Version jetzt genau (unter Linux)?
Einfach die alte asuro.c und asuro.h mit der neuen überschreiben?
Reicht da die Version 4.0.2 vom avr-gcc und die 1.2.5 von der avr-lib?
Habe eben alles nach dieser Anleitung (https://www.roboternetz.de/wissen/index.php/Avr-gcc_und_avrdude_installieren) installiert und die funktioniert leider nicht mit den neusten Versionen. :(

izaseba
03.10.2006, 21:48
Hallo _goto,

Was Funktioniert denn nicht ?

Etwa die Geschichte mit SIGNAL <-> ISR ?

Gruß Sebastian

_goto
03.10.2006, 22:09
Funktionieren tut noch alles, ich wollte nur wissen ob es eine mind. Version der Compilers oder der Bibliothek gibt, für die V2.6 der asuro.c/.h.
Damit ich später nicht stundenlang nach dem Fehler suchen muss. :|

izaseba
03.10.2006, 22:28
ob es eine mind. Version der Compilers oder der Bibliothek gibt, für die V2.6 der asuro.c/.h.

Eher anders herum.

Die Asuro lib scheint schlecht gepflegt zu sein, letzter Update 20 Dezember 2005.

Und in der avr-gcc hat sich in der Zeit einiges getan, signal.h ist rausgeflogen die ISR haben den Namen geändert, manche header Dateien sind irgendwoanders gewandert...

Noch ist es kein Problem, außer einer Kompilerwarnung passiert nichts und Dein Programm wird richtig übersetzt, also keine Sorge.

Früher oder später ist da aber ein Update fällig, oder man passt sich die asuro.c asuro.h selber an.

Gruß Sebastian

stochri
04.10.2006, 17:41
Einfach die alte asuro.c und asuro.h mit der neuen überschreiben?


Die Lib brauch man nicht zu installieren, sie besteht einfach aus asuro.c und asuro.h