De los mismos creadores
del test con Timer1 en el que conseguíamos salidas de 8MHz llega ahora este test de velocidad (de escritura),
Código: Seleccionar todo
/// #############################################################################
// VdR-RAM-tester
// Speed test #1
// #############################################################################
void setup()
{
// set digital port D2 mode to OUTPUT
// Data Direction Register D (DDRD) controls PD7-PD0 mode
DDRD = 0b00000100;
}
void loop()
{
// D2 HIGH
PORTD |= (1<<PD2);
// D2 LOW
PORTD &= ~(1<<PD2);
}
a la vista del código veréis que en la inicialización se configura el puerto digital #2 (D2) para salida (OUTPUT) y en el ciclo principal del programa simplemente se alterna el estado de D2 de encendido a apagado.
Esta operación, que sería igual de rápida activando o desactivando 8 puertos digitales a la vez, ha sido una buena forma de tener una estimación más realista de a qué podemos aspirar. Mientras que utilizando la clásica función digitalWrite() ⁽¹⁾ para fijar el estado de D2 hablaríamos de velocidades máximas entre los 110 y 120kHz (sí, sí, kilohertzs), mediante la manipulación directa de los puertos la velocidad es muy superior, unas 13-18 veces más rápida, pero aún así esto supone un límite en 2MHz como veis en la imagen del osciloscopio,
o, en otras palabras, un periodo de 8 ciclos de reloj de un Nano a 16MHz o 500ns.
Pero escribir 8 puertos digitales simultáneamente está aún lejos de nuestros objetivos, necesitamos trabajar con bastantes más por cada lectura/escritura en la memoria. Si lo intentamos con un nuevo programa:
Código: Seleccionar todo
// #############################################################################
// VdR-RAM-tester
// Speed test #2
// #############################################################################
void setup()
{
// set digital port D2 mode to OUTPUT
// Data Direction Register D (DDRD) controls PD7-PD0 mode
DDRD = 0b00000100;
// set digital port D8 mode to OUTPUT
// Data Direction Register B (DDRB) controls PB5-PB0 (D13-D8) mode
DDRB = 0b000001;
// set digital port D17 mode to OUTPUT
// Data Direction Register C (DDRC) controls PC7-PB0 (D21-D14) mode
DDRC = 0b00001000;
}
void loop()
{
// D2 HIGH
PORTD |= (1<<PD2);
// D8 HIGH
PORTB |= (1<<PD0);
// D17 HIGH
PORTC |= (1<<PC3);
// D2 LOW
PORTD &= ~(1<<PD2);
// D8 LOW
PORTB &= ~(1<<PD0);
// D17 LOW
PORTC &= ~(1<<PC3);
}
enciende y apaga "a todo lo que da" 3 puertos digitales diferentes, que a efectos prácticos sería igual de rápido activando o desactivando todos los pines I/O del Nano, pero la velocidad resultante es la mitad de la anterior, 1MHz o, en términos de periodo, 16 ciclos de reloj de un Nano a 16MHz o 1,000ns.
En una situación de prueba real en el que el procesador va a estar leyendo, calculando, almacenando información y refrescando la pantalla es de cajón que va a ser aún más lento. De confirmarse esto implicaría que, como se dijo, los tests se harían a la velocidad que el Nano pueda pero no será posible realizar tests a velocidades tales que sirvan para verificar que una memoria de 200ns funciona bien con accesos de lectura/escritura a 5MHz.
De momento esta es la tesis más realista a menos que se nos escape alguna posibilidad.
Estos tests los he realizado con un Arduino Nano R3 con CH340C. Las impresiones no han sido buenas, después de soldarle los pines y subir el firmware (a 115.2kbps), funcionaba sin problemas pero la segunda vez que se intenta subir el firmware falla estrepitosamente quejándose de un fallo de sincronismo o de comunicación. Desconectando el Nano del puerto USB, reiniciando Arduino IDE y volviendo a conectar el Nano por USB, vuelve a funcionar lo que apunta a un posible fallo por parte del Arduino IDE o de AVRdude pero, aún de forma incómoda y aparatosa, compilar y subir al Nano con CH340C es posible.
⁽¹⁾ La función digitalWrite() realiza demasiadas comprobaciones adicionales como si el pin existe, si está activa la PWM (y la desactiva), calcula el puerto asociado al pin, la máscara para el puerto, comprueba el estado actual y si es necesario lo cambia, etc., etc.