hi all,
I'm think about using the Arduino Due as the brains of a Reprap like machine. It will read commands from an SD card (or from it's memory, maybe Due has enough?), parse them and control stepper motors.
So I ordered one and started doing some tests. I've found that digitalWrite and digitalRead are remarkably slower on the Due than the UNO.
I used this sketch as a test:
#include <digitalWriteFast.h>
/*
I'm trying to see how fast some instructions are on Arduino UNO and Arduino DUE
*/
int sampleSize = 1000000; // do a million times!
long lastTime;
//-----------------------------------------------------------------------------
void setup(){
delay(50); // wait a bit. (Arduino Due prints nonsense to the serial port...??)
Serial.begin(115200); // go really fast serial!
// I will store my value in this:
int n;
// and use these pins for writing or reading
pinMode(2, OUTPUT);
pinMode(3, INPUT);
Serial.println("digitalWrite:");
lastTime = micros();
for(int i =0; i < sampleSize; i++){
digitalWrite(2, HIGH);
digitalWrite(2, LOW);
}
printTime( micros() - lastTime);
#ifdef digitalWriteFast // not working with Arduino Due
Serial.println("digitalWriteFast:");
lastTime = micros();
for(int i =0; i < sampleSize; i++){
digitalWriteFast(2, HIGH);
digitalWriteFast(2, LOW);
}
printTime( micros() - lastTime);
#endif
Serial.println("digitalRead:");
lastTime = micros();
for(int i =0; i < sampleSize; i++){
n = digitalRead(3);
}
printTime( micros() - lastTime);
#ifdef digitalReadFast
Serial.println("digitalReadFast:");
lastTime = micros();
for(int i =0; i < sampleSize; i++){
n = digitalReadFast(3);
}
printTime( micros() - lastTime);
#endif
}
//-----------------------------------------------------------------------------
void loop(){
// do nothing
}
//-----------------------------------------------------------------------------
void printTime( long microsecs){
int mins, secs, msecs, usecs;
msecs = floor(microsecs / 1000);
usecs = microsecs % 1000;
secs = floor(msecs / 1000);
msecs = msecs % 1000;
mins = floor(secs / 60);
secs = secs % 60;
Serial.print("time: ");
Serial.println(microsecs);
Serial.print(mins);
Serial.print(" min ");
Serial.print(secs);
Serial.print(" sec ");
Serial.print(msecs);
Serial.print(" msec ");
Serial.print(usecs);
Serial.println(" usecs");
Serial.println("");
delay(20);
}
I commented out "#include <digitalWriteFast.h>" when compiling for the Due.
These are the results:
Arduino Due:
digitalWrite:
time: 5196306
0 min 5 sec 196 msec 306 usecs
digitalRead:
time: 1156070
0 min 1 sec 156 msec 70 usecs
Arduino UNO:
digitalWrite:
time: 142964
0 min 0 sec 142 msec 964 usecs
digitalWriteFast:
time: 8624
0 min 0 sec 8 msec 624 usecs
digitalRead:
time: 87508
0 min 0 sec 87 msec 508 usecs
digitalReadFast:
time: 7544
0 min 0 sec 7 msec 544 usecs
Sanguino ATMEGA664A (Reprap motherboard v1.2)
digitalWrite:
time: 142964
0 min 0 sec 142 msec 964 usecs
digitalWriteFast:
time: 8628
0 min 0 sec 8 msec 628 usecs
digitalRead:
time: 86440
0 min 0 sec 86 msec 440 usecs
digitalReadFast:
time: 7548
0 min 0 sec 7 msec 548 usecs
Does anyone know why I find this difference? Is there already a digitalWriteFast library for Due available?
best,
tim.