uc: implement 16x16 -> 32 unsigned MAC macro
This commit is contained in:
parent
b69e04c4ac
commit
f840b0925a
|
@ -1,5 +1,5 @@
|
||||||
//
|
//
|
||||||
// main.1mhz.c : AVR uC code for flukso sensor board
|
// main.c : AVR uC code for flukso sensor board
|
||||||
// Copyright (c) 2008-2009 jokamajo.org
|
// Copyright (c) 2008-2009 jokamajo.org
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
|
@ -70,7 +70,8 @@ ISR(PCINT2_vect) {
|
||||||
ISR(TIMER2_OVF_vect) {
|
ISR(TIMER2_OVF_vect) {
|
||||||
// read ADC result
|
// read ADC result
|
||||||
// add to nano(Wh) counter
|
// add to nano(Wh) counter
|
||||||
aux[0].nano += (uint32_t)METERCONST * ADC;
|
MacU16X16to32(aux[0].nano, METERCONST, ADC);
|
||||||
|
|
||||||
if (aux[0].nano > 1000000000) {
|
if (aux[0].nano > 1000000000) {
|
||||||
measurements[0].value++;
|
measurements[0].value++;
|
||||||
aux[0].pulse = true;
|
aux[0].pulse = true;
|
||||||
|
@ -269,6 +270,8 @@ int main(void)
|
||||||
for (i=0; i<4; i++) _delay_ms(5000);
|
for (i=0; i<4; i++) _delay_ms(5000);
|
||||||
|
|
||||||
serialFlush();
|
serialFlush();
|
||||||
|
printString("\n");
|
||||||
|
|
||||||
WDT_on();
|
WDT_on();
|
||||||
|
|
||||||
for (;;) loop();
|
for (;;) loop();
|
||||||
|
|
33
uc/main.h
33
uc/main.h
|
@ -1,5 +1,5 @@
|
||||||
//
|
//
|
||||||
// main.1mhz.h : AVR uC header file for flukso sensor board
|
// main.h : AVR uC header file for flukso sensor board
|
||||||
// Copyright (c) 2008-2009 jokamajo.org
|
// Copyright (c) 2008-2009 jokamajo.org
|
||||||
//
|
//
|
||||||
// This program is free software; you can redistribute it and/or
|
// This program is free software; you can redistribute it and/or
|
||||||
|
@ -49,6 +49,37 @@
|
||||||
#define END1 0xdddddddd
|
#define END1 0xdddddddd
|
||||||
#define END0 0xcccccccc
|
#define END0 0xcccccccc
|
||||||
|
|
||||||
|
|
||||||
|
// This macro performs a 16x16 -> 32 unsigned MAC in 37 cycles with operands and results in memory
|
||||||
|
// based on http://www2.ife.ee.ethz.ch/~roggend/publications/wear/DSPMic_v1.1.pdf par 3.4 and table 31.
|
||||||
|
#define MacU16X16to32(uint_32Acc, uint_16In1, uint_16In2) \
|
||||||
|
asm volatile ( \
|
||||||
|
"clr r2 \n\t" \
|
||||||
|
"mul %B2, %B1 \n\t" \
|
||||||
|
"movw r4, r0 \n\t" \
|
||||||
|
"mul %A2, %A1 \n\t" \
|
||||||
|
"add %A0, r0 \n\t" \
|
||||||
|
"adc %B0, r1 \n\t" \
|
||||||
|
"adc %C0, r4 \n\t" \
|
||||||
|
"adc %D0, r5 \n\t" \
|
||||||
|
"mul %B2, %A1 \n\t" \
|
||||||
|
"add %B0, r0 \n\t" \
|
||||||
|
"adc %C0, r1 \n\t" \
|
||||||
|
"adc %D0, r2 \n\t" \
|
||||||
|
"mul %A2, %B1 \n\t" \
|
||||||
|
"add %B0, r0 \n\t" \
|
||||||
|
"adc %C0, r1 \n\t" \
|
||||||
|
"adc %D0, r2 \n\t" \
|
||||||
|
"clr r1 \n\t" \
|
||||||
|
: \
|
||||||
|
"+r" (uint_32Acc) \
|
||||||
|
: \
|
||||||
|
"a" (uint_16In1), \
|
||||||
|
"a" (uint_16In2) \
|
||||||
|
: \
|
||||||
|
"r2", "r4", "r5" \
|
||||||
|
)
|
||||||
|
|
||||||
// datastructures
|
// datastructures
|
||||||
struct state {
|
struct state {
|
||||||
boolean pulse;
|
boolean pulse;
|
||||||
|
|
Loading…
Reference in New Issue