Argl...
einen Masseschluß und einem Tausch von Low- und Highbyte der Adresse später....
Code:
void initinterface(void)
{
DDRA=0;
PORTA=0;
DDRB |= 15;
PORTB |= (1<<WE);
PORTB |= (1<<OE);
PORTB &= ~(1<<LE_low);
PORTB &= ~(1<<LE_high);
}
void writemem(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 / 256); //Highbyte der Adresse ausgeben
_delay_ms(ws);
PORTB |= (1<<LE_high); //Latch 1 input enable
_delay_ms(ws);
PORTB &= ~(1<<LE_high); //Latch 1 input disable
_delay_ms(ws);
PORTA = (addr & 255); //Lowbyte der Adresse ausgeben
_delay_ms(ws);
PORTB |= (1<<LE_low); //Latch 2 input enable
_delay_ms(ws);
PORTB &= ~(1<<LE_low); //Latch 2 input disable
_delay_ms(ws);
PORTA = value; //Daten ausgeben
PORTB &= ~(1<<WE); //WE auf low
_delay_ms(ws);
PORTB |= (1<<WE); //WE auf high
_delay_ms(ws);
DDRA=0; //PORTA auf Eingang
PORTA=0; //keine Pullups
}
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 / 256); //Highbyte der Adresse ausgeben
_delay_ms(ws);
PORTB |= (1<<LE_high); //Latch 1 input enable
_delay_ms(ws);
PORTB &= ~(1<<LE_high); //Latch 1 input disable
_delay_ms(ws);
PORTA = (addr & 255); //Lowbyte der Adresse ausgeben
_delay_ms(ws);
PORTB |= (1<<LE_low); //Latch 2 input enable
_delay_ms(ws);
PORTB &= ~(1<<LE_low); //Latch 2 input disable
DDRA=0; //PORTA als Eingang
PORTA=0; //keine Pullups
_delay_ms(ws);
PORTB &= ~(1<<OE); //OE auf low
_delay_ms(ws);
value = PORTA; //Daten lesen nach 'value'
_delay_ms(ws);
PORTB |= (1<<OE); //OE auf high
_delay_ms(ws);
return value;
}
Zum testen hab ich jetzt mal ein paar Pullups beim lesen angeschaltet, merkwürdigerweise krieg ich dann auch genau diese Bits als high gelesen, also scheint das RAM irgendwie nicht das zu tun, was es soll, die Adressen kommen aber sauber an, und die Steuersignale auch.....
HILFEE!!
Lesezeichen