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;
}
Lesezeichen