// memory interface file #include #include #define ADDREN PORTD.2 #define WE PORTD.5 #define DATACLK PORTD.3 #define ADDRCLK PORTD.4 #define OUTB PORTC unsigned short int result2; //#define MEMDEBUG void initmem(void) { DDRC=0xff; // 8 bit output to buffers DDRA=0x00; // input from chip DDRB=0x00; // input from chip DDRD.0=0; DDRD.1=1; DDRD.2=1; // ADDREN (fed thru an inverter to addr buffers) DDRD.3=1; // DATACLK (pos pulse=lo byte written) DDRD.4=1; // ADDRCLK (pos pulse=lo byte written) DDRD.5=1; // WE (fed thru an inverter to mem chip and to data buffers) DDRD.6=0; // reserved DDRD.7=0; // reserved OUTB=0; ADDREN=0; WE=0; DATACLK=0; // clock in zeros into buffers ADDRCLK=0; DATACLK=1; ADDRCLK=1; DATACLK=0; ADDRCLK=0; } void writeaddr(unsigned short int a) { unsigned char lo,hi; lo=a&0xff; hi=a>>8; ADDRCLK=0; // set initial state of addr clk delay_us(2); OUTB=lo; delay_us(2); ADDRCLK=1; // clock in low byte delay_us(2); OUTB=hi; delay_us(2); ADDRCLK=0; // clock in high byte delay_us(2); } void writedata(unsigned short int a) { unsigned char lo,hi; lo=a&0xff; hi=a>>8; DATACLK=0; // set initial state of addr clk delay_us(2); OUTB=lo; delay_us(2); DATACLK=1; // clock in low byte delay_us(2); OUTB=hi; delay_us(2); DATACLK=0; // clock in high byte delay_us(2); } unsigned short int memwrite(unsigned short int addr, unsigned short int val) { unsigned short int result; WE=0; // fill the buffers ADDREN=1; writeaddr(addr); delay_us(2); WE=1; writedata(val); delay_us(2); // execute the write delay_us(2); // return DATA lines to double check result=PINA|(((unsigned short)PINB)<<8); WE=0; delay_us(2); ADDREN=0; delay_us(2); return result; } unsigned short int memread(unsigned short int addr) { unsigned short int result; WE=0; ADDREN=1; // write addr to read from writeaddr(addr); // ADDREN=1; delay_us(5); // read it result=(((unsigned short int)PINB)<<8)|(PINA); ADDREN=0; return result; } #ifdef MEMDEBUG // for memory testing void main(void) { initmem(); writedata(0xffff); writeaddr(0x0000); ADDREN=1; WE=1; while(1); } #endif