summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBdale Garbee <bdale@gag.com>2012-10-23 09:38:36 -0600
committerBdale Garbee <bdale@gag.com>2012-10-23 09:38:36 -0600
commit055f3232decc07e064d596469b81cf9869411c2d (patch)
treecc5ebf8283ca00cbe1344f6ed808feaf7e9575ad /src
parent8ca58e20208495ce63b8256a8ffa43932867e8d5 (diff)
parent9e60fa214ad2c48fbe8f7e5c437681aa35d249fa (diff)
Merge branch 'master' of ssh://git.gag.com/scm/git/fw/altos
Diffstat (limited to 'src')
-rw-r--r--src/Makefile2
-rw-r--r--src/avr/ao_adc_avr.c7
-rw-r--r--src/avr/ao_arch.h2
-rw-r--r--src/avr/ao_pins.h9
-rw-r--r--src/avr/ao_pwmin.c90
-rw-r--r--src/avr/ao_pwmin.h20
-rw-r--r--src/core/ao_log.h6
-rw-r--r--src/core/ao_pyro.c19
-rw-r--r--src/core/ao_pyro.h4
-rw-r--r--src/product/ao_telescience.c6
-rw-r--r--src/stm/ao_timer.c2
-rw-r--r--src/telepyro-v0.1/Makefile2
-rw-r--r--src/telescience-pwm/.gitignore2
-rw-r--r--src/telescience-pwm/Makefile116
-rw-r--r--src/test/ao_flight_test.c5
-rwxr-xr-xsrc/test/run-mm41
-rwxr-xr-x[-rw-r--r--]src/util/check-avr-mem0
17 files changed, 327 insertions, 6 deletions
diff --git a/src/Makefile b/src/Makefile
index b8828d46..1949e554 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -27,7 +27,7 @@ ifneq ($(shell which sdcc),)
endif
ifneq ($(shell which avr-gcc),)
- SUBDIRS += telescience-v0.1 telepyro-v0.1
+ SUBDIRS += telescience-v0.1 telescience-pwm telepyro-v0.1
endif
ifneq ($(shell which arm-none-eabi-gcc),)
diff --git a/src/avr/ao_adc_avr.c b/src/avr/ao_adc_avr.c
index 3a262977..231512b2 100644
--- a/src/avr/ao_adc_avr.c
+++ b/src/avr/ao_adc_avr.c
@@ -16,6 +16,7 @@
*/
#include "ao.h"
+#include "ao_pwmin.h"
volatile __xdata struct ao_data ao_data_ring[AO_DATA_RING];
volatile __data uint8_t ao_data_head;
@@ -93,9 +94,13 @@ ISR(ADC_vect)
value = ADCL;
value |= (ADCH << 8);
ao_data_ring[ao_data_head].adc.adc[ao_adc_channel] = value;
- if (++ao_adc_channel < NUM_ADC)
+ if (++ao_adc_channel < NUM_ADC - HAS_ICP3_COUNT)
ao_adc_start();
else {
+#if HAS_ICP3_COUNT
+ /* steal last adc channel for pwm input */
+ ao_data_ring[ao_data_head].adc.adc[ao_adc_channel] = ao_icp3_count;
+#endif
ADCSRA = ADCSRA_INIT;
ao_data_ring[ao_data_head].tick = ao_time();
ao_data_head = ao_data_ring_next(ao_data_head);
diff --git a/src/avr/ao_arch.h b/src/avr/ao_arch.h
index a14d0ade..96659aaf 100644
--- a/src/avr/ao_arch.h
+++ b/src/avr/ao_arch.h
@@ -37,7 +37,9 @@
* AVR definitions and code fragments for AltOS
*/
+#ifndef AO_STACK_SIZE
#define AO_STACK_SIZE 116
+#endif
/* Various definitions to make GCC look more like SDCC */
diff --git a/src/avr/ao_pins.h b/src/avr/ao_pins.h
index bc423ff7..a08e87fa 100644
--- a/src/avr/ao_pins.h
+++ b/src/avr/ao_pins.h
@@ -32,7 +32,7 @@
#define HAS_BEEP 0
#endif
-#ifdef TELESCIENCE
+#if defined(TELESCIENCE) || defined(TELESCIENCE_PWM)
#define LEDS_AVAILABLE 0
#define HAS_USB 1
#define HAS_LOG 1
@@ -47,6 +47,11 @@
#define AVR_VCC_5V 0
#define AVR_VCC_3V3 1
#define AVR_CLOCK 8000000UL
+#ifdef TELESCIENCE_PWM
+ #define HAS_ICP3_COUNT 1
+#else
+ #define HAS_ICP3_COUNT 0
+#endif
#define SPI_CS_PORT PORTE
#define SPI_CS_DIR DDRE
@@ -64,6 +69,7 @@
#endif
#ifdef TELEPYRO
+ #define AO_STACK_SIZE 104
#define LEDS_AVAILABLE 0
#define HAS_USB 1
#define HAS_LOG 0
@@ -81,6 +87,7 @@
#define IS_COMPANION 1
#define HAS_ORIENT 0
#define ao_storage_pos_t uint16_t
+ #define HAS_ICP3_COUNT 0
#define AVR_VCC_5V 0
#define AVR_VCC_3V3 1
diff --git a/src/avr/ao_pwmin.c b/src/avr/ao_pwmin.c
new file mode 100644
index 00000000..84397357
--- /dev/null
+++ b/src/avr/ao_pwmin.c
@@ -0,0 +1,90 @@
+/*
+ * Copyright © 2012 Robert D. Garbee <robert@gag.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * 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.
+ */
+
+#include "ao.h"
+#include "ao_pwmin.h"
+
+/*
+ * This code implements a PWM input using ICP3.
+ *
+ * The initial use is to measure wind speed in the ULA/Ball summer intern
+ * project payload developed at Challenger Middle School.
+ */
+
+volatile __data uint16_t ao_icp3_count = 0;
+volatile __data uint16_t ao_icp3_last = 0;
+
+uint16_t ao_icp3(void)
+{
+ uint16_t v;
+ ao_arch_critical(
+ v = ao_icp3_count;
+ );
+ return v;
+}
+
+static void
+ao_pwmin_display(void) __reentrant
+{
+ /* display the most recent value */
+ printf("icp 3: %5u\n", ao_icp3());
+
+}
+
+
+ISR(TIMER3_CAPT_vect)
+{
+
+ uint8_t lo = ICR3L;
+ uint8_t hi = ICR3H;
+ uint16_t ao_icp3_this = (hi <<8) | lo;
+
+ /* handling counter rollovers */
+ if (ao_icp3_this >= ao_icp3_last)
+ ao_icp3_count = ao_icp3_this - ao_icp3_last;
+ else
+ ao_icp3_count = ao_icp3_this + (65536 - ao_icp3_last);
+ ao_icp3_last = ao_icp3_this;
+}
+
+__code struct ao_cmds ao_pwmin_cmds[] = {
+ { ao_pwmin_display, "p\0PWM input" },
+ { 0, NULL },
+};
+
+void
+ao_pwmin_init(void)
+{
+ /* do hardware setup here */
+ TCCR3A = ((0 << WGM31) | /* normal mode, OCR3A */
+ (0 << WGM30)); /* normal mode, OCR3A */
+ TCCR3B = ((1 << ICNC3) | /* input capture noise canceler on */
+ (0 << ICES3) | /* input capture on falling edge (don't care) */
+ (0 << WGM33) | /* normal mode, OCR3A */
+ (0 << WGM32) | /* normal mode, OCR3A */
+ (3 << CS30)); /* clk/64 from prescaler */
+
+
+
+ TIMSK3 = (1 << ICIE3); /* Interrupt on input compare */
+
+ /* set the spike filter bit in the TCCR3B register */
+
+ ao_cmd_register(&ao_pwmin_cmds[0]);
+}
+
+
diff --git a/src/avr/ao_pwmin.h b/src/avr/ao_pwmin.h
new file mode 100644
index 00000000..8097d399
--- /dev/null
+++ b/src/avr/ao_pwmin.h
@@ -0,0 +1,20 @@
+/*
+ * Copyright © 2012 Robert D. Garbee <robert@gag.com>
+ *
+ * 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; version 2 of the License.
+ *
+ * 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.
+ */
+
+void ao_pwmin_init(void);
+
+extern volatile __data uint16_t ao_icp3_count;
diff --git a/src/core/ao_log.h b/src/core/ao_log.h
index eaaca444..4eaed420 100644
--- a/src/core/ao_log.h
+++ b/src/core/ao_log.h
@@ -197,15 +197,18 @@ struct ao_log_mega {
uint8_t csum; /* 1 */
uint16_t tick; /* 2 */
union { /* 4 */
+ /* AO_LOG_FLIGHT */
struct {
uint16_t flight; /* 4 */
int16_t ground_accel; /* 6 */
uint32_t ground_pres; /* 8 */
} flight; /* 12 */
+ /* AO_LOG_STATE */
struct {
uint16_t state;
uint16_t reason;
} state;
+ /* AO_LOG_SENSOR */
struct {
uint32_t pres; /* 4 */
uint32_t temp; /* 8 */
@@ -220,12 +223,14 @@ struct ao_log_mega {
int16_t mag_z; /* 28 */
int16_t accel; /* 30 */
} sensor; /* 32 */
+ /* AO_LOG_TEMP_VOLT */
struct {
int16_t v_batt; /* 4 */
int16_t v_pbatt; /* 6 */
int16_t n_sense; /* 8 */
int16_t sense[10]; /* 10 */
} volt; /* 30 */
+ /* AO_LOG_GPS_TIME */
struct {
int32_t latitude; /* 4 */
int32_t longitude; /* 8 */
@@ -239,6 +244,7 @@ struct ao_log_mega {
uint8_t day; /* 20 */
uint8_t pad; /* 21 */
} gps; /* 22 */
+ /* AO_LOG_GPS_SAT */
struct {
uint16_t channels; /* 4 */
struct {
diff --git a/src/core/ao_pyro.c b/src/core/ao_pyro.c
index 4f37e979..aac8fda5 100644
--- a/src/core/ao_pyro.c
+++ b/src/core/ao_pyro.c
@@ -113,6 +113,15 @@ ao_pyro_ready(struct ao_pyro *pyro)
/* handled separately */
continue;
+ case ao_pyro_state_less:
+ if (ao_flight_state < pyro->state_less)
+ continue;
+ break;
+ case ao_pyro_state_greater_or_equal:
+ if (ao_flight_state >= pyro->state_greater_or_equal)
+ continue;
+ break;
+
default:
continue;
}
@@ -166,7 +175,7 @@ uint8_t ao_pyro_wakeup;
static void
ao_pyro(void)
{
- uint8_t p;
+ uint8_t p, any_waiting;
struct ao_pyro *pyro;
ao_config_get();
@@ -177,6 +186,7 @@ ao_pyro(void)
ao_alarm(AO_MS_TO_TICKS(100));
ao_sleep(&ao_pyro_wakeup);
ao_clear_alarm();
+ any_waiting = 0;
for (p = 0; p < AO_PYRO_NUM; p++) {
pyro = &ao_config.pyro[p];
@@ -190,6 +200,7 @@ ao_pyro(void)
if (!pyro->flags)
continue;
+ any_waiting = 1;
/* Check pyro state to see if it shoule fire
*/
if (!pyro->delay_done) {
@@ -213,7 +224,10 @@ ao_pyro(void)
ao_pyro_fire(p);
}
+ if (!any_waiting)
+ break;
}
+ ao_exit();
}
__xdata struct ao_task ao_pyro_task;
@@ -257,6 +271,9 @@ const struct {
{ "t<", ao_pyro_time_less, offsetof(struct ao_pyro, time_less), HELP("time less (s * 100)") },
{ "t>", ao_pyro_time_greater, offsetof(struct ao_pyro, time_greater), HELP("time greater (s * 100)") },
+ { "f<", ao_pyro_state_less, offsetof(struct ao_pyro, state_less), HELP("state less") },
+ { "f>=",ao_pyro_state_greater_or_equal, offsetof(struct ao_pyro, state_greater_or_equal), HELP("state greater or equal") },
+
{ "A", ao_pyro_ascending, NO_VALUE, HELP("ascending") },
{ "D", ao_pyro_descending, NO_VALUE, HELP("descending") },
diff --git a/src/core/ao_pyro.h b/src/core/ao_pyro.h
index 5deb69d0..cde850ad 100644
--- a/src/core/ao_pyro.h
+++ b/src/core/ao_pyro.h
@@ -42,6 +42,9 @@ enum ao_pyro_flag {
ao_pyro_after_motor = 0x00001000,
ao_pyro_delay = 0x00002000,
+
+ ao_pyro_state_less = 0x00004000,
+ ao_pyro_state_greater_or_equal = 0x00008000,
};
struct ao_pyro {
@@ -52,6 +55,7 @@ struct ao_pyro {
int16_t orient_less, orient_greater;
int16_t time_less, time_greater;
int16_t delay;
+ uint8_t state_less, state_greater_or_equal;
int16_t motor;
uint16_t delay_done;
uint8_t fired;
diff --git a/src/product/ao_telescience.c b/src/product/ao_telescience.c
index 45b6d40e..d448d318 100644
--- a/src/product/ao_telescience.c
+++ b/src/product/ao_telescience.c
@@ -16,6 +16,9 @@
*/
#include "ao.h"
+#if HAS_ICP3_COUNT
+#include "ao_pwmin.h"
+#endif
int
main(void)
@@ -34,6 +37,9 @@ main(void)
ao_usb_init();
ao_adc_init();
ao_log_single_init();
+#if HAS_ICP3_COUNT
+ ao_pwmin_init();
+#endif
ao_start_scheduler();
return 0;
}
diff --git a/src/stm/ao_timer.c b/src/stm/ao_timer.c
index 1132f748..f3011d3f 100644
--- a/src/stm/ao_timer.c
+++ b/src/stm/ao_timer.c
@@ -266,6 +266,7 @@ ao_clock_init(void)
stm_rcc.csr |= (1 << STM_RCC_CSR_RMVF);
+#if DEBUG_THE_CLOCK
/* Output SYSCLK on PA8 for measurments */
stm_rcc.ahbenr |= (1 << STM_RCC_AHBENR_GPIOAEN);
@@ -276,4 +277,5 @@ ao_clock_init(void)
stm_rcc.cfgr |= (STM_RCC_CFGR_MCOPRE_DIV_1 << STM_RCC_CFGR_MCOPRE);
stm_rcc.cfgr |= (STM_RCC_CFGR_MCOSEL_HSE << STM_RCC_CFGR_MCOSEL);
+#endif
}
diff --git a/src/telepyro-v0.1/Makefile b/src/telepyro-v0.1/Makefile
index 2ccd565f..6743ba66 100644
--- a/src/telepyro-v0.1/Makefile
+++ b/src/telepyro-v0.1/Makefile
@@ -96,7 +96,7 @@ ao_product.o: ao_product.c ao_product.h
distclean: clean
clean:
- rm -f $(OBJ)
+ rm -f $(OBJ) $(PROG) $(PROG).hex
rm -f ao_product.h
install:
diff --git a/src/telescience-pwm/.gitignore b/src/telescience-pwm/.gitignore
new file mode 100644
index 00000000..dfccadf8
--- /dev/null
+++ b/src/telescience-pwm/.gitignore
@@ -0,0 +1,2 @@
+telescience-v0.1*
+ao_product.h
diff --git a/src/telescience-pwm/Makefile b/src/telescience-pwm/Makefile
new file mode 100644
index 00000000..43d77e2e
--- /dev/null
+++ b/src/telescience-pwm/Makefile
@@ -0,0 +1,116 @@
+#
+# AltOS build
+#
+#
+vpath % ..:../core:../product:../drivers:../avr
+vpath ao-make-product.5c ../util
+
+MCU=atmega32u4
+DUDECPUTYPE=m32u4
+#PROGRAMMER=stk500v2 -P usb
+PROGRAMMER=usbtiny
+LOADCMD=avrdude
+LOADARG=-p $(DUDECPUTYPE) -c $(PROGRAMMER) -e -U flash:w:
+CC=avr-gcc
+OBJCOPY=avr-objcopy
+
+ifndef VERSION
+include ../Version
+endif
+
+INC = \
+ ao.h \
+ ao_arch.h \
+ ao_usb.h \
+ ao_pins.h \
+ ao_product.h
+
+#
+# Common AltOS sources
+#
+TELESCIENCE_STORAGE= \
+ ao_m25.c \
+ ao_spi_usart.c \
+ ao_storage.c
+
+TELESCIENCE_LOG= \
+ ao_log_single.c \
+ ao_log_telescience.c
+
+ALTOS_SRC = \
+ ao_clock.c \
+ ao_cmd.c \
+ ao_mutex.c \
+ ao_panic.c \
+ ao_product.c \
+ ao_stdio.c \
+ ao_task.c \
+ ao_timer.c \
+ ao_led.c \
+ ao_avr_stdio.c \
+ ao_romconfig.c \
+ ao_usb_avr.c \
+ ao_adc_avr.c \
+ ao_science_slave.c \
+ ao_spi_slave.c \
+ ao_pwmin.c \
+ $(TELESCIENCE_STORAGE)\
+ $(TELESCIENCE_LOG)
+
+PRODUCT=TeleScience-PWM
+MCU=atmega32u4
+PRODUCT_DEF=-DTELESCIENCE -DTELESCIENCE_PWM
+IDPRODUCT=0x0011
+CFLAGS = $(PRODUCT_DEF) -I. -I../avr -I../core -I..
+CFLAGS += -g -mmcu=$(MCU) -Wall -Wstrict-prototypes -O3 -mcall-prologues -DAVR
+
+NICKLE=nickle
+
+PROG=telescience-pwm
+
+SRC=$(ALTOS_SRC) ao_telescience.c
+OBJ=$(SRC:.c=.o)
+
+V=0
+# The user has explicitly enabled quiet compilation.
+ifeq ($(V),0)
+quiet = @printf " $1 $2 $@\n"; $($1)
+endif
+# Otherwise, print the full command line.
+quiet ?= $($1)
+
+all: $(PROG)
+
+CHECK=sh ../util/check-avr-mem
+
+$(PROG): Makefile $(OBJ)
+ $(call quiet,CC) $(LDFLAGS) $(CFLAGS) -o $(PROG) $(OBJ)
+ $(call quiet,CHECK) $(PROG) || ($(RM) -f $(PROG); exit 1)
+
+$(PROG).hex: $(PROG)
+ avr-size $(PROG)
+ $(OBJCOPY) -R .eeprom -O ihex $(PROG) $@
+
+
+load: $(PROG).hex
+ $(LOADCMD) $(LOADARG)$(PROG).hex
+
+ao_product.h: ao-make-product.5c ../Version
+ $(call quiet,NICKLE,$<) $< -m altusmetrum.org -i $(IDPRODUCT) -p $(PRODUCT) -v $(VERSION) > $@
+
+ao_product.o: ao_product.c ao_product.h
+
+%.o : %.c $(INC)
+ $(call quiet,CC) -c $(CFLAGS) $<
+
+distclean: clean
+
+clean:
+ rm -f *.o $(PROG) $(PROG).hex
+ rm -f ao_product.h
+
+install:
+
+uninstall:
+
+$(OBJ): ao_product.h $(INC)
diff --git a/src/test/ao_flight_test.c b/src/test/ao_flight_test.c
index 0df9a5d7..7180f02d 100644
--- a/src/test/ao_flight_test.c
+++ b/src/test/ao_flight_test.c
@@ -39,7 +39,7 @@
#define AO_ADC_NUM_SENSE 6
#define HAS_MS5607 1
#define HAS_MPU6000 1
-#define HAS_MMA655X 0
+#define HAS_MMA655X 1
struct ao_adc {
int16_t sense[AO_ADC_NUM_SENSE];
@@ -622,6 +622,9 @@ ao_sleep(void *wchan)
ao_data_static.mpu6000.gyro_x = int16(bytes, 14);
ao_data_static.mpu6000.gyro_y = -int16(bytes, 16);
ao_data_static.mpu6000.gyro_z = int16(bytes, 18);
+#if HAS_MMA655X
+ ao_data_static.mma655x = int16(bytes, 26);
+#endif
if (ao_records_read == 0)
ao_ground_mpu6000 = ao_data_static.mpu6000;
else if (ao_records_read < 10) {
diff --git a/src/test/run-mm b/src/test/run-mm
new file mode 100755
index 00000000..6f3d97a2
--- /dev/null
+++ b/src/test/run-mm
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+DIR=~/misc/rockets/flights
+
+for i in "$@"; do
+case "$i" in
+ */*)
+ file="$i"
+ ;;
+ *)
+ file="$DIR/$i"
+ ;;
+esac
+./ao_flight_test_mm "$file" > run-out.mm
+
+#./ao_flight_test_accel "$file" > run-out.accel
+#"run-out.accel" using 1:9 with lines lt 4 axes x1y1 title "accel height",\
+#"run-out.accel" using 1:11 with lines lt 4 axes x1y2 title "accel speed",\
+#"run-out.accel" using 1:13 with lines lt 4 axes x1y2 title "accel accel",\
+#"run-out.accel" using 1:15 with lines lt 4 axes x1y1 title "accel drogue",\
+#"run-out.accel" using 1:17 with lines lt 4 axes x1y1 title "accel main",\
+#
+
+gnuplot << EOF
+set ylabel "altitude (m)"
+set y2label "velocity (m/s), acceleration(m/s²)"
+set xlabel "time (s)"
+set xtics border out nomirror
+set ytics border out nomirror
+set y2tics border out nomirror
+set title "$i"
+plot "run-out.mm" using 1:3 with lines lw 2 lt 1 axes x1y1 title "raw height",\
+"run-out.mm" using 1:5 with lines lw 2 lt 1 axes x1y2 title "raw accel",\
+"run-out.mm" using 1:21 with lines lt 2 axes x1y1 title "mm height",\
+"run-out.mm" using 1:23 with lines lt 2 axes x1y2 title "mm speed",\
+"run-out.mm" using 1:25 with lines lt 2 axes x1y2 title "mm accel",\
+"run-out.mm" using 1:29 with lines lt 2 axes x1y1 title "mm drogue",\
+"run-out.mm" using 1:31 with lines lt 2 axes x1y1 title "mm main"
+pause mouse close
+EOF
+done \ No newline at end of file
diff --git a/src/util/check-avr-mem b/src/util/check-avr-mem
index 7956f0aa..7956f0aa 100644..100755
--- a/src/util/check-avr-mem
+++ b/src/util/check-avr-mem