From 01fb4da199d922402180dfc31a3bdda24aac772d Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 21:48:48 +0100 Subject: [PATCH 01/11] tree reorg for separate master/slave build-dirs * moved files * rudimentary Makefile-support --- firmware/Makefile | 10 +++- firmware/Makefile.inc | 13 ++++++ firmware/masterchip/Makefile | 67 +++++++++++++++++++++++++++ firmware/{ => masterchip}/display.c | 0 firmware/{ => masterchip}/display.h | 0 firmware/{ => masterchip}/lcd/COPYING | 0 firmware/{ => masterchip}/lcd/lcd.c | 0 firmware/{ => masterchip}/lcd/lcd.h | 0 firmware/{ => masterchip}/main.c | 0 firmware/{ => masterchip}/main.h | 0 firmware/masterchip/spi.c | 1 + firmware/masterchip/spi.h | 1 + firmware/{ => masterchip}/usb.c | 0 firmware/{ => masterchip}/usb.h | 0 firmware/masterchip/usbdrv | 1 + firmware/{ => shared}/spi.c | 0 firmware/{ => shared}/spi.h | 0 firmware/slavechip/Makefile | 66 ++++++++++++++++++++++++++ firmware/{ => slavechip}/i2c_simple.c | 0 firmware/{ => slavechip}/i2c_simple.h | 0 firmware/{ => slavechip}/mcp_adc.c | 0 firmware/{ => slavechip}/mcp_adc.h | 0 firmware/usbdrv | 1 - 23 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 firmware/Makefile.inc create mode 100644 firmware/masterchip/Makefile rename firmware/{ => masterchip}/display.c (100%) rename firmware/{ => masterchip}/display.h (100%) rename firmware/{ => masterchip}/lcd/COPYING (100%) rename firmware/{ => masterchip}/lcd/lcd.c (100%) rename firmware/{ => masterchip}/lcd/lcd.h (100%) rename firmware/{ => masterchip}/main.c (100%) rename firmware/{ => masterchip}/main.h (100%) create mode 120000 firmware/masterchip/spi.c create mode 120000 firmware/masterchip/spi.h rename firmware/{ => masterchip}/usb.c (100%) rename firmware/{ => masterchip}/usb.h (100%) create mode 120000 firmware/masterchip/usbdrv rename firmware/{ => shared}/spi.c (100%) rename firmware/{ => shared}/spi.h (100%) create mode 100644 firmware/slavechip/Makefile rename firmware/{ => slavechip}/i2c_simple.c (100%) rename firmware/{ => slavechip}/i2c_simple.h (100%) rename firmware/{ => slavechip}/mcp_adc.c (100%) rename firmware/{ => slavechip}/mcp_adc.h (100%) delete mode 120000 firmware/usbdrv diff --git a/firmware/Makefile b/firmware/Makefile index bed7b54..47ccb94 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -4,9 +4,15 @@ CFLAGS += -std=gnu99 # implements C99, for # this removes dead code and does global linker optimization #CFLAGS += -ffunction-sections -Wl,--gc-sections -Wl,--relax -OBJECTS = usbdrv/usbdrvasm.o usbdrv/usbdrv.o main.o display.o lcd/lcd.o mcp_adc.o i2c_simple.o usb.o +include Makefile.inc +# symbolic targets: +all: master -include avrbuild/Makefile.avrbuild +master: + cd masterchip; $(MAKE) $(MFLAGS) +clean: + cd masterchip; $(MAKE) $(MFLAGS) clean + cd slavechip; $(MAKE) $(MFLAGS) clean diff --git a/firmware/Makefile.inc b/firmware/Makefile.inc new file mode 100644 index 0000000..03314b8 --- /dev/null +++ b/firmware/Makefile.inc @@ -0,0 +1,13 @@ +DEFINES += -DF_CPU=16000000 +CFLAGS += -save-temps +CFLAGS += -std=gnu99 -Wall # implements C99, for +# this removes dead code and does global linker optimization +#CFLAGS += -ffunction-sections -Wl,--gc-sections -Wl,--relax +CFLAGS += -Wall -Os -I. -mmcu=atmega88 + +# further optimization: +#CFLAGS += --param inline-call-cost=2 +CFLAGS += -fno-move-loop-invariants # suggestions from from v-usb +CFLAGS += -fno-tree-scev-cprop +CFLAGS += -fno-inline-small-functions + diff --git a/firmware/masterchip/Makefile b/firmware/masterchip/Makefile new file mode 100644 index 0000000..7bcd805 --- /dev/null +++ b/firmware/masterchip/Makefile @@ -0,0 +1,67 @@ +# masterchip-makefile +include ../Makefile.inc + +COMPILE = avr-gcc $(CFLAGS) $(DEFINES) + +OBJECTS = usbdrv/usbdrvasm.o usbdrv/usbdrv.o main.o display.o lcd/lcd.o usb.o + +# symbolic targets: +all: firmware.hex + +.c.o: + $(COMPILE) -c $< -o $@ + +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +.c.s: + $(COMPILE) -S $< -o $@ + +flash: all + avrdude -c usbasp -p m88 -U flash:w:firmware.hex + +fuses: + avrdude -c usbasp -p m88 -U lfuse:w:0xdf:m -U hfuse:w:0xde:m # external oscillator + + +## what are the source dependencies +%.d: %.c + @set -e; rm -f $@; \ + $(COMPILE) -MM $< | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@; +# line 1: exits if anything goes wrong +# line 2a: gcc -MM outputs dependencies +# line 2b: insert the %.d into dependency list + +#main.c: version.h + + +clean: + rm -f *.o *.hex *.obj *.i *.s *.d */*.i */*.s */*.o */*.d version.h + +# file targets: +firmware.bin: $(OBJECTS) + $(COMPILE) -o firmware.bin $(OBJECTS) + +firmware.hex: firmware.bin + rm -f firmware.hex firmware.eep.hex + avr-objcopy -j .text -j .data -O ihex firmware.bin firmware.hex + avr-size firmware.bin +# ./checksize firmware.bin 8192 960 +# do the checksize script as our last action to allow successful compilation +# on Windows with WinAVR where the Unix commands will fail. + +disasm: firmware.bin + avr-objdump -d firmware.bin >disasm + +functionsize: disasm + python avrbuild/functionsize.py + +countregs: disasm + python avrbuild/countregs.py + +# for depends: +-include $(OBJECTS:.o=.d) diff --git a/firmware/display.c b/firmware/masterchip/display.c similarity index 100% rename from firmware/display.c rename to firmware/masterchip/display.c diff --git a/firmware/display.h b/firmware/masterchip/display.h similarity index 100% rename from firmware/display.h rename to firmware/masterchip/display.h diff --git a/firmware/lcd/COPYING b/firmware/masterchip/lcd/COPYING similarity index 100% rename from firmware/lcd/COPYING rename to firmware/masterchip/lcd/COPYING diff --git a/firmware/lcd/lcd.c b/firmware/masterchip/lcd/lcd.c similarity index 100% rename from firmware/lcd/lcd.c rename to firmware/masterchip/lcd/lcd.c diff --git a/firmware/lcd/lcd.h b/firmware/masterchip/lcd/lcd.h similarity index 100% rename from firmware/lcd/lcd.h rename to firmware/masterchip/lcd/lcd.h diff --git a/firmware/main.c b/firmware/masterchip/main.c similarity index 100% rename from firmware/main.c rename to firmware/masterchip/main.c diff --git a/firmware/main.h b/firmware/masterchip/main.h similarity index 100% rename from firmware/main.h rename to firmware/masterchip/main.h diff --git a/firmware/masterchip/spi.c b/firmware/masterchip/spi.c new file mode 120000 index 0000000..688c0fb --- /dev/null +++ b/firmware/masterchip/spi.c @@ -0,0 +1 @@ +../shared/spi.c \ No newline at end of file diff --git a/firmware/masterchip/spi.h b/firmware/masterchip/spi.h new file mode 120000 index 0000000..ef58aea --- /dev/null +++ b/firmware/masterchip/spi.h @@ -0,0 +1 @@ +../shared/spi.h \ No newline at end of file diff --git a/firmware/usb.c b/firmware/masterchip/usb.c similarity index 100% rename from firmware/usb.c rename to firmware/masterchip/usb.c diff --git a/firmware/usb.h b/firmware/masterchip/usb.h similarity index 100% rename from firmware/usb.h rename to firmware/masterchip/usb.h diff --git a/firmware/masterchip/usbdrv b/firmware/masterchip/usbdrv new file mode 120000 index 0000000..fe38647 --- /dev/null +++ b/firmware/masterchip/usbdrv @@ -0,0 +1 @@ +../../vusb-20100715/usbdrv \ No newline at end of file diff --git a/firmware/spi.c b/firmware/shared/spi.c similarity index 100% rename from firmware/spi.c rename to firmware/shared/spi.c diff --git a/firmware/spi.h b/firmware/shared/spi.h similarity index 100% rename from firmware/spi.h rename to firmware/shared/spi.h diff --git a/firmware/slavechip/Makefile b/firmware/slavechip/Makefile new file mode 100644 index 0000000..beadcff --- /dev/null +++ b/firmware/slavechip/Makefile @@ -0,0 +1,66 @@ +include ../Makefile.inc + +COMPILE = avr-gcc $(CFLAGS) $(DEFINES) + +OBJECTS = mcp_adc.o i2c_simple.o + +# symbolic targets: +all: firmware.hex + +.c.o: + $(COMPILE) -c $< -o $@ + +.S.o: + $(COMPILE) -x assembler-with-cpp -c $< -o $@ +# "-x assembler-with-cpp" should not be necessary since this is the default +# file type for the .S (with capital S) extension. However, upper case +# characters are not always preserved on Windows. To ensure WinAVR +# compatibility define the file type manually. + +.c.s: + $(COMPILE) -S $< -o $@ + +flash: all + avrdude -c usbasp -p m88 -U flash:w:firmware.hex + +fuses: + avrdude -c usbasp -p m88 -U lfuse:w:0xdf:m -U hfuse:w:0xde:m # external oscillator + + +## what are the source dependencies +%.d: %.c + @set -e; rm -f $@; \ + $(COMPILE) -MM $< | sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' > $@; +# line 1: exits if anything goes wrong +# line 2a: gcc -MM outputs dependencies +# line 2b: insert the %.d into dependency list + +#main.c: version.h + + +clean: + rm -f *.o *.hex *.obj *.i *.s *.d */*.i */*.s */*.o */*.d version.h + +# file targets: +firmware.bin: $(OBJECTS) + $(COMPILE) -o firmware.bin $(OBJECTS) + +firmware.hex: firmware.bin + rm -f firmware.hex firmware.eep.hex + avr-objcopy -j .text -j .data -O ihex firmware.bin firmware.hex + avr-size firmware.bin +# ./checksize firmware.bin 8192 960 +# do the checksize script as our last action to allow successful compilation +# on Windows with WinAVR where the Unix commands will fail. + +disasm: firmware.bin + avr-objdump -d firmware.bin >disasm + +functionsize: disasm + python avrbuild/functionsize.py + +countregs: disasm + python avrbuild/countregs.py + +# for depends: +-include $(OBJECTS:.o=.d) diff --git a/firmware/i2c_simple.c b/firmware/slavechip/i2c_simple.c similarity index 100% rename from firmware/i2c_simple.c rename to firmware/slavechip/i2c_simple.c diff --git a/firmware/i2c_simple.h b/firmware/slavechip/i2c_simple.h similarity index 100% rename from firmware/i2c_simple.h rename to firmware/slavechip/i2c_simple.h diff --git a/firmware/mcp_adc.c b/firmware/slavechip/mcp_adc.c similarity index 100% rename from firmware/mcp_adc.c rename to firmware/slavechip/mcp_adc.c diff --git a/firmware/mcp_adc.h b/firmware/slavechip/mcp_adc.h similarity index 100% rename from firmware/mcp_adc.h rename to firmware/slavechip/mcp_adc.h diff --git a/firmware/usbdrv b/firmware/usbdrv deleted file mode 120000 index 421b6b4..0000000 --- a/firmware/usbdrv +++ /dev/null @@ -1 +0,0 @@ -../vusb-20100715/usbdrv/ \ No newline at end of file From 9e41d6e261f96f36a6c647301942aad8b9e2d498 Mon Sep 17 00:00:00 2001 From: Dario Ernst Date: Fri, 10 Dec 2010 21:49:06 +0100 Subject: [PATCH 02/11] clearified --- documentation/SPI-Proto | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/documentation/SPI-Proto b/documentation/SPI-Proto index bf19dd5..980ee66 100644 --- a/documentation/SPI-Proto +++ b/documentation/SPI-Proto @@ -8,19 +8,19 @@ Where following values are Valid: |--------------------------------------------------------------------------------------------------------------------------| | Binary Hex Name Address ValueL ValueH Reply Description| |--------------------------------------------------------------------------------------------------------------------------| -| 0000001 0x01 Read-Temp Number of None/Rand None/Rand A 16Bit Value Reads the | +| 0000001 0x01 Read-Temp Number of zeroes/Rand zeroes/Rand A 16Bit Value Reads the | | Thermometer Representing Temperature| | Starting with 0 the Temperature | |--------------------------------------------------------------------------------------------------------------------------| -| 0000002 0x02 Read-Var8 Number of the None/Rand None/Rand A 8Bit Value Reads 8Bit | +| 0000002 0x02 Read-Var8 Number of the zeroes/Rand zeroes/Rand A 8Bit Value Reads 8Bit | | var-DEFINE read from VAR Variable | |--------------------------------------------------------------------------------------------------------------------------| -| 0000003 0x03 Read-Var16 Number of the None/Rand None/Rand A 16Bit Value Reads 16Bit| +| 0000003 0x03 Read-Var16 Number of the zeroes/Rand zeroes/Rand A 16Bit Value Reads 16Bit| | var-DEFINE read from VAR Variable | |--------------------------------------------------------------------------------------------------------------------------| -| 0000004 0x04 Write-Var8 Number of the Value of Var None/Rand None/Rand Writes 8Bit| +| 0000004 0x04 Write-Var8 Number of the Value of Var zeroes/Rand zeroes/Rand Writes 8Bit| | var-DEFINE to write Variable | |--------------------------------------------------------------------------------------------------------------------------| -| 0000005 0x05 Write-Var16 Number of the Value of Var Value of Var None/Rand Writes 16 | +| 0000005 0x05 Write-Var16 Number of the Value of Var Value of Var zeroes/Rand Writes 16 | | var-DEFINE to write (HIGH) to write (LOW) Bit Var | |--------------------------------------------------------------------------------------------------------------------------| From a874e4f099465ccce780de0c3834d8b5276bd5bb Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 21:55:09 +0100 Subject: [PATCH 03/11] add make-targets for master/slave all, fuses, flash --- firmware/Makefile | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/firmware/Makefile b/firmware/Makefile index b0f5ffc..e9403e6 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -13,6 +13,21 @@ all: master master: cd masterchip; $(MAKE) $(MFLAGS) +flash-master: + cd masterchip; $(MAKE) $(MFLAGS) flash + +fuses-master: + cd masterchip; $(MAKE) $(MFLAGS) fuses + +slave: + cd slavechip; $(MAKE) $(MFLAGS) + +flash-slave: + cd slavechip; $(MAKE) $(MFLAGS) flash + +fuses-slave: + cd slavechip; $(MAKE) $(MFLAGS) fuses + clean: cd masterchip; $(MAKE) $(MFLAGS) clean cd slavechip; $(MAKE) $(MFLAGS) clean From 57b81079eedef34913838e6a2d8980db03fc1393 Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 22:05:28 +0100 Subject: [PATCH 04/11] symlink spi-routines to slave --- firmware/slavechip/spi.c | 78 ++++++++++++++++++++++++++++++++++++++++ firmware/slavechip/spi.h | 6 ++++ 2 files changed, 84 insertions(+) create mode 100644 firmware/slavechip/spi.c create mode 100644 firmware/slavechip/spi.h diff --git a/firmware/slavechip/spi.c b/firmware/slavechip/spi.c new file mode 100644 index 0000000..870a16d --- /dev/null +++ b/firmware/slavechip/spi.c @@ -0,0 +1,78 @@ +#include +#include +#include + + +#include + + +/* SPI framework. + * + * currently alpha, uses interrupts, single master/single slave operation + */ + + +uint8_t * volatile spi_writeptr; +uint8_t * volatile spi_readptr; +uint8_t volatile spi_writelen; +uint8_t volatile spi_readlen; +uint8_t spi_readbuf[SPI_READBUF_LEN]; + + +void spi_init(){ + uint8_t spcr, spsr, d; + + /* calculate clock divisor, + * gcc with optimize will do that calculation compile-time. */ + uint8_t spi_clock_divisor(){ + double d; + d = F_CPU / SPI_BAUDRATE; + d = ceil((log(d)/log(2))*0.95); // clock needs dividing by 2^d + // the 0.95 to avoid ceil issues + return d-1; // the -1 because minimum divisor is /2 + } + + d = spi_clock_divisor(); + if(d>7){ + #warning "spi baudrate too slow, cannot be set" + d=7; + } + + //TODO: DDRs setzen + spsr = 0; + spsr |= (d & 1) ? 0 : _BV(SPI2X); + spcr = 0 | _BV(SPIE) | _BV(SPE); + spcr |= (d & 2) ? _BV(SPR0) : 0; + spcr |= (d & 4) ? _BV(SPR1) : 0; + +#ifdef SPI_MASTER + spcr |= _BV(MSTR); +#endif + SPCR = spcr; + SPSR = spsr; + + // initialize interface for ISR: + spi_readptr = spi_readbuf; + spi_readlen = SPI_READBUF_LEN; + spi_writeptr = NULL; +} + +// return true on success, false on error +uint8_t spi_write(uint8_t *data, uint8_t len){ + if(spi_writeptr != NULL){ + return 0 + } + spi_writeptr = data; + spi_writelen = len; + //TODO: handle SS, write out first byte + return 1; +} + +#ifdef SPI_MASTER +ISR(SPI_vector){ + + + + +} +#endif //SPI_MASTER diff --git a/firmware/slavechip/spi.h b/firmware/slavechip/spi.h new file mode 100644 index 0000000..bc9969b --- /dev/null +++ b/firmware/slavechip/spi.h @@ -0,0 +1,6 @@ +#define SPI_BAUDRATE 1000000 +#define SPI_MASTER 1 +#define SPI_READBUF_LEN 32 + +uint8_t spi_write(uint8_t *data, uint8_t len); +void spi_init(); From 5f91679c073008c995bb94a4e00271a7ce811a61 Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 22:06:03 +0100 Subject: [PATCH 05/11] add first main.c/.h to slave --- firmware/slavechip/main.c | 22 ++++++++++++++++++++++ firmware/slavechip/main.h | 14 ++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 firmware/slavechip/main.c create mode 100644 firmware/slavechip/main.h diff --git a/firmware/slavechip/main.c b/firmware/slavechip/main.c new file mode 100644 index 0000000..55bfe7c --- /dev/null +++ b/firmware/slavechip/main.c @@ -0,0 +1,22 @@ +#include "main.h" +#include "spi.h" + + +void hardinit() { + /* initializes the hardware */ + + sei(); +} + +void softinit() { +} + + +int __attribute__((noreturn)) main(void) { + hardinit(); + softinit(); + + for(;;){ + } +} + diff --git a/firmware/slavechip/main.h b/firmware/slavechip/main.h new file mode 100644 index 0000000..c816a95 --- /dev/null +++ b/firmware/slavechip/main.h @@ -0,0 +1,14 @@ +#ifndef __MAIN_H +#define __MAIN_H +#include +#include +#include +#include +#include +#include +#include +#include + +#define SOFTTIMERNUMS 4 + +#endif //__MAIN_H From 81670202176de90751b8ecca35a001fa6cb90aa3 Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 22:06:25 +0100 Subject: [PATCH 06/11] build main for slavechip --- firmware/slavechip/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/slavechip/Makefile b/firmware/slavechip/Makefile index beadcff..fd75855 100644 --- a/firmware/slavechip/Makefile +++ b/firmware/slavechip/Makefile @@ -2,7 +2,7 @@ include ../Makefile.inc COMPILE = avr-gcc $(CFLAGS) $(DEFINES) -OBJECTS = mcp_adc.o i2c_simple.o +OBJECTS = main.o mcp_adc.o i2c_simple.o # symbolic targets: all: firmware.hex From c278296553cc0de9fe619c7565ff6fbae5516cb1 Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 22:07:16 +0100 Subject: [PATCH 07/11] enable build of slavechip for global Makefile --- firmware/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/Makefile b/firmware/Makefile index e9403e6..875c3a4 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -8,7 +8,7 @@ CFLAGS += -std=gnu99 -Wall # implements C99, for include Makefile.inc # symbolic targets: -all: master +all: master slave master: cd masterchip; $(MAKE) $(MFLAGS) From 5fd98947dc8c24d4eda8057e9cd135294a711bed Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 22:10:30 +0100 Subject: [PATCH 08/11] add clean-targets in top level --- firmware/Makefile | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/firmware/Makefile b/firmware/Makefile index 875c3a4..af8b59d 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -13,21 +13,29 @@ all: master slave master: cd masterchip; $(MAKE) $(MFLAGS) +clean-master: + cd masterchip; $(MAKE) $(MFLAGS) clean + flash-master: cd masterchip; $(MAKE) $(MFLAGS) flash fuses-master: cd masterchip; $(MAKE) $(MFLAGS) fuses + slave: cd slavechip; $(MAKE) $(MFLAGS) +clean-slave: + cd slavechip; $(MAKE) $(MFLAGS) clean + flash-slave: cd slavechip; $(MAKE) $(MFLAGS) flash fuses-slave: cd slavechip; $(MAKE) $(MFLAGS) fuses + clean: cd masterchip; $(MAKE) $(MFLAGS) clean cd slavechip; $(MAKE) $(MFLAGS) clean From b94ffcd878289cbfff34f58aee3aece6fd768ce1 Mon Sep 17 00:00:00 2001 From: Nidan Date: Fri, 10 Dec 2010 21:10:39 +0000 Subject: [PATCH 09/11] i2c implementated --- firmware/i2c_simple.c | 98 +++++++++++++++++++++++++++++++++++++------ firmware/i2c_simple.h | 11 +++-- 2 files changed, 91 insertions(+), 18 deletions(-) diff --git a/firmware/i2c_simple.c b/firmware/i2c_simple.c index f946064..1965d49 100644 --- a/firmware/i2c_simple.c +++ b/firmware/i2c_simple.c @@ -1,23 +1,97 @@ - #include #include "i2c_simple.h" - - -void i2c_init(){ - //TODO: implement +void i2c_init() +{ + TWBR = 0;//bit rate + TWSR = 0;//Prescaler + + TWAR = 0x80;//our address 1000 000, don't listen to general call + TWAMR = 0; + + TWCR = TWEA | TWEN;/* TWINT clear -> we must do something; unset TWSTA manually!, TWSTO */ + //TWDR - data } -uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data){ - return 0; //TODO: implement +uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data) +{ + TWCR &= ~TWSTO; + TWCR |= TWINT | TWSTA; + while(~TWCR & TWINT) {;}/* get bus access */ + /* no error possible */ + + TWDR = addr | 1; + TWCR &= ~(TWSTA | TWSTO); + TWCR |= TWINT; + while(~TWCR & TWINT) {;}/* transmit address */ + /* possible results: ACK, NAK, abitration lost */ + if(TW_STATUS == TW_MR_SLA_NACK) + { + TWCR |= TWINT | TWSTO; + return 0; + } + else if(TW_STATUS == TW_MR_ARB_LOST) {return 0;} + + uint8_t done = 0; + while(done + 1 < len) + { + TWCR |= TWEA | TWINT;/* send ack after byte */ + while(~TWCR & TWINT) {;}/* read data */ + data[done] = TWDR; + done++; + TWCR |= TWINT; + } + + TWCR &= ~TWEA; + TWCR |= TWINT;/* send nak after byte */ + while(~TWCR & TWINT) {;}/* read data */ + data[done] = TWDR; + done++; + TWCR |= TWINT | TWSTO; + return done; } -uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data){ - return 0; //TODO: implement +uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data) +{ + TWCR &= ~TWSTO; + TWCR |= TWINT | TWSTA; + while(~TWCR & TWINT) {;}/* get bus access */ + /* no error possible */ + + TWDR = addr; + TWCR &= ~(TWSTA | TWSTO); + TWCR |= TWINT; + while(~TWCR & TWINT) {;}/* transmit address */ + /* possible results: ACK, NAK, abitration lost */ + if(TW_STATUS == TW_MT_SLA_NACK) + { + TWCR |= TWINT | TWSTO; + return 0; + } + else if(TW_STATUS == TW_MT_ARB_LOST) {return 0;} + + uint8_t done = 0; + while(done < len) + { + TWDR = data[done]; + TWCR |= TWINT; + while(~TWCR & TWINT) {;}/* write data */ + /* possible results: ACK, NAK, abitration lost */ + if(TW_STATUS == TW_MT_DATA_NACK) + { + TWCR |= TWINT | TWSTO; + return done; + } + else if(TW_STATUS == TW_MT_ARB_LOST) {return done;} + done++; + } + + TWCR |= TWINT | TWSTO; + return done; } -uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t* writedata, uint8_t readlen, - uint8_t* readdata){ - return 0; //TODO: implement +uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata) +{ + return 0; //TODO: implement } diff --git a/firmware/i2c_simple.h b/firmware/i2c_simple.h index c7aee5f..2e76444 100644 --- a/firmware/i2c_simple.h +++ b/firmware/i2c_simple.h @@ -1,7 +1,5 @@ - - - - +#ifndef I2C_SIMPLE_H +#define I2C_SIMPLE_H /* initializes i2c interface (master, 400kHz) */ void i2c_init(); @@ -13,5 +11,6 @@ uint8_t i2c_read(uint8_t addr, uint8_t len, uint8_t *data); uint8_t i2c_write(uint8_t addr, uint8_t len, uint8_t *data); /* writes, followed by a repeated start and a read */ -uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t* writedata, uint8_t readlen, - uint8_t* readdata); +uint8_t i2c_write_read(uint8_t addr, uint8_t writelen, uint8_t *writedata, uint8_t readlen, uint8_t *readdata); + +#endif From 35db9c591bb50fa5a738e4a357ff56806a2f5b1e Mon Sep 17 00:00:00 2001 From: Matthias Merz Date: Fri, 10 Dec 2010 22:14:52 +0100 Subject: [PATCH 10/11] fix paths for functionsize/countregs --- firmware/masterchip/Makefile | 4 ++-- firmware/slavechip/Makefile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/masterchip/Makefile b/firmware/masterchip/Makefile index 7bcd805..390b004 100644 --- a/firmware/masterchip/Makefile +++ b/firmware/masterchip/Makefile @@ -58,10 +58,10 @@ disasm: firmware.bin avr-objdump -d firmware.bin >disasm functionsize: disasm - python avrbuild/functionsize.py + python ../avrbuild/functionsize.py countregs: disasm - python avrbuild/countregs.py + python ../avrbuild/countregs.py # for depends: -include $(OBJECTS:.o=.d) diff --git a/firmware/slavechip/Makefile b/firmware/slavechip/Makefile index fd75855..f3fa900 100644 --- a/firmware/slavechip/Makefile +++ b/firmware/slavechip/Makefile @@ -57,10 +57,10 @@ disasm: firmware.bin avr-objdump -d firmware.bin >disasm functionsize: disasm - python avrbuild/functionsize.py + python ../avrbuild/functionsize.py countregs: disasm - python avrbuild/countregs.py + python ../avrbuild/countregs.py # for depends: -include $(OBJECTS:.o=.d) From 8c1d74acda0fa2157e0cc7fd34529e619c538d1b Mon Sep 17 00:00:00 2001 From: Dario Ernst Date: Fri, 10 Dec 2010 22:15:26 +0100 Subject: [PATCH 11/11] moved softtimer to own file --- firmware/masterchip/main.h | 4 +++- firmware/masterchip/softtimer.c | 1 + firmware/masterchip/softtimer.h | 1 + firmware/shared/softtimer.c | 20 ++++++++++++++++++++ firmware/shared/softtimer.h | 18 ++++++++++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) create mode 120000 firmware/masterchip/softtimer.c create mode 120000 firmware/masterchip/softtimer.h create mode 100644 firmware/shared/softtimer.c create mode 100644 firmware/shared/softtimer.h diff --git a/firmware/masterchip/main.h b/firmware/masterchip/main.h index fc9bc6a..0595353 100644 --- a/firmware/masterchip/main.h +++ b/firmware/masterchip/main.h @@ -26,10 +26,12 @@ #include "spi.h" #include "usb.h" +#define SOFTTIMERNUMS 4 +#include "softtimer.h" + extern uint8_t newThermoData; extern uint16_t thermoData[]; -#define SOFTTIMERNUMS 4 #define LED1PORT PORTC #define LED1APIN 0 diff --git a/firmware/masterchip/softtimer.c b/firmware/masterchip/softtimer.c new file mode 120000 index 0000000..28d64fd --- /dev/null +++ b/firmware/masterchip/softtimer.c @@ -0,0 +1 @@ +../shared/softtimer.c \ No newline at end of file diff --git a/firmware/masterchip/softtimer.h b/firmware/masterchip/softtimer.h new file mode 120000 index 0000000..2d6405e --- /dev/null +++ b/firmware/masterchip/softtimer.h @@ -0,0 +1 @@ +../shared/softtimer.h \ No newline at end of file diff --git a/firmware/shared/softtimer.c b/firmware/shared/softtimer.c new file mode 100644 index 0000000..2b25429 --- /dev/null +++ b/firmware/shared/softtimer.c @@ -0,0 +1,20 @@ +#include "softtimer.h" + +volatile uint16_t timer1_acc; +uint16_t softtimer_last[SOFTTIMERNUMS]; + +void softtimer_reset(uint8_t timernum){ + softtimer_last[timernum] = timer1_acc; +} + +uint8_t softtimer(uint8_t timernum, uint16_t interval){ + uint16_t timer1_acc_tmp = timer1_acc; // because of volatile + if((uint16_t)(timer1_acc_tmp - (uint16_t)(softtimer_last[timernum]) >= interval )){ + softtimer_last[timernum] = timer1_acc_tmp; + return(1); + } + return(0); +} + +// SOFTTIMER( , ); +// #define SOFTTIMER(n,a) if(softtimer((n),(a*8))) diff --git a/firmware/shared/softtimer.h b/firmware/shared/softtimer.h new file mode 100644 index 0000000..417e61b --- /dev/null +++ b/firmware/shared/softtimer.h @@ -0,0 +1,18 @@ +// NOTES: +// Please #define SOFTTIMERNUMS aNum before including this! + +#ifndef __SOFTTIMER_H +#define __SOFTTIMER_H + +extern volatile uint16_t timer1_acc; +extern uint16_t softtimer_last[SOFTTIMERNUMS]; + + +void softtimer_reset(uint8_t timernum); +uint8_t softtimer(uint8_t timernum, uint16_t interval); + +// SOFTTIMER( , ); +#define SOFTTIMER(n,a) if(softtimer((n),(a*8))) + + +#endif