Potřebuji poradit od někoho, kdo tomu rozumí
Na internetu jsem našel pár zapojení jak využít Arduino k testování DRAM čipů. Mám jich pár doma, asi vadné, ale tester by se hodil. Z x programů jsem složil jeden který se zdá celkem použitelný. Jenže trochu tápu v tom, kdy jaké signály mají být na RAS,CAS,WE,OE, ... no spíš na to čučím už tak dlouho, že nevím co dělám
Používám arduino nano a IO jsou třeba
tyto, klasika 4256 tedy 256k x 4.
Příloha:
Poznámka: Zapojení 4256
Snímek obrazovky_2016-07-23_13-08-36.png [ 50.7 KiB | Zobrazeno 5465 krát ]
Ukázka výstupu pro prvních 5 adres. Zapisuji na všech datových vstupech pro všechny adresy 1ku a pak je čtu analogově, kde H je max 1024, takže to by asi bylo ok (spíš náhoda). Pak zapisuji nuly a tam už se to rozchází. Myslím, že mám špatnou souslednost RAS,CAS,OE,WE.
No předem děkuji za rady a jestli se to dotáhne, snad to i někomu pomůže
Kód:
RAM 256k x 4 tester.
Zapisuji 1111 na vsech adresach.
Ctu zapsana data.
Adresa 0 000000000 908 910 928 913
Adresa 1 100000000 915 918 918 917
Adresa 2 010000000 956 952 951 947
Adresa 3 110000000 1021 1010 1002 986
Adresa 4 001000000 1023 1023 1023 1002
Zapisuji 0000 na vsech adresach.
Ctu zapsana data.
Adresa 0 000000000 0 0 0 888
Adresa 1 100000000 0 0 0 888
Adresa 2 010000000 0 0 0 889
Adresa 3 110000000 0 0 0 889
Adresa 4 001000000 0 0 0 887
Samotný program
Kód:
//PIN usage
const int addressPins[9]={5,6,7,8,9,10,11,12,13};
const int ras = 3;
const int cas = 2;
const int readWrite = 4;
const int dataPins[4]= {A3,A4,A5,A6};
const int oe = A0;
int analogValue[4]; //used to store returned data
void setup()
{
Serial.begin(9600);
for(int n=0;n<9;n++)
pinMode(addressPins[n],OUTPUT);
pinMode(ras,OUTPUT);
pinMode(cas,OUTPUT);
pinMode(readWrite,OUTPUT);
pinMode(oe,OUTPUT);
digitalWrite(ras,HIGH);
digitalWrite(cas,HIGH);
digitalWrite(readWrite,HIGH);
Serial.println("DRAM 256k x 4 tester.");
}
bool done = false;
void loop()
{
int address;
char buffer[30];
int n;
if(done)
return;
Serial.println("Zapisuji 1111 na vsech adresach.");
for( address=0; address<512; address++)
writeValue(address,1);
Serial.println("Ctu zapsana data.");
for( address=0; address<512; address++)
{
sprintf(buffer,"Adresa %d ",address);
Serial.print(buffer);
readValue(address);
for(int n=0; n<4; n++)
{
Serial.print(analogValue[n]);
Serial.print(" ");
}
Serial.println(""); //newline
}
Serial.println("Zapisuji 0000 na vsech adresach.");
for( address=0; address<512; address++)
writeValue( address, 0);
Serial.println("Ctu zapsana data.");
for( address=0; address<512; address++)
{
sprintf(buffer,"Adresa %d ",address);
Serial.print(buffer);
readValue(address);
for(int n=0; n<4; n++)
{
Serial.print(analogValue[n]);
Serial.print(" ");
}
Serial.println(""); //newline
}
done=true;
};
void readValue(int address)
{
bool addressBit;
bool dataBit;
int n;
//prepare analog pins for analog reading
for(n=0;n<4;n++)
{pinMode(dataPins[n],INPUT);
digitalWrite(dataPins[n],LOW);
delay(10);
//make a reading and discard it
analogRead(dataPins[n]);
delay(10);
}
//write out address to address bus
for(n=0;n<9;n++)
{addressBit = address & (1<<n);
Serial.print(addressBit);
digitalWrite(addressPins[n],addressBit);
}
Serial.print(" "); //newline
delay(10);
//send enable LOW
digitalWrite(ras,LOW);
delay(10);
//enable output
digitalWrite(readWrite,HIGH);
delay(10);
//digitalWrite(oe, LOW); //tohle nevím kdy a kam
//delay(10);
digitalWrite(cas,LOW);
delay(10);
for(n=0;n<4;n++)
analogValue[n]=analogRead(dataPins[n]);
delay(10);
//disable output
digitalWrite(cas,HIGH);
delay(10);
digitalWrite(ras,HIGH);
}
void writeValue(int address,byte value)
{
bool addressBit;
bool dataBit;
int n;
//write out address to address bus
for(n=0;n<9;n++)
{addressBit = address & (1<<n);
//Serial.print(addressBit);
digitalWrite(addressPins[n],addressBit);
}
//Serial.print(" "); //newline
//put data on databus
for(n=0;n<4;n++)
{pinMode(dataPins[n],OUTPUT);
dataBit = value;// & (1<<n);
//Serial.print(dataBit);
digitalWrite(dataPins[n],dataBit);
delay(1);
}
//Serial.println(""); //newline
digitalWrite(ras,LOW);
delay(10);
digitalWrite(readWrite, LOW);
delay(10);
//digitalWrite(oe, HIGH); //tohle nevím kdy a kam
//delay(10);
digitalWrite(cas,LOW);
delay(10);
digitalWrite(readWrite,HIGH);
delay(10);
digitalWrite(cas,HIGH);
delay(10);
digitalWrite(ras,HIGH);
}