/** LS7266R1 Driver for Atmel AVR Daniel Beer and Tony Lloyd ECE 476 Usage: #include "ls7266r1.h": Include the driver file LS_init(): Initialize the driver LS_write_RLD, LS_write_IOR, LS_write_CMR, LS_write_IDR(axis, value): Write control value to LS chip to axis. Axis can be select_X, select_Y or select_XY; LS_read_FLAG(axis): Read flag register value from axis. Axis can be select_X or select_Y. LS_read_output(axis): Read 24-bit output value from axis. Axis can be select_X or select_Y. LS_write_preset(axis, value): Write 24-bit preset register value to axis. Axis can be select_X, select_Y or select_XY; **/ #ifndef _LS7266R1_H_ #define _LS7266R1_H_ #pragma warn- // **************************************************************** // LCD Setup // **************************************************************** // Data output port #ifndef LS_data_out #define LS_data_out PORTA #endif // Data input port #ifndef LS_data_in #define LS_data_in PINA #endif // Data ddr #ifndef LS_data_ddr #define LS_data_ddr DDRA #endif // Control output #ifndef LS_ctrl_out #define LS_ctrl_out PORTC #endif // Control ddr #ifndef LS_ctrl_ddr #define LS_ctrl_ddr DDRC #endif // Chip enable ddr #ifndef LS_chipenable_ddr #define LS_chipenable_ddr DDRC.3 #endif // Chip enable output #ifndef LS_chipenable_out #define LS_chipenable_out PORTC.3 #endif // **************************************************************** // Defines // **************************************************************** #define ctrl_mask 0b00001111 #define data_mask 0b00011111 #define chipenable_OFF 1 #define chipenable_ON 0 #define write_ctrl 0b01010000 #define write_data 0b00010000 #define ctrl_write_next 0b00100000 #define ctrl_chip_off 0b00110000 #define select_X 0b00000000 #define select_Y 0b01000000 #define select_XY 0b10000000 #define data_select_mask 0b10000000 #define ctrl_select_mask 0b01000000 #define read_ctrl 0b01100000 #define read_data 0b00100000 #define ctrl_read_next 0b00010000 #define addr_RLD 0b00000000 #define addr_CMR 0b00100000 #define addr_IOR 0b01000000 #define addr_IDR 0b01100000 #define RLD_reset_BP 0b00000001 #define RLD_reset_CNTR 0b00000010 #define RLD_reset_FLAGS 0b00000100 #define RLD_reset_E 0b00000110 #define RLD_trnsfr_PR 0b00001000 #define RLD_trnsfr_CNTR 0b00010000 #define RLD_trnsfr_PR0 0b00011000 #define IOR_enable_AB 0b00000001 #define IOR_LCNTR 0b00000000 #define IOR_LOL 0b00000010 #define IOR_RCNTR_ABgate 0b00000100 #define IDR_enable_index 0b00000001 #define IDR_positive_polarity 0b00000010 #define IDR_index_RCNTR 0b00000100 #define FLAG_BT 0x01 #define FLAG_CT 0x02 #define FLAG_CPT 0x04 #define FLAG_S 0x08 #define FLAG_E 0x10 #define FLAG_U 0x20 #define FLAG_ID 0x40 #define CMR_BCD 0x01 #define CMR_count_RANGE 0x02 #define CMR_count_NONRECYCLE 0x04 #define CMR_count_MODN 0x06 #define CMR_quad_X1 0x08 #define CMR_quad_X2 0x10 #define CMR_quad_X4 0x18 // **************************************************************** // Functions // **************************************************************** // Initialize the LS chip // Cycles: 22 void LS_init(void) { LS_ctrl_ddr = (LS_ctrl_ddr | 0xf0); LS_data_ddr = 0xff; LS_chipenable_ddr = 1; LS_ctrl_out = (LS_ctrl_out & ctrl_mask) | ctrl_chip_off; } // Write a byte to the LS chip // Cycles: 79-86 void LS_write(unsigned char type, unsigned char addr, unsigned char XYselect, unsigned char data) { LS_chipenable_out = chipenable_ON; LS_data_ddr = 0xff; if (type == write_ctrl) LS_data_out = (data & data_mask) | addr | (XYselect & data_select_mask); else LS_data_out = data; LS_ctrl_out = (LS_ctrl_out & ctrl_mask) | type | (XYselect & ctrl_select_mask); #asm nop nop nop #endasm LS_ctrl_out |= ctrl_write_next; LS_ctrl_out = (LS_ctrl_out & ctrl_mask) | ctrl_chip_off; LS_chipenable_out = chipenable_OFF; } // Read a byte from the LS chip // Cycles: 70 unsigned char LS_read(unsigned char type, unsigned char XYselect) { unsigned char result; LS_chipenable_out = chipenable_ON; LS_data_ddr = 0x00; LS_data_out = 0x00; LS_ctrl_out = (LS_ctrl_out & ctrl_mask) | type | (XYselect & ctrl_select_mask); #asm nop nop nop #endasm result = LS_data_in; LS_ctrl_out |= ctrl_read_next; LS_ctrl_out = (LS_ctrl_out & ctrl_mask) | ctrl_chip_off; LS_chipenable_out = chipenable_OFF; return result; } // Read a 24-bit value from the LS chip // Cycles: 392 signed long int LS_read_output(unsigned char XYselect) { unsigned long int result; LS_write(write_ctrl, addr_RLD, XYselect, RLD_reset_BP | RLD_trnsfr_CNTR); result = LS_read(read_data, XYselect); result += (unsigned int)(LS_read(read_data, XYselect)) << 8; result += (signed long int)(LS_read(read_data, XYselect)) << 16; result += (signed long int)((result & 0x00800000)? 0xff000000 : 0x00000000); return result; } // Write a 24-bit value to the LS chip // Cycles: 370 void LS_write_preset(unsigned char XYselect, signed long int preset) { LS_write(write_ctrl, addr_RLD, XYselect, RLD_reset_BP); LS_write(write_data, 0, XYselect, (unsigned char) (preset & 0xff)); LS_write(write_data, 0, XYselect, (unsigned char) ((preset >> 8)& 0xff)); LS_write(write_data, 0, XYselect, (unsigned char) ((preset >> 16)& 0xff)); } // Read the flag register #define LS_read_flag(XYselect) LS_read(read_data, XYselect) // Write the preset register #define LS_write_PRS(XYselect, data) LS_write(write_data, 0, XYselect, data) // Write the RLD register #define LS_write_RLD(XYselect, data) LS_write(write_ctrl, addr_RLD, XYselect, data) // Write the CMR register #define LS_write_CMR(XYselect, data) LS_write(write_ctrl, addr_CMR, XYselect, data) // Write the IOR register #define LS_write_IOR(XYselect, data) LS_write(write_ctrl, addr_IOR, XYselect, data) // Write the IDR register #define LS_write_IDR(XYselect, data) LS_write(write_ctrl, addr_IDR, XYselect, data) #pragma warn+ #endif