+ version 0.1.04

+ stricter interface
+ better performance compare in example code
This commit is contained in:
rob tillaart 2015-03-06 15:37:48 +01:00
parent 53ea9611db
commit 18febddfea
3 changed files with 97 additions and 53 deletions

View File

@ -1,7 +1,7 @@
//
// FILE: fastShiftOut.ino
// AUTHOR: Rob Tillaart
// VERSION: 0.1.00
// VERSION: 0.1.01
// PURPOSE: test sketch
// URL:
//
@ -20,44 +20,48 @@ 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++)
{
FSO.write(0x55);
}
uint32_t duration = micros() - start;
uint32_t duration1 = micros() - start;
Serial.print("FastShiftOut1: ");
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++)
{
FSO.write(0x55);
FSO.write(0x55);
}
duration = micros() - start;
uint32_t duration2 = micros() - start;
Serial.print("FastShiftOut2: ");
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<100; i++)
for (int i=0; i<1000; i++)
{
shiftOut(12, 13, 0x55, LSBFIRST);
}
duration = micros() - start;
duration1 = micros() - start;
Serial.print("Standard shiftOut1: ");
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++)
{
shiftOut(12, 13, 0x55, LSBFIRST);
shiftOut(12, 13, 0x55, LSBFIRST);
}
duration = micros() - start;
duration2 = micros() - start;
Serial.print("Standard shiftOut2: ");
Serial.println(duration/100.0, 1);
Serial.println(duration2 * 0.001);
Serial.print(" Delta: ");
Serial.println((duration2 - duration1) * 0.001);
Serial.println();
Serial.println("\nTest print interface");
start = micros();
@ -65,9 +69,9 @@ void setup()
{
FSO.println("Hello world");
}
duration = micros() - start;
Serial.print("println(\"Hello world\"): ");
Serial.println(duration/100.0, 1);
duration1 = micros() - start;
Serial.print("println(\"Hello world\"): \t");
Serial.println(duration1 * 0.01);
start = micros();
@ -75,9 +79,9 @@ void setup()
{
FSO.println(1357);
}
duration = micros() - start;
Serial.print("println(1357): ");
Serial.println(duration/100.0, 1);
duration1 = micros() - start;
Serial.print("println(1357): \t\t\t");
Serial.println(duration1 * 0.01);
start = micros();
@ -85,15 +89,14 @@ void setup()
{
FSO.println(3.14159265, 4);
}
duration = micros() - start;
Serial.print("println(3.14159265, 4): ");
Serial.println(duration/100.0, 1);
duration1 = micros() - start;
Serial.print("println(3.14159265, 4): \t");
Serial.println(duration1 * 0.01);
Serial.println("\ndone");
Serial.println("\ndone ...");
}
void loop()
{
}

View File

@ -1,7 +1,7 @@
//
// FILE: FastShiftOut.cpp
// AUTHOR: Rob Tillaart
// VERSION: 0.1.03
// VERSION: 0.1.04
// PURPOSE: shiftout that implements the Print interface
// DATE: 2013-08-22
// URL:
@ -14,42 +14,43 @@
//
// Constructor
// prepares the digitalWrite()
FastShiftOut::FastShiftOut(uint8_t datapin, uint8_t clockpin, uint8_t bitOrder)
FastShiftOut::FastShiftOut(const uint8_t datapin, const uint8_t clockpin, const uint8_t bitOrder)
{
_bitorder = bitOrder;
_value = -1;
pinMode(datapin, OUTPUT);
pinMode(clockpin, OUTPUT);
// uint8_t _datatimer = digitalPinToTimer(datapin);
// if (_datatimer != NOT_ON_TIMER) turnOffPWM(_datatimer); TODO
uint8_t _dataport = digitalPinToPort(datapin);
uint8_t _dataport = digitalPinToPort(datapin);
_dataout = 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);
_clockout = portOutputRegister(_clockport);
_clockbit = digitalPinToBitMask(clockpin);
_clockbit = digitalPinToBitMask(clockpin);
}
//
// write() must implement the virtual write of Print class
//
size_t FastShiftOut::write(uint8_t data)
// approx 64us/byte
size_t FastShiftOut::write(const uint8_t data)
{
_value = data;
for (uint8_t i = 0; i < 8; i++)
for (uint8_t i = 0; i < 8; i++)
{
uint8_t v;
if (_bitorder == LSBFIRST) v = !!(_value & (1 << i));
else v = !!(_value & (1 << (7 - i)));
if (_bitorder == LSBFIRST) v = (_value & (1 << i));
else v = (_value & (1 << (7 - i)));
uint8_t oldSREG = SREG;
cli();
if (v == LOW) *_dataout &= ~_databit;
else *_dataout |= _databit;
if (v == 0) *_dataout &= ~_databit;
else *_dataout |= _databit;
*_clockout |= _clockbit;
*_clockout &= ~_clockbit;
SREG = oldSREG;
@ -57,6 +58,46 @@ size_t FastShiftOut::write(uint8_t data)
return 1;
}
//
// this version is twice as fast,
// but it is in CLI() mode
// approx 32 us / byte
// size_t FastShiftOut::write(uint8_t data)
// {
// _value = data;
// // prep masks
// uint8_t dm1 = *_dataout | _databit;
// uint8_t dm0 = *_dataout & ~_databit;
// uint8_t cm1 = *_clockout | _clockbit;
// uint8_t cm0 = *_clockout & ~_clockbit;
// uint8_t oldSREG = SREG;
// cli();
// if (_bitorder == LSBFIRST)
// {
// for (uint8_t m = 0x01; m != 0x80; m <<= 1)
// {
// if (_value & m) *_dataout = dm1;
// else *_dataout = dm0;
// *_clockout = cm1;
// *_clockout = cm0;
// }
// }
// else
// {
// for (uint8_t m = 0x80; m > 0; m >>= 1)
// {
// if (_value & m) *_dataout = dm1;
// else *_dataout = dm0;
// *_clockout = cm1;
// *_clockout = cm0;
// }
// }
// SREG = oldSREG;
// return 1;
// }
//
// reads back the last value written.
//

View File

@ -1,7 +1,7 @@
//
// FILE: FastShiftOut.h
// AUTHOR: Rob Tillaart
// VERSION: 0.1.03
// VERSION: 0.1.04
// PURPOSE: shiftout that implements the Print interface
// DATE: 2013-08-22
// URL:
@ -13,30 +13,30 @@
#define FastShiftOut_h
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#include "Arduino.h"
#else
#include "WProgram.h"
#include "WProgram.h"
#endif
#define FASTSHIFTOUT_LIB_VERSION "0.1.03"
#define FASTSHIFTOUT_LIB_VERSION (F("0.1.04"))
#include "Print.h"
class FastShiftOut : public Print
{
public:
FastShiftOut(uint8_t, uint8_t, uint8_t);
size_t write(uint8_t);
public:
FastShiftOut(const uint8_t, const uint8_t, const uint8_t);
size_t write(const uint8_t);
int read(void);
private:
private:
uint8_t _bitorder;
int _value;
uint8_t _databit;
uint8_t _databit;
volatile uint8_t *_dataout;
uint8_t _clockbit;
uint8_t _clockbit;
volatile uint8_t *_clockout;
};