• Hola!
    Estoy teniendo un problema raro al intentar utilizar una memoria DRAM Winbond W24512A.

    Yo escribo toda la DRAM con valores consecutivos, a partir de $0000: 0,1,2,3,4,5,6,7,8,....,255,0,1,2,3.......255,0,1...etc

    Luego, la vuelvo a recorrer leyendolá y enviando lo leído por el puerto RS-232, como para ver si estoy haciendo las cosas bien. Y parece que ALGO va mal, por que lo que leo es algo así como: 0,1,2,3,0,1,2,3,8,9,10,11,8,9,10,11,16,17,18,19,16,17,18,19....etc.

    Acá se ve lo que quiero decir:

    (sigo en otro post)


     

  • La memoria es una Winbond W24512A, que tiene 64K (mi decodificador de direcciones, que parece funcionar correctamente, solo selecciona la memoria DRAM en cuestión cuando A15 es 0).

    Las señales /WE (habilitar escritura de datos de la DRAM), CS1 y CS2 (habilitar el chip) y /OE (habilitar salida de datos de la DRAM) están bien. Y el código no podría ser más simple (en CCS):

    //escribo LA DRAM .......   
       set_tris_d(0x00); //Salida
       output_low(_WE);
       for(direccion=0;direccion <65535; direccion++) {
             //Pongo la direccion en el bus de direcciones:
             _Set_Address(direccion);
             output_d(direccion);
             delay_us(1);       
        }


    //LEO LA DRAM y la mando por el puerto serie....   
       set_tris_d(0xFF); //Entrada
       output_high(_WE);   

         for(direccion=0;direccion <65535; direccion++) {
             //Pongo la direccion en el bus de direcciones:
             _Set_Address(direccion);
             dato = input_d();
             //Envio el dato por RS-232
             printf("%X", dato);
             delay_us(350);       
        }


    Y esta la rutina para poner la dir en el bus:

    void _Set_Address(int16 direccion) {
       //Coloca una direccion en el bus de direcciones
       
       unsigned int8 ADH, ADL;
       ADH = make8(direccion, 1);
       ADL = make8(direccion, 0);

       //Primero coloco ADH en el LATCH superior...
             output_high(_OE);
             output_b(ADH);
             output_high(_LE1);
             delay_us(1);       
             output_low(_LE1);
             delay_us(1);       
       
             output_b(ADL);
             output_high(_LE2);
             delay_us(1);
             output_low(_LE2); 
             delay_us(1);       
             output_low(_OE);
             delay_us(1);   
    }
    (estoy usando dos latches, para poner los 16 bits de la direccion usando solo 8 pines del PIC. Pero eso se que funciona OK).

    ¿Que se me puede estar pasando? ¿Alguna característica de la memoria que no estoy teniendo en cuenta?

    Si miran con atención el esquema del analizador, las direcciones realmente "avanzan" sin saltos, acá se ve mejor:


    (sigo en el otro post...)
     

  • O sea que la "repetición" tiene origen o bien en el chip DRAM, o bien hay "algo" que no alcanzo a ver.
    En la ultima imagen se ve que las direcciones no se repiten cada cuatro...algo que podría ser el origen del problema.

    ¿Alguien tiene alguna sugerencia sobre que podría mirar?  :-/
     

  • Un dato adicional (e indispensable...debi revisar eso antes) : La información se graba correctamente en la DRAM, el problema surge al leerla o al enviarla por el puerto serie...  confused
     

  • Me fije en el datasheet y dice SRAM, no DRAM, no hay nada muy raro en la decodificacion de direccion en las ram staticas, lo pones la direccion y trabajas sobre esa direccion, no hay filas y columnas, etc.

      En Output_D vos primero pones el dato y despues bajas CS (si son dos, bajas el que estaba en alto o los dos) y /WE ya tiene que estar en 0 y /OE tiene que estar en 1, si /W y /O estan en 0 a la vez pasan cosas raras.

      La hiciste con cables el bus? yo los problemas que tuve fueron de cables, dos lineas de address se tocan y pasan cosas de este tipo.

      Porque no haces esta prueba, escribis un BYTE e inmediatamente despues lo lees (sin modificar adress). Proba todos los valores del byte, si siempre lees el mismo byte entonces el bus de datos esta bien, sino ya hay un problema mas general, incluso puede que una linea de adress este suelta y se cambia al azar.

      Si la prueba esa anda, despues proba escribir un bloque chico y leer toda la memoria, si esa informacion se escribio en mas de un bloque, hay algun problema con el bus de address.

    Esas capturas son de un emulador o un osciloscopio con bus?  suprised

               Saludos
              MARCOS
     

  • Hola Marcos!
    Si, es una SRAM....solo fue un pifie al escribir  :-[ Si fuese una DRAM obviamente no iba a funcionar smile smile smile

      Porque no haces esta prueba, escribis un BYTE e inmediatamente despues lo lees (sin modificar adress). Proba todos los valores del byte, si siempre lees el mismo byte entonces el bus de datos esta bien, sino ya hay un problema mas general, incluso puede que una linea de adress este suelta y se cambia al azar.


    Esa prueba me gustó! Ya mismo la hago y te cuento.

    Esas capturas son de un emulador o un osciloscopio con bus?

    Las capturas son hechas directamente sobre el bus, con un analizador lógico...asi que el tema de los cables de direcciones (si, son cables....tengo un proto con todo encima) lo descarto....Esas gráficas son "reales", no es una simulacion, y están tomadas directamente de los pines de la memoria.

    Pruebo lo que me decis y te cuento....es una muy buena idea.  shades
     

  • Tenes razón...Al escribir y leer sin modificar la direccion, funciona ok. El tema debe venir por ahi.

    Lo que no me termina de cerrar es porque "4" y no 256 u otro valor.... :-/
     

  • Creo que la estoy jodiendo con la linea /OE. Me tengo que ir un rato, pero ni bien lo revise te confirmo. Casi seguro es eso.... wink
     

  • Lindo chiche el analizador ese! Lo tenes conectado directo sobre las patas de la RAM? porque desde otro punto no es tan util lo que lea.

    Si te anduvo la prueba de un solo byte, entonces los CS, WR OE y todo eso deben estar bien. Otra pueba que se me ocurre, es escribir un byte en la direccion 0, y ese mismo byte negado en la 1, y despues los volves a leer en el mismo orden, despues proba entre 0 y 2, 0 y 4, 0 y 8, etc... asi probas la linea de adress de forma independiente. Si falla habria que ver como falla: cual te lee mal, el original o el negado? algo mas podes sacar.

            Saludos
           MARCOS

     

  • Solucionado!!!!
    Tenia una confusion con los cables del "OE" de los latches y el de la memoria. Ya funciona ok! Mil gracias....es muy bueno que alguien con la cabeza fresca te tire ideas. Habia pasado dos horas revisando y no veia el error  :-[

    El analizador es un aparatito muy interesante. Mide unos 4x4x0.8...centímetros y tiene 8 canales. Muestrea hasta 24MHZ en los 8 canales a la vez, y toma hasta DIEZ MIL MILLONES de samples cuando se produce la condición de disparo que elijas (flancos, 0,1, etc, en cualquier canal). Va por el puerto USB y no requiere ni fuente de alimentacion ni una maquina demasiado potente. El soft corre en Win y Linux (de forma nativa, es una masa).

    Cuesta muy poco (al menos, poco para lo util que es), unos 200 u$s en Argentina. Te paso una foto al lado de un 16F88 para que veas el tamaño que tiene  wink

    Gracias de nuevo!
    SDC12635
     

Moderador (s): homecomputer, Selandari, ArielP, pastbytes, Durandal