radbruch
08.01.2007, 03:12
Hallo mal wieder,
wie angekündigt werde ich euch etwas nerven. *grins*
Die Ausbeute dieser Nacht ist ein gesteuertes Pendeln von Drehzahl 0 bis Max und zurück auf 0 mit einstellbaren Drehzahlen und Rampen. Wunderbar Motoren und Getriebe schonend ermöglicht es ein komfortables Fahren ohne zusätzliche Interrupt-Funktionen. Darauf lege ich im Moment noch Wert. Der Weg zum ersten Nicklaushäuschen ist steil und steinig. Hier mein Code, diesmal ungeputzt, aber dafür so wie er auf meinem asuro läuft:
/* Gesteuertes Vor- und Zurueckpendeln mit einstellbaren Geschwindigkeiten und Rampen
mic 7.1.2006
*/
#include <asuro.h>
unsigned char sw_data, i, tmp_char, step, speed_min, speed_max, rampe_v, rampe_r;
unsigned int data[2], j, tmp_int;
unsigned long loop_count, rampe_delay;
unsigned char odo_bit_l, odo_bit_r;
unsigned int odo_min_l, odo_max_l, odo_low_l, odo_high_l;
unsigned int odo_min_r, odo_max_r, odo_low_r, odo_high_r;
unsigned int count_l, count_r, count_soll_l, count_soll_r;
unsigned int speed_l, speed_r, speed_soll_l, speed_soll_r;
int MotorRampe(unsigned char sp_l, unsigned char sp_r, unsigned int r) {
if (loop_count > rampe_delay) {
if (sp_l != speed_l) {
if (sp_l > speed_l) speed_l ++;
if (sp_l < speed_l) speed_l --;
rampe_delay=loop_count+r*10;
}
if (sp_r != speed_r) {
if (sp_r > speed_r) speed_r ++;
if (sp_r < speed_r) speed_r --;
rampe_delay=loop_count+r*10;
}
MotorSpeed(speed_l,speed_r);
}
return ((sp_l == speed_l) && (sp_r == speed_r));
}
int main(void) {
Init();
SerWrite("\nHallo\nBatterie: ",17);
PrintInt(Batterie());
step=loop_count=rampe_delay=speed_l=speed_r=0;
speed_min=0; speed_max=250; rampe_v=30; rampe_r=50;
do {
loop_count ++;
switch (step) {
case (0): MotorDir(FWD,FWD); FrontLED(ON); BackLED(OFF,OFF); step++; break;
case (1): if (MotorRampe(speed_max,speed_max,rampe_v)) step++; break;
case (2): if (MotorRampe(speed_min,speed_min,rampe_r)) step++; break;
case (3): MotorDir(RWD,RWD); FrontLED(OFF); BackLED(ON,ON); step++; break;
case (4): if (MotorRampe(speed_max,speed_max,rampe_v)) step++; break;
case (5): if (MotorRampe(speed_min,speed_min,rampe_r)) step=0; break;
case (98): MotorDir(BREAK,BREAK); step++; break;
case (99): FrontLED(OFF); BackLED(OFF,OFF); step=99; break;
}
} while (1);
return 0;
}
Viel Spaß damit, es ist aber eigentlich nur eine Vorstufe zu meinen Odometrie-Versuchen die mit den gewöhnlichen MotorDir- und MotorSpeed-Funktionen nicht recht klappen.
Gruß
mic
wie angekündigt werde ich euch etwas nerven. *grins*
Die Ausbeute dieser Nacht ist ein gesteuertes Pendeln von Drehzahl 0 bis Max und zurück auf 0 mit einstellbaren Drehzahlen und Rampen. Wunderbar Motoren und Getriebe schonend ermöglicht es ein komfortables Fahren ohne zusätzliche Interrupt-Funktionen. Darauf lege ich im Moment noch Wert. Der Weg zum ersten Nicklaushäuschen ist steil und steinig. Hier mein Code, diesmal ungeputzt, aber dafür so wie er auf meinem asuro läuft:
/* Gesteuertes Vor- und Zurueckpendeln mit einstellbaren Geschwindigkeiten und Rampen
mic 7.1.2006
*/
#include <asuro.h>
unsigned char sw_data, i, tmp_char, step, speed_min, speed_max, rampe_v, rampe_r;
unsigned int data[2], j, tmp_int;
unsigned long loop_count, rampe_delay;
unsigned char odo_bit_l, odo_bit_r;
unsigned int odo_min_l, odo_max_l, odo_low_l, odo_high_l;
unsigned int odo_min_r, odo_max_r, odo_low_r, odo_high_r;
unsigned int count_l, count_r, count_soll_l, count_soll_r;
unsigned int speed_l, speed_r, speed_soll_l, speed_soll_r;
int MotorRampe(unsigned char sp_l, unsigned char sp_r, unsigned int r) {
if (loop_count > rampe_delay) {
if (sp_l != speed_l) {
if (sp_l > speed_l) speed_l ++;
if (sp_l < speed_l) speed_l --;
rampe_delay=loop_count+r*10;
}
if (sp_r != speed_r) {
if (sp_r > speed_r) speed_r ++;
if (sp_r < speed_r) speed_r --;
rampe_delay=loop_count+r*10;
}
MotorSpeed(speed_l,speed_r);
}
return ((sp_l == speed_l) && (sp_r == speed_r));
}
int main(void) {
Init();
SerWrite("\nHallo\nBatterie: ",17);
PrintInt(Batterie());
step=loop_count=rampe_delay=speed_l=speed_r=0;
speed_min=0; speed_max=250; rampe_v=30; rampe_r=50;
do {
loop_count ++;
switch (step) {
case (0): MotorDir(FWD,FWD); FrontLED(ON); BackLED(OFF,OFF); step++; break;
case (1): if (MotorRampe(speed_max,speed_max,rampe_v)) step++; break;
case (2): if (MotorRampe(speed_min,speed_min,rampe_r)) step++; break;
case (3): MotorDir(RWD,RWD); FrontLED(OFF); BackLED(ON,ON); step++; break;
case (4): if (MotorRampe(speed_max,speed_max,rampe_v)) step++; break;
case (5): if (MotorRampe(speed_min,speed_min,rampe_r)) step=0; break;
case (98): MotorDir(BREAK,BREAK); step++; break;
case (99): FrontLED(OFF); BackLED(OFF,OFF); step=99; break;
}
} while (1);
return 0;
}
Viel Spaß damit, es ist aber eigentlich nur eine Vorstufe zu meinen Odometrie-Versuchen die mit den gewöhnlichen MotorDir- und MotorSpeed-Funktionen nicht recht klappen.
Gruß
mic