oberallgeier
25.03.2009, 23:27
Schönen Abend, allen,
meine C-Kenntnisse sind bekannt schlecht. Wie schlecht habe ich bei der Adaption des ordentlich funktionierenden und vielfach getesteten Programms meines R2D03/Dottie an mein MiniD0/R3D01 (https://www.roboternetz.de/phpBB2/viewtopic.php?p=432909#432909) gemerkt.
Sachstand: Zur Aufnahme der Sprungfunktion muss ein Fahren des Gerätes ohne Regelung möglich sein. Daher habe ich die Regelung ausgeschaltet (wird garnicht aufgerufen). Für einen längeren Fahrtest sollten die Motoren jetzt getrennt fahren:
Stop - allmählich schneller - niedrige Endgeschwindigkeit - allmählich langsamer - Stop
nächster Motor (gleiche Fahrweise).
Zur Sicherstellung, dass das ohne Störung geht - es ist eine gemeinsame Energieversorgung für Controller und Motoren, nur eine Pufferung mit 1x200µF und 1x100nF (ja - dazu noch die 100nF direkt am Controller) - sollte das Fahrzeug ne Weile fahren - da nur ein Motor dreht, gehts immer im Kreis. Codeschnippsel im main (AVRStudio, WinXPpro):
/* while (1)
{
Motst_12(); // Fahre ohne Regelung+Sensoren
Motst_34(); // Fahre ...
} */
for(i=0; i<200; i++) // Fahrtest
{
Motst_12(); // Fahre ohne Regelung+Sensoren
Motst_34(); // Fahre ...
} Die for-Schleife habe ich gemacht, weil die while-Schleife nur 1mal durchlaufen wurde - danach stand alles - danach kommt auch nur noch das "return 0;". Leider läuft auch die for-Schleife nur 1 mal.
Definiert wurde i als uint_8. Sowohl while(1)- als auch for-Schleifen laufen im Code unmittelbar vor diesem Testabschnitt störungsfrei. Für den Fall dass es hilfreich sein könnte, hier auch noch die aufgerufene Routine.
/* ================================================== ============================ */
/*### Motortest 12 "auf-ab", am 24 Mrz 2009, 1710
================================================== ============================== */
void Motst_12(void) // Motor12 vor+zur, aufab
{
uint16_t iwt=1000; //wait-Dauer beim Hoch-/runterfahren der Motoren
uint8_t mimo = 15, mamo = 50; // Min-/Max-Geschwindigkeitsvorgabe Motoren
uint8_t mdiff = 5; // Auf-/Ab-Increment für Motorspeed
uint8_t ll = 0; // Laufvariable
// Einmal hinfahren (vorwärts) ...
Mrechtsvor();
Mlinksstop();
setPWMrechts(0);
waitms(40);
for(ll = mimo; ll<=mamo; ll = ll + mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
setPWMrechts(mamo);
waitms(1000);
for(ll=mamo; ll>=mimo; ll = ll - mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
waitms(10);
setPWMrechts(0);
setPWMlinks(0);
Mlinksstop();
Mrechtsstop();
waitms(10);
// ... und einmal rückwärts
// ... =================
// mimo = 5;
// mamo = 25;
Mlinksstop();
Mrechtszur();
setPWMrechts(0);
waitms(40);
for( ll=mimo; ll<=mamo; ll = ll + mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
setPWMrechts(mamo);
waitms(1000);
for( ll=mamo; ll>=mimo; ll = ll - mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
waitms(10);
setPWMlinks(0);
setPWMrechts(0);
Mlinksstop();
Mrechtsstop();
waitms(10);
return;
}
/* ================================================== ============================ */
Als Massnahme des ratlosen Programmierers hatte ich erstmal die Optimierung von -Os geändert auf -O0. Keine Besserung - nur etwas längerer Hexfile.
Danke für Hilfe
meine C-Kenntnisse sind bekannt schlecht. Wie schlecht habe ich bei der Adaption des ordentlich funktionierenden und vielfach getesteten Programms meines R2D03/Dottie an mein MiniD0/R3D01 (https://www.roboternetz.de/phpBB2/viewtopic.php?p=432909#432909) gemerkt.
Sachstand: Zur Aufnahme der Sprungfunktion muss ein Fahren des Gerätes ohne Regelung möglich sein. Daher habe ich die Regelung ausgeschaltet (wird garnicht aufgerufen). Für einen längeren Fahrtest sollten die Motoren jetzt getrennt fahren:
Stop - allmählich schneller - niedrige Endgeschwindigkeit - allmählich langsamer - Stop
nächster Motor (gleiche Fahrweise).
Zur Sicherstellung, dass das ohne Störung geht - es ist eine gemeinsame Energieversorgung für Controller und Motoren, nur eine Pufferung mit 1x200µF und 1x100nF (ja - dazu noch die 100nF direkt am Controller) - sollte das Fahrzeug ne Weile fahren - da nur ein Motor dreht, gehts immer im Kreis. Codeschnippsel im main (AVRStudio, WinXPpro):
/* while (1)
{
Motst_12(); // Fahre ohne Regelung+Sensoren
Motst_34(); // Fahre ...
} */
for(i=0; i<200; i++) // Fahrtest
{
Motst_12(); // Fahre ohne Regelung+Sensoren
Motst_34(); // Fahre ...
} Die for-Schleife habe ich gemacht, weil die while-Schleife nur 1mal durchlaufen wurde - danach stand alles - danach kommt auch nur noch das "return 0;". Leider läuft auch die for-Schleife nur 1 mal.
Definiert wurde i als uint_8. Sowohl while(1)- als auch for-Schleifen laufen im Code unmittelbar vor diesem Testabschnitt störungsfrei. Für den Fall dass es hilfreich sein könnte, hier auch noch die aufgerufene Routine.
/* ================================================== ============================ */
/*### Motortest 12 "auf-ab", am 24 Mrz 2009, 1710
================================================== ============================== */
void Motst_12(void) // Motor12 vor+zur, aufab
{
uint16_t iwt=1000; //wait-Dauer beim Hoch-/runterfahren der Motoren
uint8_t mimo = 15, mamo = 50; // Min-/Max-Geschwindigkeitsvorgabe Motoren
uint8_t mdiff = 5; // Auf-/Ab-Increment für Motorspeed
uint8_t ll = 0; // Laufvariable
// Einmal hinfahren (vorwärts) ...
Mrechtsvor();
Mlinksstop();
setPWMrechts(0);
waitms(40);
for(ll = mimo; ll<=mamo; ll = ll + mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
setPWMrechts(mamo);
waitms(1000);
for(ll=mamo; ll>=mimo; ll = ll - mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
waitms(10);
setPWMrechts(0);
setPWMlinks(0);
Mlinksstop();
Mrechtsstop();
waitms(10);
// ... und einmal rückwärts
// ... =================
// mimo = 5;
// mamo = 25;
Mlinksstop();
Mrechtszur();
setPWMrechts(0);
waitms(40);
for( ll=mimo; ll<=mamo; ll = ll + mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
setPWMrechts(mamo);
waitms(1000);
for( ll=mamo; ll>=mimo; ll = ll - mdiff)
{
kre=ll;
setPWMrechts(kre);
waitms(iwt);
}
waitms(10);
setPWMlinks(0);
setPWMrechts(0);
Mlinksstop();
Mrechtsstop();
waitms(10);
return;
}
/* ================================================== ============================ */
Als Massnahme des ratlosen Programmierers hatte ich erstmal die Optimierung von -Os geändert auf -O0. Keine Besserung - nur etwas längerer Hexfile.
Danke für Hilfe