Hola gente, quiero compartir algo de información, ya que lo que encontré en la red es escaso, y los temas aquí publicados llevan tiempo sin movimiento, en fin, si los Sres. moderadores creen conveniente moverlos al sitio correspondiente, es aceptado totalmente.
Hace unos días me doy con la necesidad de utilizar memorias DRAM,(requería 4Mb aprox.) por lo cuál al no encontrar buena o suficiente información, decidí analizar una hoja de datos de la memoria MT4C4256 que tenía a mano, he hice un pequeño programa, que gestiona el refresco, lectura y grabado de la misma.
Cómo lo más importante a cuidar en éstas memorias es el ciclo de refresco, en éste caso debe hacerse antes de los 8ms.
Utilizando un 16F877 a 4Mhz, va de sobra y el resultado fué excelente!
Pero claro, si el PIC gestionará a la memoria , más todo el programa al que estará relacionado, pues seguramente se quedará corto, sino se hacen maniobras por interrupción, aumentar la fcia. de OSC al máximo posible, o bien organizar al programa para que sea lo más dinámico posible, aquí usar un delay de varios "ms" sería catastrófico!
A continuación adjunto diagrama de prueba y programa.
#include <16F877.h>
#fuses NOWDT, NOPROTECT, XT
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
#byte addrin = 0x06
#bit write = 0x05.3
#define WE pin_e2
#define RAS pin_e1
#define CAS pin_e0
void main(void)
{
set_tris_a(0b00001000);
set_tris_b(0b00001111);
set_tris_c(0b00000000);
set_tris_d(0b00000000);
set_tris_e(0b00000000);
long ADDR=0;
output_bit(WE,1); // E2 =WE
output_bit(RAS,1); // E1 =RAS
output_bit(CAS,1); // E0 =CAS
delay_ms(10);
output_bit(CAS,1);
delay_us(2);
output_bit(RAS,1);
delay_us(2);
while(true)
{
////////////////////////////// Refresh/////////////////////////////////////////////
if(ADDR<511)ADDR++;else ADDR=0;
output_c(ADDR);
output_d(ADDR>>8);
delay_us(1);
output_bit(RAS,0);
delay_us(1);
output_bit(RAS,1);
///////////////////////////////////////////////////////////////////////////////////
output_c(addrin);
output_d(0);
if(!write)
{
delay_us(1); // WRITE
output_bit(RAS,0);
delay_us(1);
output_bit(WE,0);
output_c(0);
output_d(0);
delay_us(1);
output_bit(CAS,0);
delay_us(1);
output_bit(WE,1);
delay_us(1);
output_bit(CAS,1);
delay_us(1);
output_bit(RAS,1);
}
else // READ
{
delay_us(1);
output_bit(RAS,0);
delay_us(1);
output_c(0);
output_d(0);
delay_us(1);
output_bit(CAS,0);
delay_us(1);
output_bit(CAS,1);
delay_us(1);
output_bit(RAS,1);
}
}
delay_us(1);
}