Zitat von
Klebwax
Das sehe ich ganz anders. Auch wenn ich kein AVR-Fan bin, ist der Mega2560 schon ziemlich kräftig. Nur mal so zum Vergleich, obwohl die "MIPS" nicht so wirklich vergleichbar sind: für den Mega werden 16 MIPS angegeben, für den ersten PC mit 8088 0,75 MIPS und für die ersten 386 2,15 MIPS (und da lief schonmal Windows drauf). Um deine Aufgaben zu schaffen hat der Mega ausreichend MIPS und eine Menge eingebaute Hardware zur Unterstützung.
ich glaube meine probleme beruhen nicht auf der ungenügenden rechenpower des mega2560, sondern am nicht funktionierendem timing der abläufe "fahren" und "orten"...
Zitat von
Klebwax
Ich versuche mal ein Konzept zu skizzieren, wie das IMHO machbar ist. Es bietet sich an, mit den Steppern anzufangen. Wenn ich mich richtig erinnere, taktest du mit 4ms, wenn es mal etwas schneller sein soll, könnten es auch 2ms sein. Ich würde also einen Timerinterrupt mit ca. 2ms aufsetzen. Von diesem werden unabhängig von der Mainloop die Motoren bedient. Gleichzeitig werden alle Schalter und Kontakte eingelesen und entprellt.
leuchtet absolut ein, ich hatte (und habe teilweise immer noch) schwierigkeiten die kontrolle der Stepper allein so zu machen, dass es einigermassen läuft, anfangs ohne eine lib, dann mit der accelstepper lib und zuletzt mit einem mix von beidem. Stepper allein würden nun laufen, im prinzip so, wie ich es wollte...
Ich bin dann, was die weitergehenden funktionen der roboters betrifft, einem anderen konzept gefolgt, der von Rabenauge beschrieben wurde:
Ich verwende einen timer:
Code:
void timer()
{
aktuelle_timer_millis = millis();
if (aktuelle_timer_millis - vergangene_timer_millis >= interval_timer) // halbe sekunde um
{
vergangene_timer_millis = aktuelle_timer_millis;
halbe_tick ++; // 500ms sind um
if (halbe_tick > 2) // hier ist eine volle Sekunde vorbei
{
halbe_tick = 1; // wechselt alle halbe Sekunde
sekunden_tick++;// wechselt jede volle Sekunde
Serial.println(sekunden_tick);
}
if (sekunden_tick >= 11) // mehr brauchen wir nicht
{
sekunden_tick = 0;
}
}
}
und "sekundenaufgaben"
Code:
void sekunden_aufgaben()
{
if (sekunden_tick == 1)
{
// spannung_messung_gemacht = 0;
}
if ((sekunden_tick == 2) && (spannung_messung_gemacht == 0))
{
// spannung_messen_chip();
// spannung_messen_3();
}
if (sekunden_tick == 3)
{
ping_zwei_sensoren_gemacht = 0;
// myservo.write(35);
}
if ((sekunden_tick == 4) && (ping_zwei_sensoren_gemacht == 0))
{
sonar_2_sensoren ();
start_1();
}
if (sekunden_tick == 5)
{
}
if (sekunden_tick == 6)
{
ping_zwei_sensoren_gemacht = 0;
// myservo.write(70);
}
if ((sekunden_tick == 7) && (ping_zwei_sensoren_gemacht == 0))
{
sonar_2_sensoren ();
start_1();
}
if (sekunden_tick == 8)
{
// hindernis_vorh_mitte_entprellt();
}
if (sekunden_tick == 9)
{
ping_zwei_sensoren_gemacht = 0;
// myservo.write(0);
}
if ((sekunden_tick == 10) && (ping_zwei_sensoren_gemacht == 0))
{
sonar_2_sensoren ();
start_1();
}
if (sekunden_tick == 11)
{
}
}
die beide in der loop() laufen...
Zitat von
Klebwax
Nun zu den US-Sensoren. Eigentlich sind sie ein schlechtes Design. Als sie mal erfunden wurden, waren sie reine Hardware bestehend aus Treiber, OP-Amps und Komparator. Die echte Auswertung musste der µC machen. Soweit war das in Ordnung. Der neueste Schaltplan, den ich gesehen habe, hat aber einen eigenen Prozessor drauf, der das eigentlich erledigen könnte. Um aber mit den alten Teilen kompatibel zu sein, erzeugt der die gleichen Signale wie sie. Aber auch dafür hat der Mega Unterstützung, den Input-Capture. Damit kann man das zeitliche Eintreten einer Taktflanke automatisch aufzeichnen, ohne den Prozessor zu blockieren. Es gibt davon mehrere Einheiten, damit kann man auch mehrere Sensoren, möglicherweise abwechselnd, laufen lassen.
auch die habe ich schon verwendet, ohne dass sich die Stepper (allerdings eine andere art Stepper als die NEMA17 und die customstepper lib) sich mit irgendetwas anderem ins gehege gekommen wären....
Zitat von
Klebwax
Die Vorstellung, daß das Aufteilen der Aufgaben auf mehrere Prozessoren einem das Leben erleichtert, ist trügerisch. Am Ende ist der Aufwand, die µCs zu überwachen und zu synchronisieren und dabei kein Ereignis zu verpassen größer, als alles mit einem zu erledigen.
bei der verwendung der timerfunktion und der sekundenaufgaben dachte ich es wäre (natürlich durch zwei controler und I2C etwas verkompliziert) relativ einfach ein paar werte von einem mc zu generieren (die ortungsabstände) um sie vom anderen controler zu lesen und auszuwerten...
Was die ISR's betrifft, bin ich trotz mehrere kurze anläufe immer wieder davor zurückgeschreckt, wenn sich nur eine andere (vielleicht auch nur vermeintlich einfachere) methode der lösung angeboten habe...
Lesezeichen