v1.0
authorJacob Parker <j3parker@csclub.uwaterloo.ca>
Mon, 26 Mar 2012 03:18:21 +0000 (23:18 -0400)
committerJacob Parker <j3parker@csclub.uwaterloo.ca>
Mon, 26 Mar 2012 03:18:21 +0000 (23:18 -0400)
Makefile [new file with mode: 0644]
README.md [new file with mode: 0644]
main.c [new file with mode: 0644]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..3f46422
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,317 @@
+
+#########  AVR Project Makefile Template   #########
+######                                        ######
+######    Copyright (C) 2003-2005,Pat Deegan, ######
+######            Psychogenic Inc             ######
+######          All Rights Reserved           ######
+######                                        ######
+###### You are free to use this code as part  ######
+###### of your own applications provided      ######
+###### you keep this copyright notice intact  ######
+###### and acknowledge its authorship with    ######
+###### the words:                             ######
+######                                        ######
+###### "Contains software by Pat Deegan of    ######
+###### Psychogenic Inc (www.psychogenic.com)" ######
+######                                        ######
+###### If you use it as part of a web site    ######
+###### please include a link to our site,     ######
+###### http://electrons.psychogenic.com  or   ######
+###### http://www.psychogenic.com             ######
+######                                        ######
+####################################################
+
+
+##### This Makefile will make compiling Atmel AVR 
+##### micro controller projects simple with Linux 
+##### or other Unix workstations and the AVR-GCC 
+##### tools.
+#####
+##### It supports C, C++ and Assembly source files.
+#####
+##### Customize the values as indicated below and :
+##### make
+##### make disasm 
+##### make stats 
+##### make hex
+##### make writeflash
+##### make gdbinit
+##### or make clean
+#####
+##### See the http://electrons.psychogenic.com/ 
+##### website for detailed instructions
+
+
+####################################################
+#####                                          #####
+#####              Configuration               #####
+#####                                          #####
+##### Customize the values in this section for #####
+##### your project. MCU, PROJECTNAME and       #####
+##### PRJSRC must be setup for all projects,   #####
+##### the remaining variables are only         #####
+##### relevant to those needing additional     #####
+##### include dirs or libraries and those      #####
+##### who wish to use the avrdude programmer   #####
+#####                                          #####
+##### See http://electrons.psychogenic.com/    #####
+##### for further details.                     #####
+#####                                          #####
+####################################################
+
+
+#####         Target Specific Details          #####
+#####     Customize these for your project     #####
+
+# Name of target controller 
+# (e.g. 'at90s8515', see the available avr-gcc mmcu 
+# options for possible values)
+MCU=atmega48p
+
+# id to use with programmer
+# default: PROGRAMMER_MCU=$(MCU)
+# In case the programer used, e.g avrdude, doesn't
+# accept the same MCU name as avr-gcc (for example
+# for ATmega8s, avr-gcc expects 'atmega8' and 
+# avrdude requires 'm8')
+PROGRAMMER_MCU=m48p
+
+# Name of our project
+# (use a single word, e.g. 'myproject')
+PROJECTNAME=7seg
+
+# Source files
+# List C/C++/Assembly source files:
+# (list all files to compile, e.g. 'a.c b.cpp as.S'):
+# Use .cc, .cpp or .C suffix for C++ files, use .S 
+# (NOT .s !!!) for assembly source code files.
+PRJSRC=main.c
+
+# additional includes (e.g. -I/path/to/mydir)
+INC=
+
+# libraries to link in (e.g. -lmylib)
+LIBS=
+
+# Optimization level, 
+# use s (size opt), 1, 2, 3 or 0 (off)
+OPTLEVEL=s
+
+
+#####      AVR Dude 'writeflash' options       #####
+#####  If you are using the avrdude program
+#####  (http://www.bsdhome.com/avrdude/) to write
+#####  to the MCU, you can set the following config
+#####  options and use 'make writeflash' to program
+#####  the device.
+
+
+# programmer id--check the avrdude for complete list
+# of available opts.  These should include stk500,
+# avr910, avrisp, bsd, pony and more.  Set this to
+# one of the valid "-c PROGRAMMER-ID" values 
+# described in the avrdude info page.
+# 
+AVRDUDE_PROGRAMMERID=avrispmkII
+
+# port--serial or parallel port to which your 
+# hardware programmer is attached
+#
+AVRDUDE_PORT=usb
+
+
+####################################################
+#####                Config Done               #####
+#####                                          #####
+##### You shouldn't need to edit anything      #####
+##### below to use the makefile but may wish   #####
+##### to override a few of the flags           #####
+##### nonetheless                              #####
+#####                                          #####
+####################################################
+
+
+##### Flags ####
+
+# HEXFORMAT -- format for .hex file output
+HEXFORMAT=ihex
+
+# compiler
+CFLAGS=-I. $(INC) -g -mmcu=$(MCU) -O$(OPTLEVEL) \
+       -fpack-struct -fshort-enums             \
+       -funsigned-bitfields -funsigned-char    \
+       -Wall -Wstrict-prototypes               \
+       -Wa,-ahlms=$(firstword                  \
+       $(filter %.lst, $(<:.c=.lst)))
+
+# c++ specific flags
+CPPFLAGS=-fno-exceptions               \
+       -Wa,-ahlms=$(firstword         \
+       $(filter %.lst, $(<:.cpp=.lst))\
+       $(filter %.lst, $(<:.cc=.lst)) \
+       $(filter %.lst, $(<:.C=.lst)))
+
+# assembler
+ASMFLAGS =-I. $(INC) -mmcu=$(MCU)        \
+       -x assembler-with-cpp            \
+       -Wa,-gstabs,-ahlms=$(firstword   \
+               $(<:.S=.lst) $(<.s=.lst))
+
+
+# linker
+LDFLAGS=-Wl,-Map,$(TRG).map -mmcu=$(MCU) \
+       -lm $(LIBS)
+
+##### executables ####
+CC=/scratch/m4burns/avr/atmel/bin/avr-gcc
+OBJCOPY=/scratch/m4burns/avr/atmel/bin/avr-objcopy
+OBJDUMP=/scratch/m4burns/avr/atmel/bin/avr-objdump
+SIZE=/scratch/m4burns/avr/atmel/bin/avr-size
+AVRDUDE=avrdude -C /users/omsmith/avrdude.conf
+REMOVE=rm -f
+
+##### automatic target names ####
+TRG=$(PROJECTNAME).out
+DUMPTRG=$(PROJECTNAME).s
+
+HEXROMTRG=$(PROJECTNAME).hex 
+HEXTRG=$(HEXROMTRG) $(PROJECTNAME).ee.hex
+GDBINITFILE=gdbinit-$(PROJECTNAME)
+
+# Define all object files.
+
+# Start by splitting source files by type
+#  C++
+CPPFILES=$(filter %.cpp, $(PRJSRC))
+CCFILES=$(filter %.cc, $(PRJSRC))
+BIGCFILES=$(filter %.C, $(PRJSRC))
+#  C
+CFILES=$(filter %.c, $(PRJSRC))
+#  Assembly
+ASMFILES=$(filter %.S, $(PRJSRC))
+
+
+# List all object files we need to create
+OBJDEPS=$(CFILES:.c=.o)    \
+       $(CPPFILES:.cpp=.o)\
+       $(BIGCFILES:.C=.o) \
+       $(CCFILES:.cc=.o)  \
+       $(ASMFILES:.S=.o)
+
+# Define all lst files.
+LST=$(filter %.lst, $(OBJDEPS:.o=.lst))
+
+# All the possible generated assembly 
+# files (.s files)
+GENASMFILES=$(filter %.s, $(OBJDEPS:.o=.s)) 
+
+
+.SUFFIXES : .c .cc .cpp .C .o .out .s .S \
+       .hex .ee.hex .h .hh .hpp
+
+
+.PHONY: writeflash clean stats gdbinit stats
+
+# Make targets:
+# all, disasm, stats, hex, writeflash/install, clean
+all: $(TRG)
+
+disasm: $(DUMPTRG) stats
+
+stats: $(TRG)
+       $(OBJDUMP) -h $(TRG)
+       $(SIZE) $(TRG) 
+
+hex: $(HEXTRG)
+
+
+writeflash: hex
+       $(AVRDUDE) -c $(AVRDUDE_PROGRAMMERID)   \
+        -p $(PROGRAMMER_MCU) -P $(AVRDUDE_PORT) -e        \
+        -U flash:w:$(HEXROMTRG)
+
+install: writeflash
+
+$(DUMPTRG): $(TRG) 
+       $(OBJDUMP) -S  $< > $@
+
+
+$(TRG): $(OBJDEPS) 
+       $(CC) $(LDFLAGS) -o $(TRG) $(OBJDEPS)
+
+
+#### Generating assembly ####
+# asm from C
+%.s: %.c
+       $(CC) -S $(CFLAGS) $< -o $@
+
+# asm from (hand coded) asm
+%.s: %.S
+       $(CC) -S $(ASMFLAGS) $< > $@
+
+
+# asm from C++
+.cpp.s .cc.s .C.s :
+       $(CC) -S $(CFLAGS) $(CPPFLAGS) $< -o $@
+
+
+
+#### Generating object files ####
+# object from C
+.c.o: 
+       $(CC) $(CFLAGS) -c $< -o $@
+
+
+# object from C++ (.cc, .cpp, .C files)
+.cc.o .cpp.o .C.o :
+       $(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
+
+# object from asm
+.S.o :
+       $(CC) $(ASMFLAGS) -c $< -o $@
+
+
+#### Generating hex files ####
+# hex files from elf
+#####  Generating a gdb initialisation file    #####
+.out.hex:
+       $(OBJCOPY) -j .text                    \
+               -j .data                       \
+               -O $(HEXFORMAT) $< $@
+
+.out.ee.hex:
+       $(OBJCOPY) -j .eeprom                  \
+               --change-section-lma .eeprom=0 \
+               -O $(HEXFORMAT) $< $@
+
+
+#####  Generating a gdb initialisation file    #####
+##### Use by launching simulavr and avr-gdb:   #####
+#####   avr-gdb -x gdbinit-myproject           #####
+gdbinit: $(GDBINITFILE)
+
+$(GDBINITFILE): $(TRG)
+       @echo "file $(TRG)" > $(GDBINITFILE)
+       
+       @echo "target remote localhost:1212" \
+                               >> $(GDBINITFILE)
+       
+       @echo "load"        >> $(GDBINITFILE) 
+       @echo "break main"  >> $(GDBINITFILE)
+       @echo "continue"    >> $(GDBINITFILE)
+       @echo
+       @echo "Use 'avr-gdb -x $(GDBINITFILE)'"
+
+
+#### Cleanup ####
+clean:
+       $(REMOVE) $(TRG) $(TRG).map $(DUMPTRG)
+       $(REMOVE) $(OBJDEPS)
+       $(REMOVE) $(LST) $(GDBINITFILE)
+       $(REMOVE) $(GENASMFILES)
+       $(REMOVE) $(HEXTRG)
+       
+
+
+#####                    EOF                   #####
+
diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..22a2534
--- /dev/null
+++ b/README.md
@@ -0,0 +1,13 @@
+This code is for an ATMega48P controlling a [7-segment display](http://evilmadscience.com/productsmenu/partsmenu/107-sevensegment)
+
+The UW Computer Science Club uses one of the linked displays to show how many people our viewing the webcams.
+
+
+Notes
+----
+- Everything is static inline because we are hobo and don't want to fix our build system.
+
+Todo
+-----
+- Add the EAGLE circuit diagram
+- Maybe make it do something less ambiguous than `E` on out-of-range :)
diff --git a/main.c b/main.c
new file mode 100644 (file)
index 0000000..c2dd9ef
--- /dev/null
+++ b/main.c
@@ -0,0 +1,78 @@
+//#define __AVR_ATmega48P__\r
+#include <avr/io.h>\r
+#include <util/delay_basic.h>\r
+\r
+#define PORTB_CONFIG 0b11100001\r
+#define PORTD_CONFIG 0b11100000\r
+\r
+\r
+static inline void uart_init(uint16_t ubrr);\r
+static inline uint8_t getc();\r
+static inline void shit_raw(uint8_t c);\r
+static inline void shit_encoded(uint8_t n);\r
+\r
+\r
+static inline void uart_init(uint16_t ubrr) {\r
+  UBRR0H = (unsigned char)(ubrr>>8);\r
+  UBRR0L = (unsigned char)(ubrr);\r
+\r
+  UCSR0B = (1<<RXEN0)|(1<<TXEN0);\r
+  UCSR0C = (1<<USBS0)|(3<<UCSZ00);\r
+}\r
+\r
+static inline uint8_t getc() {\r
+  while(!(UCSR0A & (1<<RXC0)));\r
+  return UDR0;\r
+}\r
+\r
+static inline void shit_raw(uint8_t c) {\r
+  // (c & 0b00000001) is always 0\r
+  PORTD = c & 0b11100000;\r
+  PORTB = ((c & 0b00011100) << 3)|((c & 0b00000010)>>1);\r
+}\r
+\r
+static inline void shit_encoded(uint8_t n) {\r
+  if( n > 15 ) n = 14;\r
+  switch(n) {\r
+    case 0:  shit_raw(0b11101110); break;\r
+    case 1:  shit_raw(0b00101000); break;\r
+    case 2:  shit_raw(0b01011110); break;\r
+    case 3:  shit_raw(0b01111100); break;\r
+    case 4:  shit_raw(0b10111000); break;\r
+    case 5:  shit_raw(0b11110100); break;\r
+    case 6:  shit_raw(0b11110110); break;\r
+    case 7:  shit_raw(0b01101000); break;\r
+    case 8:  shit_raw(0b11111110); break;\r
+    case 9:  shit_raw(0b11111100); break;\r
+    case 10: shit_raw(0b11111010); break; // A\r
+    case 11: shit_raw(0b10110110); break; // B\r
+    case 12: shit_raw(0b11000110); break; // C\r
+    case 13: shit_raw(0b00111110); break; // D\r
+    case 14: shit_raw(0b11010110); break; // E\r
+    case 15: shit_raw(0b11010010); break; // F\r
+    default: break;\r
+  }\r
+}\r
+\r
+int main(void) {\r
+  DDRB = PORTB_CONFIG;\r
+  DDRD = PORTD_CONFIG;\r
+\r
+  // run quick test sequence\r
+  uint8_t n = 0;\r
+  for(; n < 16; n++ ) {\r
+    shit_encoded(n);\r
+    _delay_loop_2(30000UL);\r
+  }\r
+\r
+  uart_init(12);\r
+\r
+  n = 0;\r
+  while(1) {\r
+    if (n & (1<<7)) shit_raw((n & 0b01111111) << 1);\r
+    else            shit_encoded(n);\r
+    n = getc();\r
+  }\r
+       return 0;\r
+}\r
+\r