From 59bd682764c6274dbb5913e8822334df9c5ef3b9 Mon Sep 17 00:00:00 2001 From: schodet Date: Sat, 23 Apr 2005 09:52:37 +0000 Subject: Ajout de la gestion d'eeprom. --- n/asserv/src/eeprom.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++ n/asserv/src/main.c | 10 +++++++ 2 files changed, 83 insertions(+) create mode 100644 n/asserv/src/eeprom.c (limited to 'n/asserv/src') diff --git a/n/asserv/src/eeprom.c b/n/asserv/src/eeprom.c new file mode 100644 index 0000000..8c98078 --- /dev/null +++ b/n/asserv/src/eeprom.c @@ -0,0 +1,73 @@ +/* eeprom.c */ +/* asserv - Position & speed motor control on a ATmega128. {{{ + * + * Copyright (C) 2005 Nicolas Schodet + * + * 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. + * + * Contact : + * Web: http://perso.efrei.fr/~schodet/ + * Email: + * }}} */ +#include + +/* +AutoDec */ +/* -AutoDec */ + +/* Read parameters from eeprom. */ +static void +eeprom_read_params (void) +{ + uint8_t *p8 = 0; + uint16_t *p16; + if (eeprom_read_byte (p8++) != 0xa5) + return; + speed_acc_cpt = speed_acc = eeprom_read_byte (p8++); + speed_max = eeprom_read_byte (p8++); + pwm_dir = eeprom_read_byte (p8++); + p16 = (uint16_t *) p8; + speed_kp = eeprom_read_word (p16++); + speed_ki = eeprom_read_word (p16++); + speed_kd = eeprom_read_word (p16++); + speed_int_max = eeprom_read_word (p16++); + postrack_set_footing (eeprom_read_word (p16++)); +} + +/* Write parameters to eeprom. */ +static void +eeprom_write_params (void) +{ + uint8_t *p8 = 0; + uint16_t *p16; + eeprom_write_byte (p8++, 0xa5); + eeprom_write_byte (p8++, speed_acc_cpt); + eeprom_write_byte (p8++, speed_max); + eeprom_write_byte (p8++, pwm_dir); + p16 = (uint16_t *) p8; + eeprom_write_word (p16++, speed_kp); + eeprom_write_word (p16++, speed_ki); + eeprom_write_word (p16++, speed_kd); + eeprom_write_word (p16++, speed_int_max); + eeprom_write_word (p16++, postrack_footing); +} + +/* Clear eeprom parameters. */ +static void +eeprom_clear_params (void) +{ + uint8_t *p = 0; + eeprom_write_byte (p, 0xff); +} + diff --git a/n/asserv/src/main.c b/n/asserv/src/main.c index 1e77b7e..7650014 100644 --- a/n/asserv/src/main.c +++ b/n/asserv/src/main.c @@ -37,6 +37,7 @@ #include "speed.c" #include "postrack.c" #include "goto.c" +#include "eeprom.c" /** Use Taz. */ uint8_t motor_taz; @@ -103,6 +104,7 @@ main (void) rs232_init (); twi_master_init (); taz_init (); + eeprom_read_params (); proto_send0 ('z'); sei (); main_loop (); @@ -376,6 +378,14 @@ proto_callback (uint8_t cmd, uint8_t size, uint8_t *args) if (args[1]) pwm_dir |= _BV (PWM_LEFT_DIR); if (args[2]) pwm_dir |= _BV (PWM_RIGHT_DIR); break; + case c ('E', 2): + /* Write to eeprom. + * - b: 00: clear config, 01: write config. */ + if (args[1]) + eeprom_write_params (); + else + eeprom_clear_params (); + break; default: proto_send0 ('?'); return; -- cgit v1.2.3