Fix MISRA violations (#268)

* improve misra checking

* fix 1600 misra violations

* fix mistyped pointer

* misra script was not filtering duplicates
This commit is contained in:
Bruno Bousquet 2019-10-21 21:49:07 -04:00 committed by Josh Stewart
parent 9b96707036
commit f1521b65d8
15 changed files with 203 additions and 195 deletions

View File

@ -10,7 +10,7 @@ if [ -f ./results.txt ]; then
fi fi
for i in speeduino/speeduino/*.ino; do for i in speeduino/speeduino/*.ino; do
$cppcheck_bin --dump --max-configs=1 --inline-suppr --suppressions-list=speeduino/misra/suppressions.txt --suppress=syntaxError:speeduino/speeduino/src/PID_v1/PID_v1.h --include=${i%.*}.h -DCORE_AVR=1 -D__AVR_ATmega2560__=1 $i > /dev/null $cppcheck_bin --dump --max-configs=1 --inline-suppr --suppressions-list=speeduino/misra/suppressions.txt --language=c++ --include=${i%.*}.h -DCORE_AVR=1 -D__AVR_ATmega2560__=1 $i > /dev/null
done done
mv speeduino/speeduino/*.dump ./ mv speeduino/speeduino/*.dump ./
@ -19,10 +19,10 @@ rm ./utils.*.dump
python $cppcheck_misra --rule-texts=speeduino/misra/misra_2012_text.txt *.dump 2> results.txt python $cppcheck_misra --rule-texts=speeduino/misra/misra_2012_text.txt *.dump 2> results.txt
#rm *.dump #rm *.dump
cat results.txt sort results.txt | uniq
# wc -l results.txt # wc -l results.txt
errors=`wc -l < results.txt | tr -d ' '` errors=`sort results.txt | uniq | wc -l`
echo $errors MISRA violations echo $errors MISRA violations
if [ $errors -gt 0 ]; then if [ $errors -gt 0 ]; then

View File

@ -114,7 +114,7 @@ No text specified
Rule 11.2 Rule 11.2
No text specified No text specified
Rule 11.3 Rule 11.3
No text specified A cast shall not be performed between a pointer to object type and a pointer to a different object type
Rule 11.4 Rule 11.4
Advisory - Object pointers should not be treated as or converted to integers Advisory - Object pointers should not be treated as or converted to integers
Rule 11.5 Rule 11.5
@ -186,7 +186,7 @@ No text specified
Rule 17.1 Rule 17.1
No text specified No text specified
Rule 17.2 Rule 17.2
No text specified Functions shall not call themselves, either directly or indirectly
Rule 17.3 Rule 17.3
No text specified No text specified
Rule 17.4 Rule 17.4
@ -196,7 +196,7 @@ No text specified
Rule 17.6 Rule 17.6
No text specified No text specified
Rule 17.7 Rule 17.7
No text specified The value returned by a function having non-void return type shall be used
Rule 17.8 Rule 17.8
Advisory - An argument to a function should be treated as read-only Advisory - An argument to a function should be treated as read-only
Rule 18.1 Rule 18.1
@ -206,7 +206,7 @@ No text specified
Rule 18.3 Rule 18.3
No text specified No text specified
Rule 18.4 Rule 18.4
No text specified Advisory - The +, -, += and -= operators should not be applied to an expression of pointer type
Rule 18.5 Rule 18.5
No text specified No text specified
Rule 18.6 Rule 18.6

View File

@ -18,7 +18,7 @@
uint16_t freeRam(); uint16_t freeRam();
#if defined(TIMER5_MICROS) #if defined(TIMER5_MICROS)
//#define micros() (((timer5_overflow_count << 16) + TCNT5) * 4) //Fast version of micros() that uses the 4uS tick of timer5. See timers.ino for the overflow ISR of timer5 /*#define micros() (((timer5_overflow_count << 16) + TCNT5) * 4) */ //Fast version of micros() that uses the 4uS tick of timer5. See timers.ino for the overflow ISR of timer5
#define millis() (ms_counter) //Replaces the standard millis() function with this macro. It is both faster and more accurate. See timers.ino for its counter increment. #define millis() (ms_counter) //Replaces the standard millis() function with this macro. It is both faster and more accurate. See timers.ino for its counter increment.
static inline unsigned long micros_safe(); //A version of micros() that is interrupt safe static inline unsigned long micros_safe(); //A version of micros() that is interrupt safe
#else #else
@ -34,7 +34,7 @@
*********************************************************************************************************** ***********************************************************************************************************
* Schedules * Schedules
*/ */
//Refer to http://svn.savannah.nongnu.org/viewvc/trunk/avr-libc/include/avr/iomxx0_1.h?root=avr-libc&view=markup //Refer to svn.savannah.nongnu.org/viewvc/trunk/avr-libc/include/avr/iomxx0_1.h?root=avr-libc&view=markup
#define FUEL1_COUNTER TCNT3 #define FUEL1_COUNTER TCNT3
#define FUEL2_COUNTER TCNT3 #define FUEL2_COUNTER TCNT3
#define FUEL3_COUNTER TCNT3 #define FUEL3_COUNTER TCNT3
@ -94,9 +94,9 @@
#define IGN1_TIMER_ENABLE() TIFR5 |= (1<<OCF5A); TIMSK5 |= (1 << OCIE5A) //Turn on the A compare unit (ie turn on the interrupt) #define IGN1_TIMER_ENABLE() TIFR5 |= (1<<OCF5A); TIMSK5 |= (1 << OCIE5A) //Turn on the A compare unit (ie turn on the interrupt)
#define IGN2_TIMER_ENABLE() TIFR5 |= (1<<OCF5B); TIMSK5 |= (1 << OCIE5B) //Turn on the B compare unit (ie turn on the interrupt) #define IGN2_TIMER_ENABLE() TIFR5 |= (1<<OCF5B); TIMSK5 |= (1 << OCIE5B) //Turn on the B compare unit (ie turn on the interrupt)
#define IGN3_TIMER_ENABLE() TIFR5 |= (1<<OCF5C); TIMSK5 |= (1 << OCIE5C) //Turn on the C compare unit (ie turn on the interrupt) #define IGN3_TIMER_ENABLE() TIFR5 |= (1<<OCF5C); TIMSK5 |= (1 << OCIE5C) //Turn on the C compare unit (ie turn on the interrupt)
//#define IGN1_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5A) //Turn on the B compare unit (ie turn on the interrupt) /*#define IGN1_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5A) */ //Turn on the B compare unit (ie turn on the interrupt)
//#define IGN2_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) //Turn on the B compare unit (ie turn on the interrupt) /*#define IGN2_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5B) */ //Turn on the B compare unit (ie turn on the interrupt)
//#define IGN3_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) //Turn on the C compare unit (ie turn on the interrupt) /*#define IGN3_TIMER_ENABLE() TIMSK5 |= (1 << OCIE5C) */ //Turn on the C compare unit (ie turn on the interrupt)
#define IGN4_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4A) //Turn on the A compare unit (ie turn on the interrupt) #define IGN4_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4A) //Turn on the A compare unit (ie turn on the interrupt)
#define IGN5_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4C) //Turn on the A compare unit (ie turn on the interrupt) #define IGN5_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4C) //Turn on the A compare unit (ie turn on the interrupt)
#define IGN6_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //Replaces injector 4 #define IGN6_TIMER_ENABLE() TIMSK4 |= (1 << OCIE4B) //Replaces injector 4

View File

@ -130,7 +130,7 @@
#define IGN7_COMPARE (TIM4)->CCR3 #define IGN7_COMPARE (TIM4)->CCR3
#define IGN8_COMPARE (TIM4)->CCR4 #define IGN8_COMPARE (TIM4)->CCR4
#endif #endif
//https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 //github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444
#define FUEL1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E #define FUEL1_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC1E
#define FUEL2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E #define FUEL2_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC2E
#define FUEL3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E #define FUEL3_TIMER_ENABLE() (TIM2)->CCER |= TIM_CCER_CC3E
@ -214,7 +214,7 @@
#define IGN7_COMPARE (TIMER4->regs).gen->CCR3 #define IGN7_COMPARE (TIMER4->regs).gen->CCR3
#define IGN8_COMPARE (TIMER4->regs).gen->CCR4 #define IGN8_COMPARE (TIMER4->regs).gen->CCR4
#endif #endif
//https://github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444 //github.com/rogerclarkmelbourne/Arduino_STM32/blob/754bc2969921f1ef262bd69e7faca80b19db7524/STM32F1/system/libmaple/include/libmaple/timer.h#L444
#define FUEL1_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC1E #define FUEL1_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC1E
#define FUEL2_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC2E #define FUEL2_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC2E
#define FUEL3_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC3E #define FUEL3_TIMER_ENABLE() (TIMER2->regs).gen->CCER |= TIMER_CCER_CC3E

View File

@ -23,7 +23,7 @@
*********************************************************************************************************** ***********************************************************************************************************
* Schedules * Schedules
*/ */
//http://shawnhymel.com/661/learning-the-teensy-lc-interrupt-service-routines/ //shawnhymel.com/661/learning-the-teensy-lc-interrupt-service-routines/
#define FUEL1_COUNTER FTM0_CNT #define FUEL1_COUNTER FTM0_CNT
#define FUEL2_COUNTER FTM0_CNT #define FUEL2_COUNTER FTM0_CNT
#define FUEL3_COUNTER FTM0_CNT #define FUEL3_COUNTER FTM0_CNT

View File

@ -23,7 +23,7 @@
*********************************************************************************************************** ***********************************************************************************************************
* Schedules * Schedules
*/ */
//http://shawnhymel.com/661/learning-the-teensy-lc-interrupt-service-routines/ //shawnhymel.com/661/learning-the-teensy-lc-interrupt-service-routines/
#define FUEL1_COUNTER TMR1_CNTR0 #define FUEL1_COUNTER TMR1_CNTR0
#define FUEL2_COUNTER TMR1_CNTR0 #define FUEL2_COUNTER TMR1_CNTR0
#define FUEL3_COUNTER TMR1_CNTR1 #define FUEL3_COUNTER TMR1_CNTR1

View File

@ -1126,7 +1126,7 @@ void sendPageASCII()
Serial.println((const __FlashStringHelper *)&pageTitles[27]);//27 is the index to the first char in the second sting in pageTitles Serial.println((const __FlashStringHelper *)&pageTitles[27]);//27 is the index to the first char in the second sting in pageTitles
// The following loop displays in human readable form of all byte values in config page 1 up to but not including the first array. // The following loop displays in human readable form of all byte values in config page 1 up to but not including the first array.
// incrementing void pointers is cumbersome. Thus we have "pnt_configPage = (byte *)pnt_configPage + 1" // incrementing void pointers is cumbersome. Thus we have "pnt_configPage = (byte *)pnt_configPage + 1"
for (pnt_configPage = &configPage2; pnt_configPage < &configPage2.wueValues[0]; pnt_configPage = (byte *)pnt_configPage + 1) { Serial.println(*((byte *)pnt_configPage)); } for (pnt_configPage = (byte *)&configPage2; pnt_configPage < &configPage2.wueValues[0]; pnt_configPage = (byte *)pnt_configPage + 1) { Serial.println(*((byte *)pnt_configPage)); }
for (byte x = 10; x; x--)// The x between the ';' has the same representation as the "x != 0" test or comparision for (byte x = 10; x; x--)// The x between the ';' has the same representation as the "x != 0" test or comparision
{ {
Serial.print(configPage2.wueValues[10 - x]);// This displays the values horizantially on the screen Serial.print(configPage2.wueValues[10 - x]);// This displays the values horizantially on the screen
@ -1204,7 +1204,7 @@ void sendPageASCII()
//currentTitleIndex = 91; //currentTitleIndex = 91;
//To Display Values from Config Page 3 //To Display Values from Config Page 3
Serial.println((const __FlashStringHelper *)&pageTitles[91]);//special typecasting to enable suroutine that the F macro uses Serial.println((const __FlashStringHelper *)&pageTitles[91]);//special typecasting to enable suroutine that the F macro uses
for (pnt_configPage = &configPage6; pnt_configPage < &configPage6.voltageCorrectionBins[0]; pnt_configPage = (byte *)pnt_configPage + 1) for (pnt_configPage = (byte *)&configPage6; pnt_configPage < &configPage6.voltageCorrectionBins[0]; pnt_configPage = (byte *)pnt_configPage + 1)
{ {
Serial.println(*((byte *)pnt_configPage));// Displaying byte values of config page 3 up to but not including the first array Serial.println(*((byte *)pnt_configPage));// Displaying byte values of config page 3 up to but not including the first array
} }

View File

@ -9,7 +9,7 @@
//#define fastDegreesToUS(targetDegrees) ((targetDegrees) * (unsigned long)timePerDegree) //#define fastDegreesToUS(targetDegrees) ((targetDegrees) * (unsigned long)timePerDegree)
#define fastDegreesToUS(targetDegrees) (((targetDegrees) * (unsigned long)timePerDegreex16) >> 4) #define fastDegreesToUS(targetDegrees) (((targetDegrees) * (unsigned long)timePerDegreex16) >> 4)
//#define fastTimeToAngle(time) (((unsigned long)time * degreesPeruSx2048) / 2048) //Divide by 2048 will be converted at compile time to bitshift /*#define fastTimeToAngle(time) (((unsigned long)time * degreesPeruSx2048) / 2048) */ //Divide by 2048 will be converted at compile time to bitshift
#define fastTimeToAngle(time) (((unsigned long)(time) * degreesPeruSx32768) / 32768) //Divide by 32768 will be converted at compile time to bitshift #define fastTimeToAngle(time) (((unsigned long)(time) * degreesPeruSx32768) / 32768) //Divide by 32768 will be converted at compile time to bitshift
#define ignitionLimits(angle) ( (((int16_t)(angle)) >= CRANK_ANGLE_MAX_IGN) ? ((angle) - CRANK_ANGLE_MAX_IGN) : ( ((int16_t)(angle) < 0) ? ((angle) + CRANK_ANGLE_MAX_IGN) : (angle)) ) #define ignitionLimits(angle) ( (((int16_t)(angle)) >= CRANK_ANGLE_MAX_IGN) ? ((angle) - CRANK_ANGLE_MAX_IGN) : ( ((int16_t)(angle) < 0) ? ((angle) + CRANK_ANGLE_MAX_IGN) : (angle)) )

View File

@ -1040,7 +1040,7 @@ byte pinFlex; //Pin with the flex sensor attached
byte pinBaro; //Pin that an external barometric pressure sensor is attached to (If used) byte pinBaro; //Pin that an external barometric pressure sensor is attached to (If used)
byte pinResetControl; // Output pin used control resetting the Arduino byte pinResetControl; // Output pin used control resetting the Arduino
// global variables // from speeduino.ino /* global variables */ // from speeduino.ino
extern struct statuses currentStatus; // from speeduino.ino extern struct statuses currentStatus; // from speeduino.ino
extern struct table3D fuelTable; //16x16 fuel map extern struct table3D fuelTable; //16x16 fuel map
extern struct table3D fuelTable2; //16x16 fuel map extern struct table3D fuelTable2; //16x16 fuel map

View File

@ -259,7 +259,9 @@ void idleControl()
//limit to the configured max steps. This must include any idle up adder, to prevent over-opening. //limit to the configured max steps. This must include any idle up adder, to prevent over-opening.
if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3) if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3)
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3; {
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3;
}
doStep(); doStep();
} }
@ -275,9 +277,11 @@ void idleControl()
iacStepTime = configPage6.iacStepTime * 1000; iacStepTime = configPage6.iacStepTime * 1000;
iacCoolTime = configPage9.iacCoolTime * 1000; iacCoolTime = configPage9.iacCoolTime * 1000;
//limit to the configured max steps. This must include any idle up adder, to prevent over-opening. //limit to the configured max steps. This must include any idle up adder, to prevent over-opening.
if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3) if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3)
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3; {
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3;
}
} }
doStep(); doStep();
} }
@ -308,7 +312,9 @@ void idleControl()
//limit to the configured max steps. This must include any idle up adder, to prevent over-opening. //limit to the configured max steps. This must include any idle up adder, to prevent over-opening.
if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3) if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3)
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3; {
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3;
}
doStep(); doStep();
currentStatus.idleLoad = idleStepper.curIdleStep >> 1; //Current step count (Divided by 2 for byte) currentStatus.idleLoad = idleStepper.curIdleStep >> 1; //Current step count (Divided by 2 for byte)
@ -458,7 +464,9 @@ static inline void disableIdle()
//limit to the configured max steps. This must include any idle up adder, to prevent over-opening. //limit to the configured max steps. This must include any idle up adder, to prevent over-opening.
if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3) if (idleStepper.targetIdleStep > configPage9.iacMaxSteps * 3)
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3; {
idleStepper.targetIdleStep = configPage9.iacMaxSteps * 3;
}
} }
} }
BIT_CLEAR(currentStatus.spark, BIT_SPARK_IDLE); //Turn the idle control flag off BIT_CLEAR(currentStatus.spark, BIT_SPARK_IDLE); //Turn the idle control flag off

View File

@ -1026,82 +1026,82 @@ void setPinMapping(byte boardID)
//****************************************** //******************************************
//******** PORTA CONNECTIONS *************** //******** PORTA CONNECTIONS ***************
//****************************************** //******************************************
// = PA0 //Wakeup ADC123 /* = PA0 */ //Wakeup ADC123
pinTPS = PA1; //ADC123 pinTPS = PA1; //ADC123
pinMAP = PA2; //ADC123 pinMAP = PA2; //ADC123
pinIAT = PA3; //ADC123 pinIAT = PA3; //ADC123
pinCLT = PA4; //ADC12 pinCLT = PA4; //ADC12
pinO2 = PA5; //ADC12 pinO2 = PA5; //ADC12
// = PA6; //ADC12 LED_BUILTIN_1 /* = PA6; */ //ADC12 LED_BUILTIN_1
pinFuelPump = PA7; //ADC12 LED_BUILTIN_2 pinFuelPump = PA7; //ADC12 LED_BUILTIN_2
pinIdle1 = PA8; // pinIdle1 = PA8; //
// = PA9 //TXD1 /* = PA9 */ //TXD1
// = PA10 //RXD1 /* = PA10 */ //RXD1
// = PA11 //(DO NOT USE FOR SPEEDUINO) USB /* = PA11 */ //(DO NOT USE FOR SPEEDUINO) USB
// = PA12 //(DO NOT USE FOR SPEEDUINO) USB /* = PA12 */ //(DO NOT USE FOR SPEEDUINO) USB
// = PA13 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA13 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
// = PA14 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA14 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
// = PA15 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA15 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
//****************************************** //******************************************
//******** PORTB CONNECTIONS *************** //******** PORTB CONNECTIONS ***************
//****************************************** //******************************************
// = PB0; (DO NOT USE FOR SPEEDUINO)//ADC123 //SPI FLASH CHIP CS pin /* = PB0; */ //(DO NOT USE FOR SPEEDUINO) ADC123 - SPI FLASH CHIP CS pin
pinBaro = PB1; //ADC12 pinBaro = PB1; //ADC12
// = PB2; //(DO NOT USE FOR SPEEDUINO) BOOT1 /* = PB2; */ //(DO NOT USE FOR SPEEDUINO) BOOT1
// = PB3; //(DO NOT USE FOR SPEEDUINO) SPI1_SCK FLASH CHIP /* = PB3; */ //(DO NOT USE FOR SPEEDUINO) SPI1_SCK FLASH CHIP
// = PB4; //(DO NOT USE FOR SPEEDUINO) SPI1_MISO FLASH CHIP /* = PB4; */ //(DO NOT USE FOR SPEEDUINO) SPI1_MISO FLASH CHIP
// = PB5; //(DO NOT USE FOR SPEEDUINO) SPI1_MOSI FLASH CHIP /* = PB5; */ //(DO NOT USE FOR SPEEDUINO) SPI1_MOSI FLASH CHIP
// = PB6; //NRF_CE /* = PB6; */ //NRF_CE
// = PB7; //NRF_CS /* = PB7; */ //NRF_CS
// = PB8; //NRF_IRQ /* = PB8; */ //NRF_IRQ
pinIdle2 = PB9; // pinIdle2 = PB9; //
// = PB10; //TXD3 /* = PB10; */ //TXD3
// = PB11; //RXD3 /* = PB11; */ //RXD3
pinBoost = PB12; // pinBoost = PB12; //
// = PB13; //SPI2_SCK /* = PB13; */ //SPI2_SCK
// = PB14; //SPI2_MISO /* = PB14; */ //SPI2_MISO
// = PB15; //SPI2_MOSI /* = PB15; */ //SPI2_MOSI
//****************************************** //******************************************
//******** PORTC CONNECTIONS *************** //******** PORTC CONNECTIONS ***************
//****************************************** //******************************************
// = PC0; //ADC123 /* = PC0; */ //ADC123
pinBat = PC1; //ADC123 pinBat = PC1; //ADC123
// = PC2; //ADC123 /* = PC2; */ //ADC123
// = PC3; //ADC123 /* = PC3; */ //ADC123
// = PC4; //ADC12 /* = PC4; */ //ADC12
// = PC5; //ADC12 /* = PC5; */ //ADC12
pinVVT_1 = PC6; // pinVVT_1 = PC6; //
pinDisplayReset = PC7; // pinDisplayReset = PC7; //
// = PC8; //(DO NOT USE FOR SPEEDUINO) //SDIO_D0 /* = PC8; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D0
// = PC9; //(DO NOT USE FOR SPEEDUINO) //SDIO_D1 /* = PC9; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D1
// = PC10; //(DO NOT USE FOR SPEEDUINO) //SDIO_D2 /* = PC10; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D2
// = PC11; //(DO NOT USE FOR SPEEDUINO) //SDIO_D3 /* = PC11; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D3
// = PC12; //(DO NOT USE FOR SPEEDUINO) //SDIO_SCK /* = PC12; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_SCK
pinTachOut = PC13; // pinTachOut = PC13; //
// = PC14; //(DO NOT USE FOR SPEEDUINO) //OSC32_IN /* = PC14; */ //(DO NOT USE FOR SPEEDUINO) - OSC32_IN
// = PC15; //(DO NOT USE FOR SPEEDUINO) //OSC32_OUT /* = PC15; */ //(DO NOT USE FOR SPEEDUINO) - OSC32_OUT
//****************************************** //******************************************
//******** PORTD CONNECTIONS *************** //******** PORTD CONNECTIONS ***************
//****************************************** //******************************************
// = PD0; //CANRX /* = PD0; */ //CANRX
// = PD1; //CANTX /* = PD1; */ //CANTX
// = PD2; //(DO NOT USE FOR SPEEDUINO) //SDIO_CMD /* = PD2; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_CMD
pinCoil1 = PD3; // pinCoil1 = PD3; //
pinCoil2 = PD4; // pinCoil2 = PD4; //
// = PD5;//TXD2 /* = PD5;*/ //TXD2
// = PD6; //RXD2 /* = PD6; */ //RXD2
pinCoil3 = PD7; // pinCoil3 = PD7; //
pinCoil4 = PD8; // pinCoil4 = PD8; //
pinCoil5 = PD9;// pinCoil5 = PD9;//
pinFan = PD10; // pinFan = PD10; //
// = PD11; // /* = PD11; */ //
// = PD12; // /* = PD12; */ //
// = PD13; // /* = PD13; */ //
// = PD14; // /* = PD14; */ //
// = PD15; // /* = PD15; */ //
//****************************************** //******************************************
//******** PORTE CONNECTIONS *************** //******** PORTE CONNECTIONS ***************
@ -1109,8 +1109,8 @@ void setPinMapping(byte boardID)
pinStepperDir = PE0; // pinStepperDir = PE0; //
pinStepperStep = PE1; // pinStepperStep = PE1; //
pinStepperEnable = PE2; // pinStepperEnable = PE2; //
// = PE3; //ONBOARD KEY1 /* = PE3; */ //ONBOARD KEY1
// = PE4; //ONBOARD KEY2 /* = PE4; */ //ONBOARD KEY2
pinFlex = PE5; // pinFlex = PE5; //
pinTrigger = PE6; // pinTrigger = PE6; //
pinInjector1 = PE7; // pinInjector1 = PE7; //
@ -1120,8 +1120,8 @@ void setPinMapping(byte boardID)
pinInjector5 = PE11; // pinInjector5 = PE11; //
pinInjector6 = PE12; // pinInjector6 = PE12; //
pinTrigger2 = PE13; // pinTrigger2 = PE13; //
// = PE14; // /* = PE14; */ //
// = PE15; // /* = PE15; */ //
#elif defined(CORE_STM32) #elif defined(CORE_STM32)
//blue pill wiki.stm32duino.com/index.php?title=Blue_Pill //blue pill wiki.stm32duino.com/index.php?title=Blue_Pill
//Maple mini wiki.stm32duino.com/index.php?title=Maple_Mini //Maple mini wiki.stm32duino.com/index.php?title=Maple_Mini
@ -1637,45 +1637,45 @@ void setPinMapping(byte boardID)
//****************************************** //******************************************
//******** PORTA CONNECTIONS *************** //******** PORTA CONNECTIONS ***************
//****************************************** //******************************************
// = PA0 //Wakeup ADC123 /* = PA0 */ //Wakeup ADC123
pinInjector1 = PA1; pinInjector1 = PA1;
pinInjector2 = PA2; pinInjector2 = PA2;
pinInjector3 = PA3; pinInjector3 = PA3;
pinInjector4 = PA4; pinInjector4 = PA4;
// = PA5; //ADC12 /* = PA5; */ //ADC12
pinFuelPump = PA6; //ADC12 LED_BUILTIN_1 pinFuelPump = PA6; //ADC12 LED_BUILTIN_1
// = PA7; //ADC12 LED_BUILTIN_2 /* = PA7; */ //ADC12 LED_BUILTIN_2
pinCoil3 = PA8; pinCoil3 = PA8;
// = PA9 //TXD1 /* = PA9 */ //TXD1
// = PA10 //RXD1 /* = PA10 */ //RXD1
// = PA11 //(DO NOT USE FOR SPEEDUINO) USB /* = PA11 */ //(DO NOT USE FOR SPEEDUINO) USB
// = PA12 //(DO NOT USE FOR SPEEDUINO) USB /* = PA12 */ //(DO NOT USE FOR SPEEDUINO) USB
// = PA13 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA13 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
// = PA14 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA14 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
// = PA15 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA15 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
//****************************************** //******************************************
//******** PORTB CONNECTIONS *************** //******** PORTB CONNECTIONS ***************
//****************************************** //******************************************
// = PB0; (DO NOT USE FOR SPEEDUINO)//ADC123 //SPI FLASH CHIP CS pin /* = PB0; */ //(DO NOT USE FOR SPEEDUINO) ADC123 - SPI FLASH CHIP CS pin
pinBaro = PB1; //ADC12 pinBaro = PB1; //ADC12
// = PB2; //(DO NOT USE FOR SPEEDUINO) BOOT1 /* = PB2; */ //(DO NOT USE FOR SPEEDUINO) BOOT1
// = PB3; //(DO NOT USE FOR SPEEDUINO) SPI1_SCK FLASH CHIP /* = PB3; */ //(DO NOT USE FOR SPEEDUINO) SPI1_SCK FLASH CHIP
// = PB4; //(DO NOT USE FOR SPEEDUINO) SPI1_MISO FLASH CHIP /* = PB4; */ //(DO NOT USE FOR SPEEDUINO) SPI1_MISO FLASH CHIP
// = PB5; //(DO NOT USE FOR SPEEDUINO) SPI1_MOSI FLASH CHIP /* = PB5; */ //(DO NOT USE FOR SPEEDUINO) SPI1_MOSI FLASH CHIP
// = PB6; //NRF_CE /* = PB6; */ //NRF_CE
// = PB7; //NRF_CS /* = PB7; */ //NRF_CS
// = PB8; //NRF_IRQ /* = PB8; */ //NRF_IRQ
pinCoil2 = PB9; // pinCoil2 = PB9; //
// = PB9; // /* = PB9; */ //
pinCoil4 = PB10; //TXD3 pinCoil4 = PB10; //TXD3
pinIdle1 = PB11; //RXD3 pinIdle1 = PB11; //RXD3
pinIdle2 = PB12; // pinIdle2 = PB12; //
// pinBoost = PB12; // /* pinBoost = PB12; */ //
// = PB13; //SPI2_SCK /* = PB13; */ //SPI2_SCK
// = PB14; //SPI2_MISO /* = PB14; */ //SPI2_MISO
// = PB15; //SPI2_MOSI /* = PB15; */ //SPI2_MOSI
//****************************************** //******************************************
//******** PORTC CONNECTIONS *************** //******** PORTC CONNECTIONS ***************
@ -1685,60 +1685,60 @@ void setPinMapping(byte boardID)
pinIAT = PC2; //ADC123 pinIAT = PC2; //ADC123
pinCLT = PC3; //ADC123 pinCLT = PC3; //ADC123
pinO2 = PC4; //ADC12 pinO2 = PC4; //ADC12
// = PC5; //ADC12 /* = PC5; */ //ADC12
//pinVVT_1 = PC6; // /*pinVVT_1 = PC6; */ //
pinBat = PC6; // pinBat = PC6; //
pinDisplayReset = PC7; // pinDisplayReset = PC7; //
// = PC8; //(DO NOT USE FOR SPEEDUINO) //SDIO_D0 /* = PC8; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D0
// = PC9; //(DO NOT USE FOR SPEEDUINO) //SDIO_D1 /* = PC9; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D1
// = PC10; //(DO NOT USE FOR SPEEDUINO) //SDIO_D2 /* = PC10; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D2
// = PC11; //(DO NOT USE FOR SPEEDUINO) //SDIO_D3 /* = PC11; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D3
// = PC12; //(DO NOT USE FOR SPEEDUINO) //SDIO_SCK /* = PC12; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_SCK
pinTachOut = PC13; // pinTachOut = PC13; //
// = PC14; //(DO NOT USE FOR SPEEDUINO) //OSC32_IN /* = PC14; */ //(DO NOT USE FOR SPEEDUINO) - OSC32_IN
// = PC15; //(DO NOT USE FOR SPEEDUINO) //OSC32_OUT /* = PC15; */ //(DO NOT USE FOR SPEEDUINO) - OSC32_OUT
//****************************************** //******************************************
//******** PORTD CONNECTIONS *************** //******** PORTD CONNECTIONS ***************
//****************************************** //******************************************
// = PD0; //CANRX /* = PD0; */ //CANRX
// = PD1; //CANTX /* = PD1; */ //CANTX
// = PD2; //(DO NOT USE FOR SPEEDUINO) //SDIO_CMD /* = PD2; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_CMD
// = PD3; // /* = PD3; */ //
// = PD4; // /* = PD4; */ //
pinFlex = PD4; pinFlex = PD4;
// = PD5;//TXD2 /* = PD5;*/ //TXD2
// = PD6; //RXD2 /* = PD6; */ //RXD2
pinCoil1 = PD7; // pinCoil1 = PD7; //
// = PD7; // /* = PD7; */ //
// = PD8; // /* = PD8; */ //
pinCoil5 = PD9;// pinCoil5 = PD9;//
// = PD10; // /* = PD10; */ //
// = PD11; // /* = PD11; */ //
// = PD12; // /* = PD12; */ //
pinTrigger = PD13; // pinTrigger = PD13; //
pinTrigger2 = PD14; // pinTrigger2 = PD14; //
// = PD15; // /* = PD15; */ //
//****************************************** //******************************************
//******** PORTE CONNECTIONS *************** //******** PORTE CONNECTIONS ***************
//****************************************** //******************************************
// = PE0; // /* = PE0; */ //
// = PE1; // /* = PE1; */ //
pinStepperEnable = PE2; // pinStepperEnable = PE2; //
// = PE3; //ONBOARD KEY1 /* = PE3; */ //ONBOARD KEY1
// = PE4; //ONBOARD KEY2 /* = PE4; */ //ONBOARD KEY2
pinStepperStep = PE5; // pinStepperStep = PE5; //
pinFan = PE6; // pinFan = PE6; //
pinStepperDir = PE7; // pinStepperDir = PE7; //
// = PE8; // /* = PE8; */ //
// = PE9; // /* = PE9; */ //
// = PE10; // /* = PE10; */ //
pinInjector5 = PE11; // pinInjector5 = PE11; //
pinInjector6 = PE12; // pinInjector6 = PE12; //
// = PE13; // /* = PE13; */ //
// = PE14; // /* = PE14; */ //
// = PE15; // /* = PE15; */ //
#elif defined(CORE_STM32) #elif defined(CORE_STM32)
//blue pill wiki.stm32duino.com/index.php?title=Blue_Pill //blue pill wiki.stm32duino.com/index.php?title=Blue_Pill
@ -1786,45 +1786,45 @@ void setPinMapping(byte boardID)
//****************************************** //******************************************
//******** PORTA CONNECTIONS *************** //******** PORTA CONNECTIONS ***************
//****************************************** //******************************************
// = PA0 //Wakeup ADC123 /* = PA0 */ //Wakeup ADC123
pinInjector1 = PA1; pinInjector1 = PA1;
pinInjector2 = PA2; pinInjector2 = PA2;
pinInjector3 = PA3; pinInjector3 = PA3;
pinInjector4 = PA4; pinInjector4 = PA4;
pinFuelPump = PA5; //ADC12 pinFuelPump = PA5; //ADC12
// = PA6; //ADC12 LED_BUILTIN_1 /* = PA6; */ //ADC12 LED_BUILTIN_1
// = PA7; //ADC12 LED_BUILTIN_2 /* = PA7; */ //ADC12 LED_BUILTIN_2
pinCoil3 = PA8; pinCoil3 = PA8;
// = PA9 //TXD1 /* = PA9 */ //TXD1
// = PA10 //RXD1 /* = PA10 */ //RXD1
// = PA11 //(DO NOT USE FOR SPEEDUINO) USB /* = PA11 */ //(DO NOT USE FOR SPEEDUINO) USB
// = PA12 //(DO NOT USE FOR SPEEDUINO) USB /* = PA12 */ //(DO NOT USE FOR SPEEDUINO) USB
// = PA13 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA13 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
// = PA14 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA14 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
// = PA15 //(DO NOT USE FOR SPEEDUINO) //NOT ON GPIO //DEBUG ST-LINK /* = PA15 */ //(DO NOT USE FOR SPEEDUINO) NOT ON GPIO - DEBUG ST-LINK
//****************************************** //******************************************
//******** PORTB CONNECTIONS *************** //******** PORTB CONNECTIONS ***************
//****************************************** //******************************************
// = PB0; (DO NOT USE FOR SPEEDUINO)//ADC123 //SPI FLASH CHIP CS pin /* = PB0; */ //(DO NOT USE FOR SPEEDUINO) ADC123 - SPI FLASH CHIP CS pin
pinBaro = PB1; //ADC12 pinBaro = PB1; //ADC12
// = PB2; //(DO NOT USE FOR SPEEDUINO) BOOT1 /* = PB2; */ //(DO NOT USE FOR SPEEDUINO) BOOT1
// = PB3; //(DO NOT USE FOR SPEEDUINO) SPI1_SCK FLASH CHIP /* = PB3; */ //(DO NOT USE FOR SPEEDUINO) SPI1_SCK FLASH CHIP
// = PB4; //(DO NOT USE FOR SPEEDUINO) SPI1_MISO FLASH CHIP /* = PB4; */ //(DO NOT USE FOR SPEEDUINO) SPI1_MISO FLASH CHIP
// = PB5; //(DO NOT USE FOR SPEEDUINO) SPI1_MOSI FLASH CHIP /* = PB5; */ //(DO NOT USE FOR SPEEDUINO) SPI1_MOSI FLASH CHIP
// = PB6; //NRF_CE /* = PB6; */ //NRF_CE
// = PB7; //NRF_CS /* = PB7; */ //NRF_CS
// = PB8; //NRF_IRQ /* = PB8; */ //NRF_IRQ
pinCoil2 = PB9; // pinCoil2 = PB9; //
// = PB9; // /* = PB9; */ //
pinCoil4 = PB10; //TXD3 pinCoil4 = PB10; //TXD3
pinIdle1 = PB11; //RXD3 pinIdle1 = PB11; //RXD3
pinIdle2 = PB12; // pinIdle2 = PB12; //
// pinBoost = PB12; // /* pinBoost = PB12; */ //
// = PB13; //SPI2_SCK /* = PB13; */ //SPI2_SCK
// = PB14; //SPI2_MISO /* = PB14; */ //SPI2_MISO
// = PB15; //SPI2_MOSI /* = PB15; */ //SPI2_MOSI
//****************************************** //******************************************
//******** PORTC CONNECTIONS *************** //******** PORTC CONNECTIONS ***************
@ -1834,60 +1834,60 @@ void setPinMapping(byte boardID)
pinIAT = PC2; //ADC123 pinIAT = PC2; //ADC123
pinCLT = PC3; //ADC123 pinCLT = PC3; //ADC123
pinO2 = PC4; //ADC12 pinO2 = PC4; //ADC12
// = PC5; //ADC12 /* = PC5; */ //ADC12
//pinVVT_1 = PC6; // /*pinVVT_1 = PC6; */ //
pinBat = PC6; // pinBat = PC6; //
pinDisplayReset = PC7; // pinDisplayReset = PC7; //
// = PC8; //(DO NOT USE FOR SPEEDUINO) //SDIO_D0 /* = PC8; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D0
// = PC9; //(DO NOT USE FOR SPEEDUINO) //SDIO_D1 /* = PC9; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D1
// = PC10; //(DO NOT USE FOR SPEEDUINO) //SDIO_D2 /* = PC10; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D2
// = PC11; //(DO NOT USE FOR SPEEDUINO) //SDIO_D3 /* = PC11; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_D3
// = PC12; //(DO NOT USE FOR SPEEDUINO) //SDIO_SCK /* = PC12; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_SCK
pinTachOut = PC13; // pinTachOut = PC13; //
// = PC14; //(DO NOT USE FOR SPEEDUINO) //OSC32_IN /* = PC14; */ //(DO NOT USE FOR SPEEDUINO) - OSC32_IN
// = PC15; //(DO NOT USE FOR SPEEDUINO) //OSC32_OUT /* = PC15; */ //(DO NOT USE FOR SPEEDUINO) - OSC32_OUT
//****************************************** //******************************************
//******** PORTD CONNECTIONS *************** //******** PORTD CONNECTIONS ***************
//****************************************** //******************************************
// = PD0; //CANRX /* = PD0; */ //CANRX
// = PD1; //CANTX /* = PD1; */ //CANTX
// = PD2; //(DO NOT USE FOR SPEEDUINO) //SDIO_CMD /* = PD2; */ //(DO NOT USE FOR SPEEDUINO) - SDIO_CMD
// = PD3; // /* = PD3; */ //
// = PD4; // /* = PD4; */ //
pinFlex = PD4; pinFlex = PD4;
// = PD5;//TXD2 /* = PD5;*/ //TXD2
// = PD6; //RXD2 /* = PD6; */ //RXD2
pinCoil1 = PD7; // pinCoil1 = PD7; //
// = PD7; // /* = PD7; */ //
// = PD8; // /* = PD8; */ //
pinCoil5 = PD9;// pinCoil5 = PD9;//
// = PD10; // /* = PD10; */ //
// = PD11; // /* = PD11; */ //
// = PD12; // /* = PD12; */ //
pinTrigger = PD13; // pinTrigger = PD13; //
pinTrigger2 = PD14; // pinTrigger2 = PD14; //
// = PD15; // /* = PD15; */ //
//****************************************** //******************************************
//******** PORTE CONNECTIONS *************** //******** PORTE CONNECTIONS ***************
//****************************************** //******************************************
// = PE0; // /* = PE0; */ //
// = PE1; // /* = PE1; */ //
pinStepperEnable = PE2; // pinStepperEnable = PE2; //
// = PE3; //ONBOARD KEY1 /* = PE3; */ //ONBOARD KEY1
// = PE4; //ONBOARD KEY2 /* = PE4; */ //ONBOARD KEY2
pinStepperStep = PE5; // pinStepperStep = PE5; //
pinFan = PE6; // pinFan = PE6; //
pinStepperDir = PE7; // pinStepperDir = PE7; //
// = PE8; // /* = PE8; */ //
// = PE9; // /* = PE9; */ //
// = PE10; // /* = PE10; */ //
pinInjector5 = PE11; // pinInjector5 = PE11; //
pinInjector6 = PE12; // pinInjector6 = PE12; //
// = PE13; // /* = PE13; */ //
// = PE14; // /* = PE14; */ //
// = PE15; // /* = PE15; */ //
#else #else
#ifndef SMALL_FLASH_MODE //No support for bluepill here anyway #ifndef SMALL_FLASH_MODE //No support for bluepill here anyway
//Pin mappings as per the v0.2 shield //Pin mappings as per the v0.2 shield

View File

@ -11,7 +11,7 @@ unsigned long divu100(unsigned long);
//This is a dedicated function that specifically handles the case of mapping 0-1023 values into a 0 to X range //This is a dedicated function that specifically handles the case of mapping 0-1023 values into a 0 to X range
//This is a common case because it means converting from a standard 10-bit analog input to a byte or 10-bit analog into 0-511 (Eg the temperature readings) //This is a common case because it means converting from a standard 10-bit analog input to a byte or 10-bit analog into 0-511 (Eg the temperature readings)
#if defined(_VARIANT_ARDUINO_STM32_) //libmaple //ST stm32duino core returns 0 - 1023 for analog read first use analogReadResolution(12); to make it 12 bit #if defined(_VARIANT_ARDUINO_STM32_) /*libmaple */ //ST stm32duino core returns 0 - 1023 for analog read first use analogReadResolution(12); to make it 12 bit
#define fastMap1023toX(x, out_max) ( ((unsigned long)x * out_max) >> 12) #define fastMap1023toX(x, out_max) ( ((unsigned long)x * out_max) >> 12)
//This is a new version that allows for out_min //This is a new version that allows for out_min
#define fastMap10Bit(x, out_min, out_max) ( ( ((unsigned long)x * (out_max-out_min)) >> 12 ) + out_min) #define fastMap10Bit(x, out_min, out_max) ( ( ((unsigned long)x * (out_max-out_min)) >> 12 ) + out_min)

View File

@ -2,10 +2,10 @@
This scheduler is designed to maintain 2 schedules for use by the fuel and ignition systems. This scheduler is designed to maintain 2 schedules for use by the fuel and ignition systems.
It functions by waiting for the overflow vectors from each of the timers in use to overflow, which triggers an interrupt It functions by waiting for the overflow vectors from each of the timers in use to overflow, which triggers an interrupt
//Technical /Technical
Currently I am prescaling the 16-bit timers to 256 for injection and 64 for ignition. This means that the counter increments every 16us (injection) / 4uS (ignition) and will overflow every 1048576uS Currently I am prescaling the 16-bit timers to 256 for injection and 64 for ignition. This means that the counter increments every 16us (injection) / 4uS (ignition) and will overflow every 1048576uS
Max Period = (Prescale)*(1/Frequency)*(2^17) Max Period = (Prescale)*(1/Frequency)*(2^17)
(See http://playground.arduino.cc/code/timer1) (See playground.arduino.cc/code/timer1)
This means that the precision of the scheduler is 16uS (+/- 8uS of target) for fuel and 4uS (+/- 2uS) for ignition This means that the precision of the scheduler is 16uS (+/- 8uS of target) for fuel and 4uS (+/- 2uS) for ignition
/Features /Features
@ -16,7 +16,7 @@ Timer identification
The Arduino timer3 is used for schedule 1 The Arduino timer3 is used for schedule 1
The Arduino timer4 is used for schedule 2 The Arduino timer4 is used for schedule 2
Both of these are 16-bit timers (ie count to 65536) Both of these are 16-bit timers (ie count to 65536)
See page 136 of the processors datasheet: http://www.atmel.com/Images/doc2549.pdf See page 136 of the processors datasheet: www.atmel.com/Images/doc2549.pdf
256 prescale gives tick every 16uS 256 prescale gives tick every 16uS
256 prescale gives overflow every 1048576uS (This means maximum wait time is 1.0485 seconds) 256 prescale gives overflow every 1048576uS (This means maximum wait time is 1.0485 seconds)
@ -181,10 +181,10 @@ static inline unsigned int setQueue(volatile Schedule *queue[], Schedule *schedu
//Sort the queues. Both queues are kept in sync. //Sort the queues. Both queues are kept in sync.
//This implementes a sorting networking based on the Bose-Nelson sorting network //This implementes a sorting networking based on the Bose-Nelson sorting network
//See: http://pages.ripco.net/~jgamble/nw.html //See: pages.ripco.net/~jgamble/nw.html
#define SWAP(x,y) if(tmpQueue[y] < tmpQueue[x]) { unsigned int tmp = tmpQueue[x]; tmpQueue[x] = tmpQueue[y]; tmpQueue[y] = tmp; volatile Schedule *tmpS = queue[x]; queue[x] = queue[y]; queue[y] = tmpS; } #define SWAP(x,y) if(tmpQueue[y] < tmpQueue[x]) { unsigned int tmp = tmpQueue[x]; tmpQueue[x] = tmpQueue[y]; tmpQueue[y] = tmp; volatile Schedule *tmpS = queue[x]; queue[x] = queue[y]; queue[y] = tmpS; }
//SWAP(0, 1); //Likely not needed /*SWAP(0, 1); */ //Likely not needed
//SWAP(2, 3); //Likely not needed /*SWAP(2, 3); */ //Likely not needed
SWAP(0, 2); SWAP(0, 2);
SWAP(1, 3); SWAP(1, 3);
SWAP(1, 2); SWAP(1, 2);

View File

@ -50,7 +50,7 @@ byte cltErrorCount = 0;
/** /**
* @brief Simple low pass IIR filter macro for the analog inputs * @brief Simple low pass IIR filter macro for the analog inputs
* This is effectively implementing the smooth filter from http://playground.arduino.cc/Main/Smooth * This is effectively implementing the smooth filter from playground.arduino.cc/Main/Smooth
* But removes the use of floats and uses 8 bits of fixed precision. * But removes the use of floats and uses 8 bits of fixed precision.
*/ */
#define ADC_FILTER(input, alpha, prior) (((long)input * (256 - alpha) + ((long)prior * alpha))) >> 8 #define ADC_FILTER(input, alpha, prior) (((long)input * (256 - alpha) + ((long)prior * alpha))) >> 8
@ -79,7 +79,7 @@ ISR(ADC_vect)
byte nChannel; byte nChannel;
int result = ADCL | (ADCH << 8); int result = ADCL | (ADCH << 8);
//ADCSRA = 0x6E; // ADC disabled by clearing bit 7(ADEN) /*ADCSRA = 0x6E; */ // ADC disabled by clearing bit 7(ADEN)
//BIT_CLEAR(ADCSRA, ADIE); //BIT_CLEAR(ADCSRA, ADIE);
nChannel = ADMUX & 0x07; nChannel = ADMUX & 0x07;
@ -102,7 +102,7 @@ ISR(ADC_vect)
AnChannel[nChannel-1] = result; AnChannel[nChannel-1] = result;
//BIT_SET(ADCSRA, ADIE); //BIT_SET(ADCSRA, ADIE);
//ADCSRA = 0xEE; // ADC Interrupt Flag enabled /*ADCSRA = 0xEE; */ // ADC Interrupt Flag enabled
} }
*/ */
ISR(ADC_vect) ISR(ADC_vect)

View File

@ -10,7 +10,7 @@ We're implementing a lower frequency interrupt loop to perform calculations that
//Technical //Technical
Timer2 is only 8bit so we are setting the prescaler to 128 to get the most out of it. This means that the counter increments every 0.008ms and the overflow at 256 will be after 2.048ms Timer2 is only 8bit so we are setting the prescaler to 128 to get the most out of it. This means that the counter increments every 0.008ms and the overflow at 256 will be after 2.048ms
Max Period = (Prescale)*(1/Frequency)*(2^8) Max Period = (Prescale)*(1/Frequency)*(2^8)
(See http://arduinomega.blogspot.com.au/2011/05/timer2-and-overflow-interrupt-lets-get.html) (See arduinomega.blogspot.com.au/2011/05/timer2-and-overflow-interrupt-lets-get.html)
We're after a 1ms interval so we'll need 131 intervals to reach this ( 1ms / 0.008ms per tick = 125). We're after a 1ms interval so we'll need 131 intervals to reach this ( 1ms / 0.008ms per tick = 125).
Hence we will preload the timer with 131 cycles to leave 125 until overflow (1ms). Hence we will preload the timer with 131 cycles to leave 125 until overflow (1ms).