mirror of
https://github.com/RobTillaart/Arduino.git
synced 2024-09-19 16:46:11 -04:00
+ version 0.1.04
+ stricter interface + better performance compare in example code
This commit is contained in:
parent
53ea9611db
commit
18febddfea
@ -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()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
@ -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.
|
||||
//
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user