/*------------------------------------------- receive.c contains code that will receive data from a board that contains the send.c code data flow is as follows: send port receive port data (0..3) <--> data (0..3) ack_img(4) --> ack_img(4) ack_ram(5) --> ack_ram(5) req_img(6) <-- req_img(6) req_ram(7) <-- req_ram(7) --------------------------------------------*/ #include <90s8515.h> #include #define RECEIVE_PORT PORTA #define RECEIVE_PIN PINA #define RECEIVE_DIR DDRA #define ACK_IMG RECEIVE_PIN.4 #define ACK_RAM RECEIVE_PIN.5 #define REQ_IMG RECEIVE_PORT.6 #define REQ_RAM RECEIVE_PORT.7 #define AND_MASK 0x0f #define TRUE 1 #define FALSE 0 // receive_init() MUST be called before receive is ever called void receive_init(){ RECEIVE_PORT = 0x00; // clear the receive port, no pull-ups RECEIVE_DIR = 0xc0; // control pins are output delay_ms(100); // delay for other board to turn on } unsigned char receive_nibble(){ unsigned char ret; REQ_IMG = TRUE; while(ACK_IMG == FALSE){} // wait for data to become ready ret = RECEIVE_PIN & AND_MASK; // get the data REQ_IMG = FALSE; // signal that transfer is complete while(ACK_IMG == TRUE){} // wait for other board to reset return ret; } // receive() is a blocking call unsigned char receive(){ unsigned char ret; ret = receive_nibble(); return ((ret << 4) & 0xf0) | receive_nibble(); } unsigned char retrieve_nibble(){ unsigned char ret; REQ_RAM = TRUE; while(ACK_RAM == FALSE){} // wait for data to become ready ret = RECEIVE_PIN & AND_MASK; // get the data REQ_RAM = FALSE; // signal that transfer is complete while(ACK_RAM == TRUE){} // wait for other board to reset return ret; } // retrieve() is a blocking call unsigned char retrieve(){ unsigned char ret; ret = retrieve_nibble(); return ((ret << 4) & 0xf0) | retrieve_nibble(); } void store_nibble(unsigned char data){ RECEIVE_PORT = data & AND_MASK; REQ_RAM = TRUE; // request data storage while(ACK_RAM == FALSE){} // wait for ack REQ_RAM = FALSE; // drop the request while(ACK_RAM == TRUE){} // wait for ack to drop } void store(unsigned char data){ RECEIVE_DIR = 0xcf; store_nibble(data >> 4); store_nibble(data); RECEIVE_DIR = 0xc0; }