aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias P. Braendli <matthias.braendli@mpb.li>2014-07-11 14:53:33 +0200
committerMatthias P. Braendli <matthias.braendli@mpb.li>2014-07-11 14:53:33 +0200
commitb40a1196a8e7c4c6ad163028774394a90fd87fc6 (patch)
treeadf2dc9e30d7c22dc414237d5d62e66f43ce4107
parent2a70ced5cd41f66df77a8b7ef05d9e75de406b55 (diff)
downloadrenard_hb9hi-b40a1196a8e7c4c6ad163028774394a90fd87fc6.tar.gz
renard_hb9hi-b40a1196a8e7c4c6ad163028774394a90fd87fc6.tar.bz2
renard_hb9hi-b40a1196a8e7c4c6ad163028774394a90fd87fc6.zip
Add first test code for ATtiny25
-rw-r--r--src/lib/delay.h9
-rw-r--r--src/testapp1/Makefile103
-rw-r--r--src/testapp1/README.md5
-rw-r--r--src/testapp1/main.c126
4 files changed, 243 insertions, 0 deletions
diff --git a/src/lib/delay.h b/src/lib/delay.h
new file mode 100644
index 0000000..af92a4f
--- /dev/null
+++ b/src/lib/delay.h
@@ -0,0 +1,9 @@
+#ifndef __DELAY_INT_H
+#define __DELAY_INT_H
+
+#include <util/delay.h>
+
+#define delay_us(us) _delay_us(us)
+#define delay_ms(ms) _delay_ms(ms)
+
+#endif
diff --git a/src/testapp1/Makefile b/src/testapp1/Makefile
new file mode 100644
index 0000000..5ff4010
--- /dev/null
+++ b/src/testapp1/Makefile
@@ -0,0 +1,103 @@
+# Location of build tools
+CC=avr-gcc
+OBJCOPY=avr-objcopy
+SIZE=avr-size
+AVRDUDE=avrdude
+
+# Modify this to the device name of the UART used for AVRDUDE
+AVRDUDE_DEV=usb
+PROG = dragon_isp
+
+# Modify this to the CPU you are using
+PART=attiny25
+AVRDUDE_PART=t25
+
+# Cpu frequency
+# is 3.579545MHz / 8 = 447443.125
+#F_CPU=447443UL
+F_CPU="(3579545UL/8)"
+
+# Directory for built objects
+BUILD_DIR=build
+
+# Port/application object files
+APP_NAME = testapp1
+
+# Application object files
+APP_OBJECTS = main.o
+
+# Library object files to build and use
+LIB_OBJECTS =
+LIB_ASM_OBJECTS =
+LIB_DIR = ../lib
+
+# Collection of built objects
+ALL_OBJECTS = $(LIB_OBJECTS) $(LIB_ASM_OBJECTS) $(APP_OBJECTS)
+BUILT_OBJECTS = $(patsubst %,$(BUILD_DIR)/%,$(ALL_OBJECTS))
+
+# Target application filenames (.elf and .hex) for each application object
+APP_ELF = $(APP_NAME).elf
+APP_HEX = $(APP_NAME).hex
+
+# Search build/output directory for dependencies
+vpath %.o ./$(BUILD_DIR)
+vpath %.elf ./$(BUILD_DIR)
+vpath %.hex ./$(BUILD_DIR)
+
+# GCC flags
+CFLAGS=-g -mmcu=$(PART) -O1 -Wall -Werror -DF_CPU=$(F_CPU)
+INCLUDES=-I. -I$(LIB_DIR)
+
+
+#################
+# Build targets #
+#################
+
+# All applications
+all: $(BUILD_DIR) $(APP_HEX) Makefile
+
+# Make build/output directory
+$(BUILD_DIR):
+ mkdir $(BUILD_DIR)
+
+# Application HEX files
+$(APP_HEX): %.hex: %.elf
+ @echo Building $@
+ $(OBJCOPY) -j .text -j .data -O ihex $(BUILD_DIR)/$< $(BUILD_DIR)/$@
+
+# Application ELF files
+$(APP_ELF): %.elf: $(LIB_OBJECTS) $(LIB_ASM_OBJECTS) $(APP_OBJECTS)
+ $(CC) $(CFLAGS) $(BUILT_OBJECTS) --output $(BUILD_DIR)/$@ -Wl,-Map,$(BUILD_DIR)/$(basename $@).map
+
+# Application objects builder
+$(APP_OBJECTS): %.o: %.c
+ $(CC) -c $(CFLAGS) $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)
+
+# Application C objects builder
+$(LIB_OBJECTS): %.o: $(LIB_DIR)/%.c
+ $(CC) -c $(CFLAGS) $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)
+
+# Application asm objects builder
+$(LIB_ASM_OBJECTS): %.o: $(LIB_DIR)/%.s
+ $(CC) -c $(CFLAGS) -x assembler-with-cpp $(INCLUDES) $< -o $(BUILD_DIR)/$(notdir $@)
+
+# .lst file builder
+%.lst: %.c
+ $(CC) $(CFLAGS) $(INCLUDES) -Wa,-al $< > $@
+
+# Clean
+clean:
+ rm -f *.o *.elf *.map *.hex *.bin *.lst
+ rm -rf doxygen-avr
+ rm -rf build
+
+# Send to device
+program: $(BUILD_DIR)/$(APP_HEX)
+ $(SIZE) -C $(BUILD_DIR)/$(APP_ELF)
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(AVRDUDE_DEV) -p $(AVRDUDE_PART) -U flash:w:$(BUILD_DIR)/$(APP_HEX) -v
+
+interactive:
+ $(AVRDUDE) $(AVRDUDE_FLAGS) -c $(PROG) -P $(AVRDUDE_DEV) -p $(AVRDUDE_PART) -t -v
+
+doxygen:
+ doxygen ./Doxyfile
diff --git a/src/testapp1/README.md b/src/testapp1/README.md
new file mode 100644
index 0000000..7099b6a
--- /dev/null
+++ b/src/testapp1/README.md
@@ -0,0 +1,5 @@
+testapp1
+========
+
+This only sends MOS in morse code on PB0
+
diff --git a/src/testapp1/main.c b/src/testapp1/main.c
new file mode 100644
index 0000000..9ce1456
--- /dev/null
+++ b/src/testapp1/main.c
@@ -0,0 +1,126 @@
+#include <stdio.h>
+#include <avr/pgmspace.h>
+#include <avr/io.h>
+#include <avr/interrupt.h>
+
+#include "delay.h"
+
+#define PORTB_PTT (1 << 0)
+
+volatile uint8_t Timer; /* Timer (100Hz increment) */
+
+/*---------------------------------------------------------*/
+/* 100Hz timer interrupt generated by OC2 */
+/*---------------------------------------------------------*/
+ISR(TIMER1_COMPA_vect)
+{
+ Timer++;
+}
+
+static int inittimer(void)
+{
+ /* Start 100Hz system timer (TC2.OC) */
+ TCCR0B |= (1 << WGM02); // Configure timer for CTC mode
+ TIMSK |= (1 << OCIE1A); // enable overflow interrupt
+ OCR1A = (uint8_t)(F_CPU / 64 / 1000 / 100 - 1); // Set CTC compare value to 10ms
+ TCCR0B |= ((1 << CS10) | (1 << CS11)); // Start timer at Fcpu/64
+
+ // Enable interrupts
+ sei();
+
+ return 0;
+}
+
+#define DIT_DURATION 100 // ms
+#define PTT_LOGIC_LOW 0
+
+#if PTT_LOGIC_LOW
+void dah()
+{
+ PORTB = 0; // PTT is inverted logic
+ delay_ms(3*DIT_DURATION);
+
+ PORTB = PORTB_PTT; // PTT is inverted logic
+ delay_ms(DIT_DURATION);
+}
+
+void dit()
+{
+ PORTB = 0; // PTT is inverted logic
+ delay_ms(DIT_DURATION);
+
+ PORTB = PORTB_PTT; // PTT is inverted logic
+ delay_ms(DIT_DURATION);
+}
+#else
+void dah()
+{
+ PORTB = PORTB_PTT;
+ delay_ms(3*DIT_DURATION);
+
+ PORTB = 0;
+ delay_ms(DIT_DURATION);
+}
+
+void dit()
+{
+ PORTB = PORTB_PTT;
+ delay_ms(DIT_DURATION);
+
+ PORTB = 0;
+ delay_ms(DIT_DURATION);
+}
+#endif
+
+int main ( void )
+{
+ /* Enable PTT output on PB0 */
+ PORTB = PORTB_PTT;
+ DDRB = PORTB_PTT;
+
+ /* initialise timer interrupt */
+ inittimer();
+
+ while (1) {
+ // morse code !
+ dah();
+ dah();
+
+ delay_ms(2*DIT_DURATION);
+ dah();
+ dah();
+ dah();
+
+ delay_ms(2*DIT_DURATION);
+ dit();
+ dit();
+ dit();
+
+ delay_ms(6*DIT_DURATION);
+ }
+
+ return 0;
+}
+
+#if 0
+static void some_old_function(uint32_t data)
+{
+ uint32_t test_status;
+ int sleep_ticks;
+
+ /* Enable all LEDs */
+ DDRB = 0xFF;
+ PORTB = 0xFF;
+
+ /* Flash LED once per second if passed, very quickly if failed */
+ sleep_ticks = (test_status == 0) ? SYSTEM_TICKS_PER_SEC : (SYSTEM_TICKS_PER_SEC/8);
+
+ /* Test finished, flash slowly for pass, fast for fail */
+ while (1)
+ {
+ /* Toggle a LED */
+ PORTB ^= (1 << 0);
+ }
+}
+#endif
+