+ version 0.1.01

+ stricter interface
+ better performance compare in example code
This commit is contained in:
rob tillaart 2015-03-06 15:09:11 +01:00
parent cc73f24876
commit 53ea9611db
3 changed files with 54 additions and 43 deletions

View File

@ -1,7 +1,7 @@
//
// FILE: FastShiftIn.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// VERSION: 0.1.01
// PURPOSE: shiftin
// DATE: 2013-09-29
// URL:
@ -11,47 +11,48 @@
#include "FastShiftIn.h"
FastShiftIn::FastShiftIn(uint8_t datapin, uint8_t clockpin, uint8_t bitOrder)
FastShiftIn::FastShiftIn(const uint8_t datapin, const uint8_t clockpin, const uint8_t bitOrder)
{
_bitorder = bitOrder;
_value = -1;
_value = FASTSHIFTIN_NOVALUE;
pinMode(datapin, INPUT);
pinMode(clockpin, INPUT);
// uint8_t _datatimer = digitalPinToTimer(datapin);
// if (_datatimer != NOT_ON_TIMER) turnOffPWM(_datatimer); TODO
uint8_t _dataport = digitalPinToPort(datapin);
uint8_t _dataport = digitalPinToPort(datapin);
_datain = portOutputRegister(_dataport);
_databit = digitalPinToBitMask(datapin);
_databit = digitalPinToBitMask(datapin);
// uint8_t _clocktimer = digitalPinToTimer(clockpin);
// if (_clocktimer != NOT_ON_TIMER) turnOffPWM(_clocktimer);
uint8_t _clockport = digitalPinToPort(clockpin);
uint8_t _clockport = digitalPinToPort(clockpin);
_clockin = portOutputRegister(_clockport);
_clockbit = digitalPinToBitMask(clockpin);
_clockbit = digitalPinToBitMask(clockpin);
}
int FastShiftIn::read()
{
_value = 0;
for (uint8_t i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
{
uint8_t oldSREG = SREG;
cli();
*_clockin |= _clockbit;
if ((*_datain & _databit) > 0)
*_clockin |= _clockbit;
if ((*_datain & _databit) > 0)
{
if (_bitorder == LSBFIRST)
_value |= (1 << i);
_value |= (1 << i);
else
_value |= (1 << (7 - i));
_value |= (1 << (7 - i));
}
*_clockin |= _clockbit;
*_clockin |= _clockbit;
SREG = oldSREG;
}
}
return _value;
}
// -- END OF FILE --

View File

@ -1,7 +1,7 @@
//
// FILE: FastShiftIn.h
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// VERSION: 0.1.01
// PURPOSE: shiftin
// DATE: 2013-09-29
// URL:
@ -13,27 +13,29 @@
#define FastShiftIn_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#include "Arduino.h"
#else
#include "WProgram.h"
#include "WProgram.h"
#endif
#define FASTSHIFTIN_LIB_VERSION "0.1.00"
#define FASTSHIFTIN_LIB_VERSION "0.1.01"
#define FASTSHIFTIN_NOVALUE -1
class FastShiftIn
{
public:
FastShiftIn(uint8_t, uint8_t, uint8_t);
public:
FastShiftIn(const uint8_t, const uint8_t, const uint8_t);
int read(void);
private:
private:
uint8_t _bitorder;
int _value;
uint8_t _databit;
uint8_t _databit;
volatile uint8_t *_datain;
uint8_t _clockbit;
uint8_t _clockbit;
volatile uint8_t *_clockin;
};

View File

@ -1,7 +1,7 @@
//
// FILE: fastShiftIn.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// VERSION: 0.1.01
// PURPOSE: test sketch
// URL:
//
@ -25,45 +25,53 @@ void setup()
Serial.println("\nPerformance - time in us");
uint32_t start = micros();
for (int i=0; i<100; i++)
for (int i=0; i<1000; i++)
{
x = FSI.read();
}
uint32_t duration = micros() - start;
uint32_t duration1 = micros() - start;
Serial.print("FastShiftIn1: ");
Serial.println(duration/100.0, 1);
Serial.println(duration1 * 0.001);
start = micros();
for (int i=0; i<100; i++)
for (int i=0; i<1000; i++)
{
x = FSI.read();
x = FSI.read();
}
duration = micros() - start;
uint32_t duration2 = micros() - start;
Serial.print("FastShiftIn2: ");
Serial.println(duration/100.0, 1);
Serial.println(duration2 * 0.001);
Serial.print(" Delta: ");
Serial.println((duration2-duration1)* 0.001);
Serial.println();
start = micros();
for (int i=0; i<10000; i++)
for (int i=0; i<1000; i++)
{
x = shiftIn(12, 13, LSBFIRST);
}
duration = micros() - start;
duration1 = micros() - start;
Serial.print("Standard shiftIn1: ");
Serial.println(duration/10.0, 1);
Serial.println(duration1* 0.001);
start = micros();
for (int i=0; i<10000; i++)
for (int i=0; i<1000; i++)
{
x = shiftIn(12, 13, LSBFIRST);
x = shiftIn(12, 13, LSBFIRST);
}
duration = micros() - start;
duration2 = micros() - start;
Serial.print("Standard shiftIn2: ");
Serial.println(duration/10.0, 1);
Serial.println(duration2 * 0.001);
Serial.print(" Delta: ");
Serial.println((duration2-duration1) * 0.001);
Serial.println();
Serial.println("done...");
}
void loop()
{
}
}