Hallo!
Das RAM hat 80ns Zugriffszeit, da kann ich ja eigentlich mit meinem händischen Protokoll gar nicht zu schnell werden...
Die Verzögerungen habe ich nur zum Debuggen eingebaut.

Folgendermaßen verdrahtet:

PORTA an 2 Latches 74hc573n und an I1-I8 vom RAM
Ausgänge der Latches an A0-A14, und CS vom RAM
PB0 an Latch LE für A0-A7, OE vom Latch auf GND
PB1 an Latch LE für A8-A15, OE vom Latch auf GND
PB2 an WE vom RAM
PB3 an OE vom RAM


Das Lesen aus dem SRAM funktioniert auch wunderbar ohne irgendwelche Verzögerungen. Inzwischen habe ich auch eine art Verify eingebaut, wo er den grad geschriebenen Wert auslesen und bei Nichtübereinstimmung nochmal schreiben soll, aber irgendwie klappt das nicht. Die falschen Werte stehen auch immer mal woanders und variieren in der Anzahl...

hier der Code :
Code:
#include <memory.h>
#include <util/delay.h>
#define r 1
#define w 5

void initinterface(unsigned char value)

{
	// unsigned int addr;
	DDRA=0;
	PORTA=0;
	DDRB |= 15;
	PORTB |= (1<<WE);
	PORTB |= (1<<OE);
	PORTB &= ~(1<<LE_low);
	PORTB &= ~(1<<LE_high);

/*	for (addr=0;addr<65535;addr++)
	{
		writemem(addr,value);
	}
*/
}

void writemem(unsigned int addr, unsigned char value)
{
	unsigned char check;

	PORTB |= (1<<WE);		//WE auf high
	PORTB |= (1<<OE);		//OE auf high
	
	DDRA=0xff;	//PORTA als Ausgang
	
	PORTA = (addr >> 8);	//Highbyte der Adresse ausgeben
	PORTB |= (1<<LE_high);	//Latch 1 input enable
	 _delay_us(w);
	PORTB &= ~(1<<LE_high);	//Latch 1 input disable
	 _delay_us(w);
	PORTA = (addr & 255);	//Lowbyte der Adresse ausgeben
	 _delay_us(w);
	PORTB |= (1<<LE_low);	//Latch 2 input enable
	 _delay_us(w);
	PORTB &= ~(1<<LE_low);	//Latch 2 input disable
	 _delay_us(w);
	PORTB &= ~(1<<WE);		//WE auf low
	_delay_us(w);
	PORTA = value;			//Daten ausgeben
	_delay_us(w);
	PORTB |= (1<<WE);		//WE auf high
	_delay_us(w);
	
	// check
	do
	{
		DDRA = 0;
		PORTA = 0;
		PORTB &= ~(1<<OE);		//OE auf low
		_delay_us(w);
		check = PINA;			//Daten lesen nach 'value'
		_delay_us(w);
		PORTB |= (1<<OE);		//OE auf high
	
		if (check != value)
		{
			DDRA=0xff;
			PORTB &= ~(1<<WE);		//WE auf low
			_delay_us(w);
			PORTA = value;			//Daten ausgeben
			_delay_us(w);
			PORTB |= (1<<WE);		//WE auf high
			_delay_us(w);
		}
	}
	while (check != value);

}

unsigned char readmem(unsigned int addr)
{
	unsigned char value;

	PORTB |= (1<<WE);		//WE auf high
	PORTB |= (1<<OE);		//OE auf high
	
	DDRA=0xff;				//PORTA als Ausgang
	
	PORTA = (addr >> 8 );	//Highbyte der Adresse ausgeben
	PORTB |= (1<<LE_high);	//Latch 1 input enable
	// _delay_us(r);
	PORTB &= ~(1<<LE_high);	//Latch 1 input disable
	// _delay_us(r);
	PORTA = (addr & 255);	//Lowbyte der Adresse ausgeben
	PORTB |= (1<<LE_low);	//Latch 2 input enable
	// _delay_us(r);
	PORTB &= ~(1<<LE_low);	//Latch 2 input disable
	_delay_us(r);			
	DDRA = 0;
	PORTA = 0;
	
	PORTB &= ~(1<<OE);		//OE auf low
	_delay_us(r);
	value = PINA;			//Daten lesen nach 'value'
	PORTB |= (1<<OE);		//OE auf high
	_delay_us(r);
	return value;
}