Commit from zer0 on branch b_zer0 (2007-12-04 10:28 CET)
=================================
don't erase eeprom when programming
aversive mk/aversive_project.mk 1.32.4.8
===============================
aversive/mk/aversive_project.mk (1.32.4.7 -> 1.32.4.8)
===============================
@@ -128,7 +128,7 @@
#AVRDUDE_FLAGS += -v -v
-AVARICE_WRITE_FLASH = --erase --program --file $(TARGET).$(FORMAT_EXTENSION)
+AVARICE_WRITE_FLASH = --program --file $(TARGET).$(FORMAT_EXTENSION)
#AVARICE_WRITE_EEPROM = XXX
export AVARICE_FLAGS = -P $(MCU) --jtag $(AVARICE_PORT) --$(AVARICE_PROGRAMMER)
Commit from zer0 on branch b_zer0 (2007-12-04 10:29 CET)
=================================
pid maxmiums are uint32_t
aversive modules/devices/control_system/filters/pid/pid.c 1.5.4.3
aversive modules/devices/control_system/filters/pid/pid.h 1.4.4.4
=========================================================
aversive/modules/devices/control_system/filters/pid/pid.c (1.5.4.2 -> 1.5.4.3)
=========================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: pid.c,v 1.5.4.2 2007-05-12 16:42:39 zer0 Exp $
+ * Revision : $Id: pid.c,v 1.5.4.3 2007-12-04 09:29:25 zer0 Exp $
*
*/
@@ -77,17 +77,17 @@
}
-int16_t pid_get_max_in(struct pid_filter *p)
+int32_t pid_get_max_in(struct pid_filter *p)
{
return (p->max_in);
}
-int16_t pid_get_max_I(struct pid_filter *p)
+int32_t pid_get_max_I(struct pid_filter *p)
{
return (p->max_I);
}
-int16_t pid_get_max_out(struct pid_filter *p)
+int32_t pid_get_max_out(struct pid_filter *p)
{
return (p->max_out);
}
=========================================================
aversive/modules/devices/control_system/filters/pid/pid.h (1.4.4.3 -> 1.4.4.4)
=========================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: pid.h,v 1.4.4.3 2007-05-23 17:18:13 zer0 Exp $
+ * Revision : $Id: pid.h,v 1.4.4.4 2007-12-04 09:29:25 zer0 Exp $
*
*/
@@ -57,9 +57,9 @@
int16_t pid_get_gain_P(struct pid_filter *p);
int16_t pid_get_gain_I(struct pid_filter *p);
int16_t pid_get_gain_D(struct pid_filter *p);
-int16_t pid_get_max_in(struct pid_filter *p);
-int16_t pid_get_max_I(struct pid_filter *p);
-int16_t pid_get_max_out(struct pid_filter *p);
+int32_t pid_get_max_in(struct pid_filter *p);
+int32_t pid_get_max_I(struct pid_filter *p);
+int32_t pid_get_max_out(struct pid_filter *p);
uint8_t pid_get_out_shift(struct pid_filter *p);
int32_t pid_get_value_I(struct pid_filter *p);
Commit from zer0 on branch b_zer0 (2007-12-04 10:30 CET)
=================================
fix bug in turn_to_xy()
update interface in .h
aversive modules/devices/robot/trajectory_manager/trajectory_manager.c
1.4.4.6
aversive modules/devices/robot/trajectory_manager/trajectory_manager.h
1.4.4.4
======================================================================
aversive/modules/devices/robot/trajectory_manager/trajectory_manager.c
(1.4.4.5 -> 1.4.4.6)
======================================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: trajectory_manager.c,v 1.4.4.5 2007-06-07 12:22:52 zer0
Exp $
+ * Revision : $Id: trajectory_manager.c,v 1.4.4.6 2007-12-04 09:30:58 zer0
Exp $
*
*/
@@ -203,7 +203,13 @@
void __trajectory_goto_d_a_rel(struct trajectory* traj, double d_cm, double
a_rad, uint8_t flags)
{
int32_t a_consign, d_consign;
- DEBUG(E_TRAJECTORY, "Goto DA/RS rel");
+ /* XXX only used for debug */
+ double posx = position_get_x_double(traj->position);
+ double posy = position_get_y_double(traj->position);
+ double posa = position_get_a_rad_double(traj->position);
+
+ DEBUG(E_TRAJECTORY, "Goto DA/RS rel to d=%f a_rad=%f", d_cm, a_rad);
+ DEBUG(E_TRAJECTORY, "current pos = x=%f, y=%f, a_rad=%f", posx, posy,
posa);
delete_event(traj);
set_quadramp_speed(traj, traj->d_speed, traj->a_speed);
if (flags & UPDATE_A) {
@@ -255,9 +261,11 @@
{
double posx = position_get_x_double(traj->position);
double posy = position_get_y_double(traj->position);
+ double posa = position_get_a_rad_double(traj->position);
traj->state = RUNNING_A;
- __trajectory_goto_d_a_rel(traj, 0, atan2(y_abs_cm - posy, x_abs_cm -
posx),
+ DEBUG(E_TRAJECTORY, "Goto Turn To xy %f %f", x_abs_cm, y_abs_cm);
+ __trajectory_goto_d_a_rel(traj, 0, simple_modulo_2pi(atan2(y_abs_cm -
posy, x_abs_cm - posx) - posa),
UPDATE_A | UPDATE_D | RESET_D);
}
@@ -340,7 +348,7 @@
set_quadramp_speed(traj, traj->d_speed, traj->a_speed);
delete_event(traj);
p.r = d;
- p.theta = (a * M_PI / 180.0) +
position_get_a_rad_double(traj->position);;
+ p.theta = (a * M_PI / 180.0) +
position_get_a_rad_double(traj->position);
vect2_pol2cart(&p, &traj->target.cart);
traj->target.cart.x += x;
traj->target.cart.y += y;
======================================================================
aversive/modules/devices/robot/trajectory_manager/trajectory_manager.h
(1.4.4.3 -> 1.4.4.4)
======================================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: trajectory_manager.h,v 1.4.4.3 2007-06-01 09:37:22 zer0
Exp $
+ * Revision : $Id: trajectory_manager.h,v 1.4.4.4 2007-12-04 09:30:58 zer0
Exp $
*
*/
@@ -66,70 +66,63 @@
void trajectory_init(struct trajectory * traj);
/** structure initialization */
-void trajectory_set_cs(struct trajectory * traj, struct cs * cs_d, struct cs *
cs_a);
+void trajectory_set_cs(struct trajectory * traj, struct cs * cs_d,
+ struct cs * cs_a);
/** structure initialization */
-void trajectory_set_robot_params(struct trajectory * traj, struct robot_system
* rs,
- struct
robot_position * pos);
+void trajectory_set_robot_params(struct trajectory * traj,
+ struct robot_system * rs,
+ struct robot_position * pos) ;
-/** initialisation of target windows */
-void trajectory_set_windows(struct trajectory * traj, double d_win, double
a_win_deg);
-
-/** go to (x,y,a) */
-void trajectory_goto_xya( struct trajectory * traj, double x, double y, double
a );
-
-/** go to (x,y) */
-void trajectory_goto_xy( struct trajectory * traj, double x, double y );
+/** set speed consign */
+void trajectory_set_speed(struct trajectory * traj, int16_t d_speed, int16_t
a_speed);
-/** go to (x,y,a) */
-void trajectory_goto_forward_xya( struct trajectory * traj, double x, double
y, double a );
-
-/** go to (x,y) */
-void trajectory_goto_forward_xy( struct trajectory * traj, double x, double y
);
-
-void trajectory_turnto_xy( struct trajectory* traj, double tx, double ty );
+/** set windows for trajectory */
+void trajectory_set_windows(struct trajectory * traj, double d_win, double
a_win_deg);
-/** go to (a) */
-void trajectory_goto_a( struct trajectory * traj, double a );
+/** go straight forward (d is in cm) */
+void trajectory_d_rel(struct trajectory * traj, double d_cm);
-/* set speed */
-void trajectory_set_speed( struct trajectory * traj, int16_t speed_d, int16_t
speed_a);
+/** update distance consign without changing angle consign */
+void trajectory_only_d_rel(struct trajectory * traj, double d_cm);
-/** go to (d,a) relative */
-/* ?? useful ?? */
-void trajectory_goto_rs_d_a_rel( struct trajectory * traj, double d, double a
);
+/** turn by 'a' degrees */
+void trajectory_a_rel(struct trajectory * traj, double a_deg);
-/** go to (d,a) relative */
-void trajectory_goto_d_a_rel( struct trajectory * traj, double d, double a );
+/** turn the robot until the point x,y is in front of us */
+void trajectory_turnto_xy(struct trajectory* traj, double x_abs_cm, double
y_abs_cm);
-/** go to (x,y) relative */
-void trajectory_goto_xy_rel( struct trajectory* traj, double tx, double ty );
+/** update angle consign without changing distance consign */
+void trajectory_only_a_rel(struct trajectory * traj, double a_deg);
-/** go to (a) relative */
-void trajectory_goto_a_rel( struct trajectory * traj, double a );
+/** turn by 'a' degrees */
+void trajectory_d_a_rel(struct trajectory * traj, double d_cm, double a_deg);
-/* speed control system.... beta test */
-void trajectory_speed_d_a( struct trajectory* traj, int16_t speed_d, int16_t
speed_a, int32_t d );
+/** set relative angle and distance consign to 0 */
+void trajectory_stop(struct trajectory * traj);
-/** only change d */
-void trajectory_only_d( struct trajectory * traj, double d );
+/** set relative angle and distance consign to 0, and break any
+ * deceleration ramp in quadramp filter */
+void trajectory_hardstop(struct trajectory * traj);
-/** only change a */
-void trajectory_only_a( struct trajectory * traj, double a );
+/** goto a x,y point, using a trajectory event */
+void trajectory_goto_xy_abs(struct trajectory * traj, double x, double y);
-/** stop robot */
-void trajectory_stop( struct trajectory * traj );
+/** go forward to a x,y point, using a trajectory event */
+void trajectory_goto_forward_xy_abs(struct trajectory * traj, double x, double
y);
-/** stop robot, but better */
-void trajectory_hardstop( struct trajectory * traj );
+/** go forward to a d,a point, using a trajectory event */
+void trajectory_goto_d_a_rel(struct trajectory* traj, double d, double a);
-/** go to (d) relative */
-void trajectory_straight( struct trajectory * traj, double d );
+/** go forward to a x,y relative point, using a trajectory event */
+void trajectory_goto_xy_rel(struct trajectory* traj, double x_rel_cm, double
y_rel_cm);
-/* return 1 if trajectory is finished */
-uint8_t trajectory_finished( struct trajectory* traj);
+/** return true if the position consign is equal to the filtered
+ * position consign (after quadramp filter), for angle and
+ * distance. */
+uint8_t trajectory_finished(struct trajectory* traj);
-/* return 1 if trajectory is "nearly" (hum) finished */
-uint8_t trajectory_nearly_finished(struct trajectory* traj);
+/** return true if traj is nearly finished */
+uint8_t trajectory_in_window(struct trajectory* traj);
#endif //TRAJECTORY_MANAGER
Commit from zer0 on branch b_zer0 (2007-12-04 10:31 CET)
=================================
update defaults values in rdline.h, but it will go in a config file in
the future.
aversive modules/ihm/rdline/rdline.h 1.1.2.4
====================================
aversive/modules/ihm/rdline/rdline.h (1.1.2.3 -> 1.1.2.4)
====================================
@@ -16,7 +16,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: rdline.h,v 1.1.2.3 2007-11-21 21:54:39 zer0 Exp $
+ * Revision : $Id: rdline.h,v 1.1.2.4 2007-12-04 09:31:45 zer0 Exp $
*
*
*/
@@ -77,11 +77,11 @@
#define vt100_word_right "\033\146"
/* configuration */
-#define RDLINE_BUF_SIZE 32
+#define RDLINE_BUF_SIZE 64
#define RDLINE_PROMPT_SIZE 16
-#define RDLINE_VT100_BUF_SIZE 16
+#define RDLINE_VT100_BUF_SIZE 8
#define RDLINE_HISTORY_BUF_SIZE 128
-#define RDLINE_HISTORY_MAX_LINE 32
+#define RDLINE_HISTORY_MAX_LINE 64
enum vt100_parser_state {
VT100_INIT,
Commit from zer0 (2007-12-04 10:38 CET)
================
Start control system debugging.
- Add profiling ability in code
- Control system debugging can be activated in live
- Add a python script to display control system curves
- New commands to set/get gains
- Start a function to store configuration in eeprom
- Use new trajectory manager
aversive_projects microb2008/main/.config 1.9
aversive_projects microb2008/main/Makefile 1.4
aversive_projects microb2008/main/commands.c 1.5
+ aversive_projects microb2008/main/eeprom.c 1.1
+ aversive_projects microb2008/main/eeprom.h 1.1
aversive_projects microb2008/main/main.c 1.10
aversive_projects microb2008/main/main.h 1.5
+ aversive_projects microb2008/main/parse_cs_debug.py 1.1
aversive_projects microb2008/main/pwm_config.h 1.3
aversive_projects microb2008/main/scheduler_config.h 1.3
aversive_projects microb2008/main/time_config.h 1.2
aversive_projects microb2008/main/uart_config.h 1.2
=========================================
aversive_projects/microb2008/main/.config (1.8 -> 1.9)
=========================================
@@ -208,7 +208,7 @@
# CONFIG_AVRDUDE_PROG_BSD is not set
# CONFIG_AVRDUDE_PROG_DAPA is not set
# CONFIG_AVRDUDE_PROG_JTAG1 is not set
-CONFIG_AVRDUDE_PORT="/dev/parport0"
+CONFIG_AVRDUDE_PORT="/dev/.static/dev/parport0"
#
# Avarice
==========================================
aversive_projects/microb2008/main/Makefile (1.3 -> 1.4)
==========================================
@@ -7,7 +7,7 @@
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c cam.c test.c action.c sensor.c i2c_protocol.c \
-strat_base.c strat.c commands.c
+strat_base.c strat.c commands.c eeprom.c
# List Assembler source files here.
# Make them always end in a capital .S. Files ending in a lowercase .s
============================================
aversive_projects/microb2008/main/commands.c (1.4 -> 1.5)
============================================
@@ -8,11 +8,14 @@
#include <pwm.h>
#include <encoders_microb.h>
#include <uart.h>
+#include <scheduler.h>
#include <parse.h>
#include <parse_num.h>
#include <parse_string.h>
+#include <trajectory_manager.h>
#include "main.h"
+#include "eeprom.h"
//#include "test.h"
#include "sensor.h"
@@ -206,6 +209,147 @@
};
+/**********************************************************/
+/* Speeds for control system */
+
+/* this structure is filled when cmd_speed is parsed successfully */
+struct cmd_speed_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+ uint16_t s;
+};
+
+/* function called when cmd_speed is parsed successfully */
+static void cmd_speed_parsed(void * parsed_result, void * data)
+{
+ struct cmd_speed_result * res = parsed_result;
+
+ if (!strcmp_P(res->arg1, PSTR("angle"))) {
+ trajectory_set_speed(&robot.traj, robot.traj.d_speed, res->s);
+ }
+ else if (!strcmp_P(res->arg1, PSTR("distance"))) {
+ trajectory_set_speed(&robot.traj, res->s, robot.traj.a_speed);
+ }
+ /* else it is a "show" */
+
+ printf_P(PSTR("angle %u, distance %u\n"),
+ robot.traj.a_speed,
+ robot.traj.d_speed);
+}
+
+prog_char str_speed_arg0[] = "speed";
+parse_pgm_token_string_t cmd_speed_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_speed_result, arg0, str_speed_arg0);
+prog_char str_speed_arg1[] = "angle#distance";
+parse_pgm_token_string_t cmd_speed_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_speed_result, arg1, str_speed_arg1);
+parse_pgm_token_num_t cmd_speed_s = TOKEN_NUM_INITIALIZER(struct
cmd_speed_result, s, UINT16);
+
+prog_char help_speed[] = "Set speed values for trajectory manager";
+parse_pgm_inst_t cmd_speed = {
+ .f = cmd_speed_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_speed,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_speed_arg0,
+ (prog_void *)&cmd_speed_arg1,
+ (prog_void *)&cmd_speed_s,
+ NULL,
+ },
+};
+
+/* show */
+
+prog_char str_speed_show_arg[] = "show";
+parse_pgm_token_string_t cmd_speed_show_arg = TOKEN_STRING_INITIALIZER(struct
cmd_speed_result, arg1, str_speed_show_arg);
+
+prog_char help_speed_show[] = "Show speed values for trajectory manager";
+parse_pgm_inst_t cmd_speed_show = {
+ .f = cmd_speed_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_speed_show,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_speed_arg0,
+ (prog_void *)&cmd_speed_show_arg,
+ NULL,
+ },
+};
+
+
+/**********************************************************/
+/* Maximums for control system */
+
+/* this structure is filled when cmd_maximum is parsed successfully */
+struct cmd_maximum_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+ uint32_t in;
+ uint32_t i;
+ uint32_t out;
+};
+
+/* function called when cmd_maximum is parsed successfully */
+static void cmd_maximum_parsed(void * parsed_result, void * data)
+{
+ struct cmd_maximum_result * res = parsed_result;
+
+ if (!strcmp_P(res->arg1, PSTR("angle"))) {
+ pid_set_maximums(&robot.pid_a, res->in, res->i, res->out);
+ }
+ else if (!strcmp_P(res->arg1, PSTR("distance"))) {
+ pid_set_maximums(&robot.pid_d, res->in, res->i, res->out);
+ }
+ /* else it is a "show" */
+
+ printf_P(PSTR("angle %lu %lu %lu\n"),
+ pid_get_max_in(&robot.pid_a),
+ pid_get_max_I(&robot.pid_a),
+ pid_get_max_out(&robot.pid_a));
+ printf_P(PSTR("distance %lu %lu %lu\n"),
+ pid_get_max_in(&robot.pid_d),
+ pid_get_max_I(&robot.pid_d),
+ pid_get_max_out(&robot.pid_d));
+}
+
+prog_char str_maximum_arg0[] = "maximum";
+parse_pgm_token_string_t cmd_maximum_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_maximum_result, arg0, str_maximum_arg0);
+prog_char str_maximum_arg1[] = "angle#distance";
+parse_pgm_token_string_t cmd_maximum_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_maximum_result, arg1, str_maximum_arg1);
+parse_pgm_token_num_t cmd_maximum_in = TOKEN_NUM_INITIALIZER(struct
cmd_maximum_result, in, UINT32);
+parse_pgm_token_num_t cmd_maximum_i = TOKEN_NUM_INITIALIZER(struct
cmd_maximum_result, i, UINT32);
+parse_pgm_token_num_t cmd_maximum_out = TOKEN_NUM_INITIALIZER(struct
cmd_maximum_result, out, UINT32);
+
+prog_char help_maximum[] = "Set maximum values for PID (in, I, out)";
+parse_pgm_inst_t cmd_maximum = {
+ .f = cmd_maximum_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_maximum,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_maximum_arg0,
+ (prog_void *)&cmd_maximum_arg1,
+ (prog_void *)&cmd_maximum_in,
+ (prog_void *)&cmd_maximum_i,
+ (prog_void *)&cmd_maximum_out,
+ NULL,
+ },
+};
+
+/* show */
+
+prog_char str_maximum_show_arg[] = "show";
+parse_pgm_token_string_t cmd_maximum_show_arg =
TOKEN_STRING_INITIALIZER(struct cmd_maximum_result, arg1, str_maximum_show_arg);
+
+prog_char help_maximum_show[] = "Show maximum values for PID";
+parse_pgm_inst_t cmd_maximum_show = {
+ .f = cmd_maximum_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_maximum_show,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_maximum_arg0,
+ (prog_void *)&cmd_maximum_show_arg,
+ NULL,
+ },
+};
+
+
/**********************************************************/
@@ -311,11 +455,12 @@
{
struct cmd_consign_result * res = parsed_result;
-#ifdef DEBUG_ASSERV
- wait_ms(100);
- printf(PSTR("\nasserv debug start\n"));
- to_dump = 0;
-#endif /* DEBUG_ASSERV */
+ if (robot.debug & DEBUG_CS) {
+ wait_ms(100);
+ printf(PSTR("\npress a key\ncs debug start\n"));
+ while(uart0_recv_nowait() == -1);
+ to_dump = 0;
+ }
if (!strcmp_P(res->arg1, PSTR("angle"))) {
cs_set_consign(&robot.cs_a, res->arg2);
}
@@ -326,10 +471,11 @@
cs_set_consign(&robot.cs_d, res->arg2);
cs_set_consign(&robot.cs_a, res->arg3);
}
-#ifdef DEBUG_ASSERV
- to_dump = 2;
- printf(PSTR("\nasserv debug end\n"));
-#endif /* DEBUG_ASSERV */
+ if (robot.debug & DEBUG_CS) {
+ while(uart0_recv_nowait() == -1);
+ to_dump = 2;
+ printf(PSTR("cs debug end\n"));
+ }
}
prog_char str_consign_arg0[] = "consign";
@@ -392,31 +538,36 @@
struct cmd_goto_result * res = parsed_result;
if (!strcmp_P(res->arg1, PSTR("a_rel"))) {
- trajectory_goto_a_rel(&robot.traj, res->arg2);
+ trajectory_a_rel(&robot.traj, res->arg2);
+ }
+ else if (!strcmp_P(res->arg1, PSTR("d_rel"))) {
+ trajectory_d_rel(&robot.traj, res->arg2);
}
else if (!strcmp_P(res->arg1, PSTR("a_abs"))) {
- trajectory_goto_a(&robot.traj, res->arg2);
+ // trajectory_goto_a(&robot.traj, res->arg2);
+ printf_P(PSTR("not implemented\n"));
+ }
+ else if (!strcmp_P(res->arg1, PSTR("a_to_xy"))) {
+ trajectory_turnto_xy(&robot.traj, res->arg2, res->arg3);
}
else if (!strcmp_P(res->arg1, PSTR("xy_rel"))) {
trajectory_goto_xy_rel(&robot.traj, res->arg2, res->arg3);
}
else if (!strcmp_P(res->arg1, PSTR("xy_abs"))) {
- trajectory_goto_xy(&robot.traj, res->arg2, res->arg3);
+ trajectory_goto_xy_abs(&robot.traj, res->arg2, res->arg3);
}
else if (!strcmp_P(res->arg1, PSTR("da_rel"))) {
- trajectory_goto_d_a_rel(&robot.traj, res->arg2, res->arg3);
- }
- else if (!strcmp_P(res->arg1, PSTR("da_rs_rel"))) {
- trajectory_goto_rs_d_a_rel(&robot.traj, res->arg2, res->arg3);
+ trajectory_d_a_rel(&robot.traj, res->arg2, res->arg3);
}
else if (!strcmp_P(res->arg1, PSTR("xya_abs"))) {
- trajectory_goto_xya(&robot.traj, res->arg2, res->arg3,
res->arg4);
+ printf_P(PSTR("not implemented\n"));
+ //trajectory_goto_xya(&robot.traj, res->arg2, res->arg3,
res->arg4);
}
}
prog_char str_goto_arg0[] = "goto";
parse_pgm_token_string_t cmd_goto_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_goto_result, arg0, str_goto_arg0);
-prog_char str_goto_arg1_a[] = "a_rel#a_abs";
+prog_char str_goto_arg1_a[] = "d_rel#a_rel#a_abs";
parse_pgm_token_string_t cmd_goto_arg1_a = TOKEN_STRING_INITIALIZER(struct
cmd_goto_result, arg1, str_goto_arg1_a);
parse_pgm_token_num_t cmd_goto_arg2 = TOKEN_NUM_INITIALIZER(struct
cmd_goto_result, arg2, INT32);
@@ -434,7 +585,7 @@
},
};
-prog_char str_goto_arg1_b[] = "xy_rel#xy_abs#da_rel#da_rs_rel";
+prog_char str_goto_arg1_b[] = "xy_rel#xy_abs#da_rel#a_to_xy";
parse_pgm_token_string_t cmd_goto_arg1_b = TOKEN_STRING_INITIALIZER(struct
cmd_goto_result, arg1, str_goto_arg1_b);
parse_pgm_token_num_t cmd_goto_arg3 = TOKEN_NUM_INITIALIZER(struct
cmd_goto_result, arg3, INT32);
@@ -637,6 +788,64 @@
/**********************************************************/
+/* Save */
+
+/* this structure is filled when cmd_save is parsed successfully */
+struct cmd_save_result {
+ fixed_string_t arg0;
+};
+
+/* function called when cmd_save is parsed successfully */
+static void cmd_save_parsed(void * parsed_result, void * data)
+{
+ save_conf();
+}
+
+prog_char str_save_arg0[] = "save";
+parse_pgm_token_string_t cmd_save_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_save_result, arg0, str_save_arg0);
+
+prog_char help_save[] = "Save the configuration";
+parse_pgm_inst_t cmd_save = {
+ .f = cmd_save_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_save,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_save_arg0,
+ NULL,
+ },
+};
+
+
+/**********************************************************/
+/* Load */
+
+/* this structure is filled when cmd_load is parsed successfully */
+struct cmd_load_result {
+ fixed_string_t arg0;
+};
+
+/* function called when cmd_load is parsed successfully */
+static void cmd_load_parsed(void * parsed_result, void * data)
+{
+ load_conf();
+}
+
+prog_char str_load_arg0[] = "load";
+parse_pgm_token_string_t cmd_load_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_load_result, arg0, str_load_arg0);
+
+prog_char help_load[] = "Load the configuration";
+parse_pgm_inst_t cmd_load = {
+ .f = cmd_load_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_load,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_load_arg0,
+ NULL,
+ },
+};
+
+
+/**********************************************************/
/* Start */
/* this structure is filled when cmd_start is parsed successfully */
@@ -714,6 +923,90 @@
/**********************************************************/
+/* Debug */
+
+/* used for cs debugging */
+volatile uint8_t to_dump = 2;
+struct cs_debug cs_debug_a;
+struct cs_debug cs_debug_d;
+int8_t debug_cs_evt = -1;
+
+/* used for cs debugging */
+void debug_cs(void * dummy)
+{
+ uint8_t i;
+ uint8_t flags;
+
+ IRQ_LOCK(flags);
+ if (to_dump == 1) {
+ IRQ_UNLOCK(flags);
+ for (i=0; i< sizeof(struct cs_debug); i++) {
+ uart0_send( ((char *)&cs_debug_a)[i] );
+ }
+ for (i=0; i< sizeof(struct cs_debug); i++) {
+ uart0_send( ((char *)&cs_debug_d)[i] );
+ }
+ to_dump = 0;
+ }
+ else {
+ IRQ_UNLOCK(flags);
+ }
+}
+
+
+
+/* this structure is filled when cmd_debug is parsed successfully */
+struct cmd_debug_result {
+ fixed_string_t arg0;
+ fixed_string_t arg1;
+ fixed_string_t arg2;
+};
+
+/* function called when cmd_debug is parsed successfully */
+static void cmd_debug_parsed(void * parsed_result, void * data)
+{
+ struct cmd_debug_result *res = (struct cmd_debug_result *)
parsed_result;
+
+ if (!strcmp_P(res->arg1, PSTR("cs"))) {
+ if (!strcmp_P(res->arg2, PSTR("on"))) {
+ debug_cs_evt =
scheduler_add_periodical_event_priority(debug_cs, NULL,
+
5000L / SCHEDULER_UNIT, CS_PRIO-1);
+ robot.debug |= DEBUG_CS;
+ }
+ else if (!strcmp_P(res->arg2, PSTR("off"))) {
+ robot.debug &= (~DEBUG_CS);
+ scheduler_del_event(debug_cs_evt);
+ debug_cs_evt = -1;
+ }
+ else { /* show */
+ printf_P(PSTR("cs is %S\n"),
+ robot.debug & DEBUG_CS ? PSTR("off") :
PSTR("on"));
+ }
+ }
+}
+
+prog_char str_debug_arg0[] = "debug";
+parse_pgm_token_string_t cmd_debug_arg0 = TOKEN_STRING_INITIALIZER(struct
cmd_debug_result, arg0, str_debug_arg0);
+prog_char str_debug_arg1[] = "cs";
+parse_pgm_token_string_t cmd_debug_arg1 = TOKEN_STRING_INITIALIZER(struct
cmd_debug_result, arg1, str_debug_arg1);
+prog_char str_debug_arg2[] = "on#off#show";
+parse_pgm_token_string_t cmd_debug_arg2 = TOKEN_STRING_INITIALIZER(struct
cmd_debug_result, arg2, str_debug_arg2);
+
+
+prog_char help_debug[] = "Enable/disable debug";
+parse_pgm_inst_t cmd_debug = {
+ .f = cmd_debug_parsed, /* function to call */
+ .data = NULL, /* 2nd arg of func */
+ .help_str = help_debug,
+ .tokens = { /* token list, NULL terminated */
+ (prog_void *)&cmd_debug_arg0,
+ (prog_void *)&cmd_debug_arg1,
+ (prog_void *)&cmd_debug_arg2,
+ NULL,
+ },
+};
+
+/**********************************************************/
/* Interact */
/* this structure is filled when cmd_interact is parsed successfully */
@@ -855,7 +1148,8 @@
case 'u':
if(robot.cs_events & DO_CS) {
- trajectory_speed_d_a(&robot.traj, 1000, 0, 0);
+ //trajectory_set_speed(&robot.traj, 1000, 0, 0);
+ printf_P(PSTR("not implemented\n"));
}
else {
pwm_set(LEFT_PWM, 800);
@@ -864,7 +1158,8 @@
break;
case 'h':
if(robot.cs_events & DO_CS) {
- trajectory_speed_d_a(&robot.traj, 0, 500, 0);
+ //trajectory_set_speed(&robot.traj, 0, 500, 0);
+ printf_P(PSTR("not implemented\n"));
}
else {
pwm_set(LEFT_PWM, -800);
@@ -873,7 +1168,8 @@
break;
case 'j':
if(robot.cs_events & DO_CS) {
- trajectory_speed_d_a(&robot.traj, -1000, 0, 0);
+ //trajectory_set_speed(&robot.traj, -1000, 0,
0);
+ printf_P(PSTR("not implemented\n"));
}
else {
pwm_set(LEFT_PWM, -800);
@@ -882,7 +1178,8 @@
break;
case 'k':
if(robot.cs_events & DO_CS) {
- trajectory_speed_d_a(&robot.traj, 0, -500, 0);
+ //trajectory_set_speed(&robot.traj, 0, -500, 0);
+ printf_P(PSTR("not implemented\n"));
}
else {
pwm_set(LEFT_PWM, 800);
@@ -945,18 +1242,25 @@
(parse_pgm_inst_t *)&cmd_pwm,
(parse_pgm_inst_t *)&cmd_gain,
(parse_pgm_inst_t *)&cmd_gain_show,
+ (parse_pgm_inst_t *)&cmd_maximum,
+ (parse_pgm_inst_t *)&cmd_maximum_show,
(parse_pgm_inst_t *)&cmd_quadramp,
(parse_pgm_inst_t *)&cmd_quadramp_show,
(parse_pgm_inst_t *)&cmd_encoders,
(parse_pgm_inst_t *)&cmd_position,
(parse_pgm_inst_t *)&cmd_reset,
+ (parse_pgm_inst_t *)&cmd_save,
+ (parse_pgm_inst_t *)&cmd_load,
(parse_pgm_inst_t *)&cmd_interact,
(parse_pgm_inst_t *)&cmd_log,
+ (parse_pgm_inst_t *)&cmd_debug,
(parse_pgm_inst_t *)&cmd_start,
(parse_pgm_inst_t *)&cmd_consign,
(parse_pgm_inst_t *)&cmd_consign_all,
(parse_pgm_inst_t *)&cmd_goto1,
(parse_pgm_inst_t *)&cmd_goto2,
(parse_pgm_inst_t *)&cmd_goto3,
+ (parse_pgm_inst_t *)&cmd_speed,
+ (parse_pgm_inst_t *)&cmd_speed_show,
NULL,
};
==========================================
aversive_projects/microb2008/main/eeprom.c (1.1)
==========================================
@@ -0,0 +1,93 @@
+/*
+ * Copyright Droids Corporation, Microb Technology, Eirbot (2005)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Revision : $Id: eeprom.c,v 1.1 2007-12-04 09:38:52 zer0 Exp $
+ *
+ */
+
+#include <avr/eeprom.h>
+
+#include "eeprom.h"
+#include "main.h"
+
+
+void load_conf(void)
+{
+ struct robot_conf robot_conf;
+
+ eeprom_read_block(&robot_conf, (uint8_t *)0,
+ sizeof(struct robot_conf));
+
+ robot.pid_a.gain_P = robot_conf.pid_a_gain_P;
+ robot.pid_a.gain_I = robot_conf.pid_a_gain_I;
+ robot.pid_a.gain_D = robot_conf.pid_a_gain_D;
+ robot.pid_a.max_in = robot_conf.pid_a_max_in;
+ robot.pid_a.max_I = robot_conf.pid_a_max_I;
+ robot.pid_a.max_out = robot_conf.pid_a_max_out;
+
+ robot.pid_d.gain_P = robot_conf.pid_d_gain_P;
+ robot.pid_d.gain_I = robot_conf.pid_d_gain_I;
+ robot.pid_d.gain_D = robot_conf.pid_d_gain_D;
+ robot.pid_d.max_in = robot_conf.pid_d_max_in;
+ robot.pid_d.max_I = robot_conf.pid_d_max_I;
+ robot.pid_d.max_out = robot_conf.pid_d_max_out;
+
+ robot.qr_a.var_2nd_ord_pos = robot_conf.qa_var_2nd_ord_pos;
+ robot.qr_a.var_2nd_ord_neg = robot_conf.qa_var_2nd_ord_neg;
+ robot.qr_a.var_1st_ord_pos = robot_conf.qa_var_1st_ord_pos;
+ robot.qr_a.var_1st_ord_neg = robot_conf.qa_var_1st_ord_neg;
+
+ robot.qr_d.var_2nd_ord_pos = robot_conf.qd_var_2nd_ord_pos;
+ robot.qr_d.var_2nd_ord_neg = robot_conf.qd_var_2nd_ord_neg;
+ robot.qr_d.var_1st_ord_pos = robot_conf.qd_var_1st_ord_pos;
+ robot.qr_d.var_1st_ord_neg = robot_conf.qd_var_1st_ord_neg;
+}
+
+void save_conf(void)
+{
+ struct robot_conf robot_conf;
+
+ robot_conf.pid_a_gain_P = robot.pid_a.gain_P;
+ robot_conf.pid_a_gain_I = robot.pid_a.gain_I;
+ robot_conf.pid_a_gain_D = robot.pid_a.gain_D;
+ robot_conf.pid_a_max_in = robot.pid_a.max_in;
+ robot_conf.pid_a_max_I = robot.pid_a.max_I;
+ robot_conf.pid_a_max_out = robot.pid_a.max_out;
+
+ robot_conf.pid_d_gain_P = robot.pid_d.gain_P;
+ robot_conf.pid_d_gain_I = robot.pid_d.gain_I;
+ robot_conf.pid_d_gain_D = robot.pid_d.gain_D;
+ robot_conf.pid_d_max_in = robot.pid_d.max_in;
+ robot_conf.pid_d_max_I = robot.pid_d.max_I;
+ robot_conf.pid_d_max_out = robot.pid_d.max_out;
+
+ robot_conf.qa_var_2nd_ord_pos = robot.qr_a.var_2nd_ord_pos;
+ robot_conf.qa_var_2nd_ord_neg = robot.qr_a.var_2nd_ord_neg;
+ robot_conf.qa_var_1st_ord_pos = robot.qr_a.var_1st_ord_pos;
+ robot_conf.qa_var_1st_ord_neg = robot.qr_a.var_1st_ord_neg;
+
+ robot_conf.qd_var_2nd_ord_pos = robot.qr_d.var_2nd_ord_pos;
+ robot_conf.qd_var_2nd_ord_neg = robot.qr_d.var_2nd_ord_neg;
+ robot_conf.qd_var_1st_ord_pos = robot.qr_d.var_1st_ord_pos;
+ robot_conf.qd_var_1st_ord_neg = robot.qr_d.var_1st_ord_neg;
+
+ eeprom_write_block(&robot_conf, (uint8_t *)0,
+ sizeof(struct robot_conf));
+
+
+}
+
==========================================
aversive_projects/microb2008/main/eeprom.h (1.1)
==========================================
@@ -0,0 +1,54 @@
+/*
+ * Copyright Droids Corporation, Microb Technology, Eirbot (2005)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ * Revision : $Id: eeprom.h,v 1.1 2007-12-04 09:38:52 zer0 Exp $
+ *
+ */
+
+#ifndef _MICROB_EEPROM_H_
+#define _MICROB_EEPROM_H_
+
+struct robot_conf {
+ int16_t pid_a_gain_P;
+ int16_t pid_a_gain_I;
+ int16_t pid_a_gain_D;
+ int32_t pid_a_max_in;
+ int32_t pid_a_max_I;
+ int32_t pid_a_max_out;
+
+ int16_t pid_d_gain_P;
+ int16_t pid_d_gain_I;
+ int16_t pid_d_gain_D;
+ int32_t pid_d_max_in;
+ int32_t pid_d_max_I;
+ int32_t pid_d_max_out;
+
+ uint32_t qa_var_2nd_ord_pos;
+ uint32_t qa_var_2nd_ord_neg;
+ uint32_t qa_var_1st_ord_pos;
+ uint32_t qa_var_1st_ord_neg;
+
+ uint32_t qd_var_2nd_ord_pos;
+ uint32_t qd_var_2nd_ord_neg;
+ uint32_t qd_var_1st_ord_pos;
+ uint32_t qd_var_1st_ord_neg;
+};
+
+void load_conf(void);
+void save_conf(void);
+
+#endif
========================================
aversive_projects/microb2008/main/main.c (1.9 -> 1.10)
========================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: main.c,v 1.9 2007-11-27 23:16:53 zer0 Exp $
+ * Revision : $Id: main.c,v 1.10 2007-12-04 09:38:52 zer0 Exp $
*
*/
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <string.h>
#include <math.h>
+#include <avr/eeprom.h>
#include <aversive/pgmspace.h>
#include <aversive/error.h>
@@ -74,53 +75,14 @@
#endif
}
-#ifdef DEBUG_ASSERV
-volatile uint8_t to_dump = 2;
-struct cs_debug {
- uint32_t cpt;
- int32_t consign_value;
- int32_t encoders;
- int32_t error_value;
- int32_t i;
- int32_t d;
- int32_t out_value;
-};
-
-struct cs_debug cs_debug_a;
-struct cs_debug cs_debug_d;
-
-void debug_asserv(void * dummy)
-{
- uint8_t i;
- uint8_t flags;
-
- IRQ_LOCK(flags);
- if (to_dump == 1) {
- IRQ_UNLOCK(flags);
- for (i=0; i< sizeof(struct cs_debug); i++) {
- uart0_send( ((char *)&cs_debug_a)[i] );
- }
- for (i=0; i< sizeof(struct cs_debug); i++) {
- uart0_send( ((char *)&cs_debug_d)[i] );
- }
- to_dump = 0;
- }
- else {
- IRQ_UNLOCK(flags);
- }
-}
-
-#endif /* DEBUG_ASSERV */
-
-
/* called every 5 ms */
void do_cs(void * dummy) {
static uint8_t cpt = 0;
uint8_t second;
-#ifdef DEBUG_ASSERV
- static uint32_t debug_asserv_cpt = 0;
+
+ /* used for cs debugging */
+ static uint32_t debug_cs_cpt = 0;
uint8_t flags;
-#endif /* DEBUG_ASSERV */
if(robot.cs_events & DO_RS) {
rs_update(&robot.rs);
@@ -129,36 +91,35 @@
cs_manage(&robot.cs_a);
cs_manage(&robot.cs_d);
-#ifdef DEBUG_ASSERV
- debug_asserv_cpt++;
-
- IRQ_LOCK(flags);
- if (to_dump == 0) {
- to_dump = 1;
- IRQ_UNLOCK(flags);
+ if (robot.debug & DEBUG_CS) {
+ debug_cs_cpt++;
- cs_debug_d.cpt = debug_asserv_cpt;
- cs_debug_d.consign_value =
robot.cs_d.filtered_consign_value;
- cs_debug_d.encoders = rs_get_distance(&robot.rs);
- cs_debug_d.error_value = robot.cs_d.error_value;
- cs_debug_d.out_value = robot.cs_d.out_value;
- cs_debug_d.d = robot.pid_d.prev_D;
- cs_debug_d.i = robot.pid_d.integral;
-
- cs_debug_a.cpt = debug_asserv_cpt;
- cs_debug_a.consign_value =
robot.cs_a.filtered_consign_value;
- cs_debug_a.encoders = rs_get_angle(&robot.rs);
- cs_debug_a.error_value = robot.cs_a.error_value;
- cs_debug_a.out_value = robot.cs_a.out_value;
- cs_debug_a.d = robot.pid_a.prev_D;
- cs_debug_a.i = robot.pid_a.integral;
- }
- else {
- IRQ_UNLOCK(flags);
+ IRQ_LOCK(flags);
+ if (to_dump == 0) {
+ to_dump = 1;
+ IRQ_UNLOCK(flags);
+
+ cs_debug_d.cpt = debug_cs_cpt;
+ cs_debug_d.consign_value =
robot.cs_d.filtered_consign_value;
+ cs_debug_d.encoders =
rs_get_distance(&robot.rs);
+ cs_debug_d.error_value = robot.cs_d.error_value;
+ cs_debug_d.out_value = robot.cs_d.out_value;
+ cs_debug_d.d = robot.pid_d.prev_D;
+ cs_debug_d.i = robot.pid_d.integral;
+
+ cs_debug_a.cpt = debug_cs_cpt;
+ cs_debug_a.consign_value =
robot.cs_a.filtered_consign_value;
+ cs_debug_a.encoders = rs_get_angle(&robot.rs);
+ cs_debug_a.error_value = robot.cs_a.error_value;
+ cs_debug_a.out_value = robot.cs_a.out_value;
+ cs_debug_a.d = robot.pid_a.prev_D;
+ cs_debug_a.i = robot.pid_a.integral;
+ }
+ else {
+ IRQ_UNLOCK(flags);
+ }
}
-#endif /* DEBUG_ASSERV */
-
}
if((cpt % 4 == 0) && robot.cs_events & DO_POS) {
@@ -212,7 +173,7 @@
encoders_microb_manage(NULL);
encoder_running = 0;
- if (cpt%4)
+ if ((cpt%4) == 0)
scheduler_interrupt();
}
@@ -285,12 +246,106 @@
}
+#define PROFILE_TIME 10
+volatile int a = 0;
+
+void __attribute__ ((noinline)) dump_reg(uint16_t pc)
+{
+ static volatile uint8_t cpt = PROFILE_TIME;
+
+ if (cpt == 1) {
+ OCR2 = 0x80 + (rand()&0x7F);
+
+ TCCR2 = 2;
+ TCNT2 = 0;
+ }
+ else if (cpt == 0) {
+ OCR2 = 0;
+ TCCR2 = 4;
+ TCNT2 = 0;
+ cpt = PROFILE_TIME;
+ printf("%.4x\n", pc);
+ }
+ cpt--;
+}
+
+
+void SIG_OUTPUT_COMPARE2(void) __attribute__ ((signal , naked, __INTR_ATTRS));
+
+void SIG_OUTPUT_COMPARE2(void)
+{
+ asm volatile("push r1" "\n\t"
+ "push __tmp_reg__" "\n\t"
+
+ /* save sreg */
+ "in __tmp_reg__,__SREG__" "\n\t"
+ "push __tmp_reg__" "\n\t"
+ "eor r1, r1" "\n\t"
+
+ /* save used regs (see avr-gcc doc about used regs) */
+ "push r18" "\n\t"
+ "push r19" "\n\t"
+ "push r20" "\n\t"
+ "push r21" "\n\t"
+ "push r22" "\n\t"
+ "push r23" "\n\t"
+ "push r24" "\n\t"
+ "push r25" "\n\t"
+ "push r26" "\n\t"
+ "push r27" "\n\t"
+ "push r30" "\n\t"
+ "push r31" "\n\t"
+
+ /* load sp in r30/r31 */
+ "in r30, __SP_L__" "\n\t"
+ "in r31, __SP_H__" "\n\t"
+
+ /* point to saved PC */
+ "subi r30, lo8(-16)" "\n\t"
+ "sbci r31, hi8(-16)" "\n\t"
+
+ /* load Program Counter into r24-r25 */
+ "ldd r25, Z+0" "\n\t"
+ "ldd r24, Z+1" "\n\t"
+
+ /* call dump_reg, params are in r24-25 */
+ "call dump_reg" "\n\t"
+
+ /* restore regs */
+ "pop r31" "\n\t"
+ "pop r30" "\n\t"
+ "pop r27" "\n\t"
+ "pop r26" "\n\t"
+ "pop r25" "\n\t"
+ "pop r24" "\n\t"
+ "pop r23" "\n\t"
+ "pop r22" "\n\t"
+ "pop r21" "\n\t"
+ "pop r20" "\n\t"
+ "pop r19" "\n\t"
+ "pop r18" "\n\t"
+
+ /* sreg */
+ "pop __tmp_reg__" "\n\t"
+ "out __SREG__, __tmp_reg__" "\n\t"
+
+ /* tmp reg */
+ "pop __tmp_reg__" "\n\t"
+ "pop r1" "\n\t"
+
+ "reti" "\n\t"
+ :
+ :
+ );
+}
+
/*** main */
int main(void) {
int c;
uint8_t i=0;
+ const char * history;
/* init struct robot */
memset(&robot, 0, sizeof(struct robot));
@@ -308,6 +363,7 @@
/* UART */
uart_init();
fdevopen(uart0_dev_send, uart0_dev_recv);
+
printf_P(PSTR("salut\n"));
uart0_register_rx_event(emergency);
@@ -318,6 +374,9 @@
error_register_notice(mylog);
error_register_debug(mylog);
+ /* ENCODERS */
+ encoders_microb_init();
+
/* TIMER */
timer_init();
timer0_register_OV_intr(main_timer_interrupt);
@@ -326,6 +385,7 @@
scheduler_init();
scheduler_add_periodical_event_priority(do_led_blink, NULL,
500000L / SCHEDULER_UNIT,
LED_PRIO);
+
/* I2C */
/* i2c_protocol_init(); */
/* i2c_init(I2C_MODE_MASTER, I2C_MAIN_ADDR); */
@@ -347,15 +407,9 @@
/* wait_ms(500); */
/* } */
-
/* PWM */
pwm_init();
- /* ENCODERS */
- encoders_microb_init();
- scheduler_add_periodical_event_priority(encoders_microb_manage, NULL,
- 1, ENCODERS_PRIO);
-
/* ROBOT_SYSTEM */
rs_init(&robot.rs);
rs_set_left_pwm(&robot.rs, pwm_set, LEFT_PWM);
@@ -383,12 +437,12 @@
/* CS DISTANCE */
pid_init(&robot.pid_d);
- pid_set_gains(&robot.pid_d, 350, 8, 0/* 5000 */);
+ pid_set_gains(&robot.pid_d, 1000, 30, 20000);
pid_set_maximums(&robot.pid_d, 0, 50000, 4095);
pid_set_out_shift(&robot.pid_d, 10);
quadramp_init(&robot.qr_d);
- quadramp_set_1st_order_vars(&robot.qr_d, 1000, 1000); /* set speed */
+ quadramp_set_1st_order_vars(&robot.qr_d, 2000, 2000); /* set speed */
quadramp_set_2nd_order_vars(&robot.qr_d, 15, 15); /* set accel */
cs_init(&robot.cs_d);
@@ -400,7 +454,7 @@
/* CS ANGLE */
pid_init(&robot.pid_a);
- pid_set_gains(&robot.pid_a, 500, 6, 20000);
+ pid_set_gains(&robot.pid_a, 1000, 15, 20000);
pid_set_maximums(&robot.pid_a, 0, 100000, 4095);
pid_set_out_shift(&robot.pid_a, 10);
@@ -419,6 +473,7 @@
trajectory_init(&robot.traj);
trajectory_set_cs(&robot.traj, &robot.cs_d, &robot.cs_a);
trajectory_set_robot_params(&robot.traj, &robot.rs, &robot.pos);
+ trajectory_set_speed(&robot.traj, 2000, 2000);
/* distance window, angle window */
trajectory_set_windows(&robot.traj, 5.0, 5.0);
@@ -438,11 +493,13 @@
scheduler_add_periodical_event_priority(sensor_update, NULL,
50000L / SCHEDULER_UNIT,
SENSORS_PRIO);
-#ifdef DEBUG_ASSERV
- wait_ms(1000);
- scheduler_add_periodical_event_priority(debug_asserv, NULL,
- 5000L / SCHEDULER_UNIT,
CS_PRIO-1);
-#endif /* DEBUG_ASSERV */
+ /* it uses timer 2 */
+#ifdef PROFILE
+ OCR2 = 0;
+ TCNT2 = 0;
+ TCCR2 = 4;
+ sbi(TIMSK, OCIE2);
+#endif
sei();
@@ -488,6 +545,7 @@
rdline_init(&rdl, write_char, valid_buffer, complete_buffer);
+ wait_ms(100);
printf_P("\n");
snprintf(prompt, sizeof(prompt), "microb > ");
rdline_newline(&rdl, prompt);
@@ -498,7 +556,9 @@
int8_t ret;
ret = rdline_char_in(&rdl, c);
if (ret != 2 && ret != 0) {
- rdline_add_history(&rdl,
rdline_get_buffer(&rdl));
+ history = rdline_get_buffer(&rdl);
+ if (strlen(history)>1)
+ rdline_add_history(&rdl, history);
rdline_newline(&rdl, prompt);
}
}
========================================
aversive_projects/microb2008/main/main.h (1.4 -> 1.5)
========================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: main.h,v 1.4 2007-11-27 23:16:53 zer0 Exp $
+ * Revision : $Id: main.h,v 1.5 2007-12-04 09:38:52 zer0 Exp $
*
*/
@@ -30,13 +30,11 @@
#include <trajectory_manager.h>
+//#define DEBUG_ASSERV
+//#define PROFILE
+
+
/* to remove when we will have the new trajectory manager XXX */
-#define trajectory_goto_xy(args...) do { } while(0)
-#define trajectory_goto_a(args...) do { } while(0)
-#define trajectory_goto_xya(args...) do { } while(0)
-#define trajectory_goto_rs_d_a_rel(args...) do { } while(0)
-#define trajectory_goto_a_rel(args...) do { } while(0)
-#define trajectory_speed_d_a(args...) do { } while(0)
#define trajectory_goto_forward_xy(args...) do { } while(0)
#define trajectory_nearly_finished(args...) (0)
@@ -79,6 +77,9 @@
#define SENSORS_PRIO 100
#define I2C_POLL_PRIO 20
+/* debug flags */
+#define DEBUG_CS 1
+
struct robot {
int8_t cs_events;
@@ -97,12 +98,31 @@
uint8_t log_level;
uint8_t log_type;
+ uint8_t debug;
uint8_t blocking; /* XXX ? */
};
extern struct robot robot;
+/* cs debugging */
+
+struct cs_debug {
+ uint32_t cpt;
+ int32_t consign_value;
+ int32_t encoders;
+ int32_t error_value;
+ int32_t i;
+ int32_t d;
+ int32_t out_value;
+};
+
+extern volatile uint8_t to_dump;
+extern struct cs_debug cs_debug_a;
+extern struct cs_debug cs_debug_d;
+
+
+
void do_cs(void * dummy);
#define LED5BIT 2
===================================================
aversive_projects/microb2008/main/parse_cs_debug.py (1.1)
===================================================
@@ -0,0 +1,133 @@
+#!/usr/bin/python
+
+import sys
+import struct
+import Gnuplot
+import re
+
+if len(sys.argv) != 2:
+ print "Bad arguments"
+ sys.exit(1)
+
+filename = sys.argv[1]
+
+#
+# read data from file
+#
+f = open(filename)
+while True:
+ line = f.readline()
+ if line == "":
+ print "No start found"
+ sys.exit(1)
+
+ if line == "cs debug start\n":
+ break
+print "detect start ok"
+data_angle = []
+data_distance = []
+pattern = 'cs debug end\n'
+
+to_read = "<Iiiiiii"
+to_read_size = struct.calcsize(to_read)
+angle_distance = False
+while True:
+
+ line = f.read(to_read_size)
+ print repr(line)
+ if line == "":
+ print "No end found"
+ sys.exit(1)
+
+ if line[:len(pattern)] == pattern:
+ break
+ angle_distance = not angle_distance
+ if angle_distance:
+ data_angle.append(list(struct.unpack(to_read, line)))
+ else:
+ data_distance.append(list(struct.unpack(to_read, line)))
+
+
+f.close()
+
+angle_cpt = []
+angle_consign_value = []
+angle_encoders = []
+angle_error_values = []
+angle_i = []
+angle_d = []
+angle_out_value = []
+angle_all = [angle_cpt,
+ angle_consign_value,
+ angle_encoders,
+ angle_error_values,
+ angle_i,
+ angle_d,
+ angle_out_value]
+
+distance_cpt = []
+distance_consign_value = []
+distance_encoders = []
+distance_error_values = []
+distance_i = []
+distance_d = []
+distance_out_value = []
+distance_all = [distance_cpt,
+ distance_consign_value,
+ distance_encoders,
+ distance_error_values,
+ distance_i,
+ distance_d,
+ distance_out_value]
+
+
+for y in xrange(len(angle_all)):
+ angle_all[y]+=map(lambda x:x[y], data_angle)
+for y in xrange(len(distance_all)):
+ distance_all[y]+=map(lambda x:x[y], data_distance)
+
+
+def assoc_line(a):
+ global angle_cpt
+ return map(lambda x,y:[x,y], angle_cpt, a),
+
+g = Gnuplot.Gnuplot()
+g('set data style lines')
+
+h = Gnuplot.Gnuplot()
+h('set data style lines')
+
+#g.set_label(["1", "2", "3", "4", "5"])
+g.title("Angle")
+g.plot(Gnuplot.Data(assoc_line(angle_consign_value), title="cons"),
+ Gnuplot.Data(assoc_line(angle_encoders), title="encoders"),
+ Gnuplot.Data(assoc_line(angle_error_values), title="error"),
+ Gnuplot.Data(assoc_line(angle_i), title="i"),
+ Gnuplot.Data(assoc_line(angle_d), title="d"),
+ Gnuplot.Data(assoc_line(angle_out_value), title="out"))
+
+h.title("Distance")
+h.plot(Gnuplot.Data(assoc_line(distance_consign_value), title="cons"),
+ Gnuplot.Data(assoc_line(distance_encoders), title="encoders"),
+ Gnuplot.Data(assoc_line(distance_error_values), title="error"),
+ Gnuplot.Data(assoc_line(distance_i), title="i"),
+ Gnuplot.Data(assoc_line(distance_d), title="d"),
+ Gnuplot.Data(assoc_line(distance_out_value), title="out"))
+
+while(1):
+ pass
+#
+# parse data, two structs like below (one for angle, one
+# for distance)
+#
+# struct cs_debug {
+# uint32_t cpt;
+# int32_t consign_value;
+# int32_t encoders;
+# int32_t error_value;
+# int32_t i;
+# int32_t d;
+# int32_t out_value;
+# };
+
+
==============================================
aversive_projects/microb2008/main/pwm_config.h (1.2 -> 1.3)
==============================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: pwm_config.h,v 1.2 2007-11-15 11:14:54 zer0 Exp $
+ * Revision : $Id: pwm_config.h,v 1.3 2007-12-04 09:38:52 zer0 Exp $
*
*/
@@ -32,7 +32,7 @@
#define PWM1A_ENABLED
#define PWM1B_ENABLED
#define PWM3C_ENABLED
-#define PWM2_ENABLED
+//#define PWM2_ENABLED
/** max value for PWM entry, default 12 bits > 4095 */
#define PWM_SIGNIFICANT_BITS 12
====================================================
aversive_projects/microb2008/main/scheduler_config.h (1.2 -> 1.3)
====================================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: scheduler_config.h,v 1.2 2007-11-27 23:16:53 zer0 Exp $
+ * Revision : $Id: scheduler_config.h,v 1.3 2007-12-04 09:38:52 zer0 Exp $
*
*/
@@ -28,8 +28,8 @@
#define SCHEDULER_NB_MAX_EVENT 7
-#define SCHEDULER_UNIT_FLOAT 1000.0
-#define SCHEDULER_UNIT 1000L
+#define SCHEDULER_UNIT_FLOAT 512.0
+#define SCHEDULER_UNIT 512L
/** number of allowed imbricated scheduler interrupts. The maximum
* should be SCHEDULER_NB_MAX_EVENT since we never need to imbricate
===============================================
aversive_projects/microb2008/main/time_config.h (1.1 -> 1.2)
===============================================
@@ -15,9 +15,9 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: time_config.h,v 1.1 2007-06-28 22:13:04 zer0 Exp $
+ * Revision : $Id: time_config.h,v 1.2 2007-12-04 09:38:52 zer0 Exp $
*
*/
/** precision of the time processor, in us */
-#define TIME_PRECISION 1000l
+#define TIME_PRECISION 100000l
===============================================
aversive_projects/microb2008/main/uart_config.h (1.1 -> 1.2)
===============================================
@@ -15,7 +15,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
- * Revision : $Id: uart_config.h,v 1.1 2007-06-28 22:13:04 zer0 Exp $
+ * Revision : $Id: uart_config.h,v 1.2 2007-12-04 09:38:52 zer0 Exp $
*
*/
@@ -48,7 +48,7 @@
#define UART0_USE_DOUBLE_SPEED 0
//#define UART0_USE_DOUBLE_SPEED 1
-#define UART0_RX_FIFO_SIZE 4
+#define UART0_RX_FIFO_SIZE 32
#define UART0_TX_FIFO_SIZE 16
//#define UART0_NBITS 5
//#define UART0_NBITS 6
_______________________________________________
Avr-list mailing list
[email protected]
CVSWEB : http://cvsweb.droids-corp.org/cgi-bin/viewcvs.cgi/aversive
WIKI : http://wiki.droids-corp.org/index.php/Aversive
DOXYGEN : http://zer0.droids-corp.org/doxygen_aversive/html/
BUGZILLA : http://bugzilla.droids-corp.org
COMMIT LOGS : http://zer0.droids-corp.org/aversive_commitlog