vklaffehn
29.04.2007, 14:32
Moin!
ich bin grade dabei, ein 32K SRAM an meinen AtMega32 zu basteln, die Schaltung ist folgendermaßen aufgebaut :
PORTA geht jeweils an die Eingänge von 2 74hc573n Latches und I0-I7 vom SRAM 62256, die Ausgänge der Latches sind an A0-A14 und CS vom SRAM, OE der Latches ist an GND, die LE Eingänge sind an PB0 (LE_low) und PB1 (LE_high), PB2 geht an WE und PB3 an OE.
Nun versuche ich, mit folgendem Code den RAM anzusprechen, aber ich kriege immer nur eine 0 gelesen, selbst wenn ich vorher versuche, etwas anderes zu schreiben.
void writemem(unsigned int addr, unsigned char value)
{
PORTB |= (WE);
PORTB |= (RE);
DDRA=0xff;
PORTA = (addr / 256);
PORTB |= (LE_low);
_delay_ms(10);
PORTB &= ~(LE_low);
PORTA = (addr & 255);
PORTB |= (LE_high);
_delay_ms(10);
PORTB &= ~(LE_high);
PORTA = value;
PORTB &= ~(WE);
_delay_ms(10);
PORTB |= (WE);
DDRA=0;
}
unsigned char readmem(unsigned int addr)
{
unsigned int value;
PORTB |= (WE);
PORTB |= (RE);
DDRA=0xff;
PORTA = (addr / 256);
PORTB |= (LE_low);
_delay_ms(10);
PORTB &= ~(LE_low);
PORTA = (addr & 255);
PORTB |= (LE_high);
_delay_ms(10);
PORTB &= ~(LE_high);
DDRA=0;
PORTA=0;
PORTB &= ~(RE);
_delay_ms(10);
value = PORTA;
PORTB |= (RE);
return value;
}
Als Test benutze ich dieses hier:
void memtest(void)
{
unsigned int addr;
unsigned char value;
for (addr=0;addr<32767;addr++)
{
writemem(addr,42);
value=readmem(addr);
uart_putc(value);
}
}
Was mache ich falsch?
Vielen Dank schonmal!!
ich bin grade dabei, ein 32K SRAM an meinen AtMega32 zu basteln, die Schaltung ist folgendermaßen aufgebaut :
PORTA geht jeweils an die Eingänge von 2 74hc573n Latches und I0-I7 vom SRAM 62256, die Ausgänge der Latches sind an A0-A14 und CS vom SRAM, OE der Latches ist an GND, die LE Eingänge sind an PB0 (LE_low) und PB1 (LE_high), PB2 geht an WE und PB3 an OE.
Nun versuche ich, mit folgendem Code den RAM anzusprechen, aber ich kriege immer nur eine 0 gelesen, selbst wenn ich vorher versuche, etwas anderes zu schreiben.
void writemem(unsigned int addr, unsigned char value)
{
PORTB |= (WE);
PORTB |= (RE);
DDRA=0xff;
PORTA = (addr / 256);
PORTB |= (LE_low);
_delay_ms(10);
PORTB &= ~(LE_low);
PORTA = (addr & 255);
PORTB |= (LE_high);
_delay_ms(10);
PORTB &= ~(LE_high);
PORTA = value;
PORTB &= ~(WE);
_delay_ms(10);
PORTB |= (WE);
DDRA=0;
}
unsigned char readmem(unsigned int addr)
{
unsigned int value;
PORTB |= (WE);
PORTB |= (RE);
DDRA=0xff;
PORTA = (addr / 256);
PORTB |= (LE_low);
_delay_ms(10);
PORTB &= ~(LE_low);
PORTA = (addr & 255);
PORTB |= (LE_high);
_delay_ms(10);
PORTB &= ~(LE_high);
DDRA=0;
PORTA=0;
PORTB &= ~(RE);
_delay_ms(10);
value = PORTA;
PORTB |= (RE);
return value;
}
Als Test benutze ich dieses hier:
void memtest(void)
{
unsigned int addr;
unsigned char value;
for (addr=0;addr<32767;addr++)
{
writemem(addr,42);
value=readmem(addr);
uart_putc(value);
}
}
Was mache ich falsch?
Vielen Dank schonmal!!