Merge branch 'master' into pwmin-new pwmin-new 1.1.9.1
authorKeith Packard <keithp@keithp.com>
Thu, 18 Oct 2012 23:49:28 +0000 (16:49 -0700)
committerKeith Packard <keithp@keithp.com>
Thu, 18 Oct 2012 23:49:28 +0000 (16:49 -0700)
src/Makefile
src/avr/ao_adc_avr.c
src/avr/ao_pins.h
src/avr/ao_pwmin.c [new file with mode: 0644]
src/avr/ao_pwmin.h [new file with mode: 0644]
src/product/ao_telescience.c
src/telepyro-v0.1/Makefile
src/telescience-pwm/.gitignore [new file with mode: 0644]
src/telescience-pwm/Makefile [new file with mode: 0644]

index b8828d461d65e27e9c393b6163e035c48fbd39b7..1949e554f33abeb7ebcd8848a8d9bc4d149b4949 100644 (file)
@@ -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),)
index 3a262977512b606552211cee8b6122fcdea3a8e7..231512b2136e4993e54d9daa5a5c8f0109bfd250 100644 (file)
@@ -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);
index bc423ff7b61404011e17f4baf1eb9f3bcca3a778..0aa978e9dd174830163d2d20ac2e1e27c7a9fd1f 100644 (file)
@@ -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
        #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
@@ -81,6 +86,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 (file)
index 0000000..8439735
--- /dev/null
@@ -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 (file)
index 0000000..8097d39
--- /dev/null
@@ -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;
index 45b6d40e0c406ca1af29c1fadd69c5e65453bf33..d448d31854d888212378febdfa1c43d359552666 100644 (file)
@@ -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;
 }
index 2ccd565f2008cf5fb9440d5a50112d9c90eef76d..6743ba66db37c9a30f2c690580dfa35611bd0d16 100644 (file)
@@ -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 (file)
index 0000000..dfccadf
--- /dev/null
@@ -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 (file)
index 0000000..43d77e2
--- /dev/null
@@ -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)