Forum: Mikrocontroller und Digitale Elektronik SRAM Write / Read Cycle


von Lötmann (Gast)


Lesenswert?

Hallo miteinander

Ich probiere ein SRAM der Firma NEC ( uPD431000A-70LL) 128Kbyte mittels 
einen PIC18 anzusteuern. Die Addressen A0 - A7 sind an PORTE , A8-A15 an 
PORTF, A16 ist noch an PORTG bit 0. Die Datenleitug ist PORTD

Hier der C-Code

void write_to_ram(unsigned long RAM_Address, unsigned char data)
{
  //1. Set data Port to Output
  TRISD = 0x00;

  // 2. Do Addressing

  if(RAM_Address > 0x0000FFFF)
  {
    PORTAbits.RA0= 1;
  }
  else PORTAbits.RA0 = 0;

  PORTE = RAM_Address & 0x000000FF;
  PORTF = ((RAM_Address>>=8) & 0x000000FF);



  PORTAbits.RA4 = 0; //CE1 LOW
  PORTAbits.RA3 = 0;  // OE LOW
  PORTAbits.RA2 = 0; // Write = LOW
  PORTAbits.RA1 = 1; // CE2 HIGH

  putchhex(data); // RS-232 output for debug
  PORTD = data; // Put data to PORTD

  PORTAbits.RA1 = 0; // CE2 Low


}

unsigned char read_from_ram(unsigned long RAM_Address)
{
  unsigned char data;

  //1. Set data Port to Input
  TRISD = 0xFF;

  if(RAM_Address > 0x0000FFFF)
  {
    PORTAbits.RA0= 1;
  }
  else PORTAbits.RA0 = 0;

  PORTE = RAM_Address & 0x000000FF;
  PORTF = ((RAM_Address>>=8) & 0x000000FF);

  PORTAbits.RA4 = 0; //CE1 LOW
  PORTAbits.RA1 = 1; // CE2 HIGH
  PORTAbits.RA3 = 0;  // OE LOW
  PORTAbits.RA2 = 1; // WE HIGH   (noted in remark)

  data = PORTD;
  putchhex(data);

return data;

}

was sicher auffällt ist das ich gar keine Delays eingebaut habe, den das 
SRAM ist ein 55ns. Der PIC wird mit 10Mhz betrieben, als habe ich mal 
angenommen das ich keine verzögerungen in den ns bereiche brauche, hier 
noch der Link zum Datasheet:

http://pdf1.alldatasheet.com/datasheet-pdf/view/97595/NEC/UPD431000ACZ-70LL.html

Irgendwie kann ich wenn ich zuerst schreibe, dann lese, nichts lesen...
An was könnte das liegen, elektrisch scheint es in Ordnung zu sein...

Mfg

von A.K. (Gast)


Lesenswert?

Ein CE reicht aus, also CE2 dauerhaft auf 1 pinnen.
"CE controlled write" reicht aus, also /OE fest auf 0 pinnen.

Write:

PORTAbits.RA2 = 0; // WE LOW
PORTAbits.RA4 = 0; // CE1 LOW
...
PORTAbits.RA4 = 1; // CE1 HIGH

Read:

PORTAbits.RA2 = 1; // WE HIGH
PORTAbits.RA4 = 0; // CE1 LOW
...
PORTAbits.RA4 = 1; // CE1 HIGH


Mit dem Timing der PICs nicht ich nicht so vertraut, aber bei AVRs würde 
das so nicht ohne Verzögerung vor dem Lesezugriff funktionieren, da 
deren Inputs durch eine stark verzögernde Register/Latch Kombi laufen, 
und daher in einer out/in Befehlsfolge kaum Zeit bleibt.

von Falk (Gast)


Lesenswert?

 A.K. (Gast)

> Mit dem Timing der PICs nicht ich nicht so vertraut, aber bei AVRs würde
> das so nicht ohne Verzögerung vor dem Lesezugriff funktionieren, da
> deren Inputs durch eine stark verzögernde Register/Latch Kombi laufen,
> und daher in einer out/in Befehlsfolge kaum Zeit bleibt.

Nanana, was heisst hier "stark verzögernde Register/Latch Kombi"? Das 
ist genau 1 Takt den man zwischendurch Pause machen muss. Da kann man 
irgendwas sinnvolles erledigen oder zur Not NOPen. ;-)

MfG
Falk


von Dieter Werner (Gast)


Lesenswert?

Achtung PIC-Falle:

Port A4 ist ein open collector Ausgang und benötigt unbedingt einen 
externen Pull-up Widerstand.

von Lötmann (Gast)


Lesenswert?

Komisch, das Ding will einfach nicht... Sind die den so Heikel auf die 
Timings, oder kanns sein das es defekt ist...?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.