//----------------------------------------------------------- // i8090.cpp library // // compile with large mode // // v1.0 6/20/2001 // //----------------------------------------------------------- #include #include #include #include //-------------- define parameter ----------------- #define YES 1 #define NO 0 #define ON 1 #define OFF 0 #define X_axis 1 #define Y_axis 2 #define Z_axis 3 #define ENC_QUADRANT 0x00 #define ENC_CW_CCW 0x10 #define ENC_PULSE_DIR 0x20 #define i8090 0x0d //#define i8091 0x0e //#define i8092 0x0f //#define NOCARD 0x00 //-------------- hardware ------------------------- #define RD1 0x01 //R #define RD2 0x02 //R #define RD3 0x03 //R #define RD4 0x04 //R #define WR1 0x00 //W #define WR2 0x01 //W #define WR3 0x02 //W //------ card parameter ----------------------------------- typedef struct { unsigned int base; unsigned char ctrl1; unsigned char ctrl2; unsigned char ctrl3; unsigned int old_pos_X; unsigned int old_pos_Y; unsigned int old_pos_Z; unsigned int pos_X; unsigned int pos_Y; unsigned int pos_Z; long X; long Y; long Z; }i8090_cardtype; i8090_cardtype card[20]; //#################################################################### //#################################################################### unsigned char i8090_REGISTRATION(unsigned char cardNo, unsigned int address) { if (inportb(address)==i8090) { card[cardNo].base=address; return YES; } else return NO; } //******************************************************************** void i8090_INIT_CARD(unsigned char cardNo, unsigned char x_mode, unsigned char y_mode, unsigned char z_mode) { card[cardNo].ctrl1 = 0x07 | x_mode; card[cardNo].ctrl2 = 0x07 | y_mode; card[cardNo].ctrl3 = 0x07 | z_mode; //reset HCTL-3018; card[cardNo].ctrl1 &= 0xFB; //1111 1011 card[cardNo].ctrl2 &= 0xFB; card[cardNo].ctrl3 &= 0xFB; outportb(card[cardNo].base + WR1, card[cardNo].ctrl1); outportb(card[cardNo].base + WR2, card[cardNo].ctrl2); outportb(card[cardNo].base + WR3, card[cardNo].ctrl3); card[cardNo].ctrl1 |= 0x04; //0000 0100 card[cardNo].ctrl2 |= 0x04; card[cardNo].ctrl3 |= 0x04; outportb(card[cardNo].base + WR1, card[cardNo].ctrl1); outportb(card[cardNo].base + WR2, card[cardNo].ctrl2); outportb(card[cardNo].base + WR3, card[cardNo].ctrl3); } //******************************************************************** unsigned int i8090_GET_ENCODER(unsigned char cardNo, unsigned char axis) { unsigned int value; switch (axis) { case X_axis: card[cardNo].ctrl1 &= 0xFC; //1111 1100 low byte outportb(card[cardNo].base + WR1, card[cardNo].ctrl1); value = inportb(card[cardNo].base + RD1); card[cardNo].ctrl1 |= 0x01; //0000 0001 high byte outportb(card[cardNo].base + WR1, card[cardNo].ctrl1); value += inportb(card[cardNo].base + RD1)*256; card[cardNo].ctrl1 |= 0x03; //0000 0011 outportb(card[cardNo].base + WR1, card[cardNo].ctrl1); break; case Y_axis: card[cardNo].ctrl2 &= 0xFC; //1111 1100 low byte outportb(card[cardNo].base + WR2, card[cardNo].ctrl2); value = inportb(card[cardNo].base + RD2); card[cardNo].ctrl2 |= 0x01; //0000 0001 high byte outportb(card[cardNo].base + WR2, card[cardNo].ctrl2); value += inportb(card[cardNo].base + RD2)*256; card[cardNo].ctrl2 |= 0x03; //0000 0011 outportb(card[cardNo].base + WR2, card[cardNo].ctrl2); break; case Z_axis: card[cardNo].ctrl3 &= 0xFC; //1111 1100 low byte outportb(card[cardNo].base + WR3, card[cardNo].ctrl3); value = inportb(card[cardNo].base + RD3); card[cardNo].ctrl3 |= 0x01; //0000 0001 high byte outportb(card[cardNo].base + WR3, card[cardNo].ctrl3); value += inportb(card[cardNo].base + RD3)*256; card[cardNo].ctrl3 |= 0x03; //0000 0011 outportb(card[cardNo].base + WR3, card[cardNo].ctrl3); break; default : break; } return value; } //******************************************************************** void i8090_RESET_ENCODER(unsigned char cardNo, unsigned char axis) { switch (axis) { case X_axis: card[cardNo].ctrl1 &= 0xFB; //1111 1011 outportb(card[cardNo].base + WR1, card[cardNo].ctrl1); card[cardNo].ctrl1 |= 0x04; //0000 0100 outportb(card[cardNo].base + WR1, card[cardNo].ctrl1); break; case Y_axis: card[cardNo].ctrl2 &= 0xFB; //1111 1011 outportb(card[cardNo].base + WR2, card[cardNo].ctrl2); card[cardNo].ctrl2 |= 0x04; //0000 0100 outportb(card[cardNo].base + WR2, card[cardNo].ctrl2); break; case Z_axis: card[cardNo].ctrl3 &= 0xFB; //1111 1011 outportb(card[cardNo].base + WR3, card[cardNo].ctrl3); card[cardNo].ctrl3 |= 0x04; //0000 0100 outportb(card[cardNo].base + WR3, card[cardNo].ctrl3); break; default : break; } } //******************************************************************** unsigned char i8090_GET_INDEX(unsigned char cardNo) { unsigned char index; index = 0x07 & inportb(card[cardNo].base + RD4); return index; } //----------------------------------------------------------------------- // 32 bits encoder subroutine // // void i8090_ENCODER32_ISR(unsigned char cardNo) <----run it in timer interrupt // void i8090_RESET_ENCODER32(unsigned char cardNo, unsigned char axis) // long i8090_GET_ENCODER32(unsigned char cardNo, unsigned char axis) //----------------------------------------------------------------------- void i8090_ENCODER32_ISR(unsigned char cardNo) { unsigned int pos_X,pos_Y,pos_Z; int delta_X,delta_Y,delta_Z; card[cardNo].pos_X=i8090_GET_ENCODER(cardNo, X_axis); card[cardNo].pos_Y=i8090_GET_ENCODER(cardNo, Y_axis); card[cardNo].pos_Z=i8090_GET_ENCODER(cardNo, Z_axis); //---X axis encoder ---------------------- if (((card[cardNo].pos_X ^ card[cardNo].old_pos_X) & 0xC000) == 0xC000) { if ((card[cardNo].pos_X & 0xC000) != 0xC000) //65xxx -> 00xxx delta_X = (int) (card[cardNo].pos_X + (65535 - card[cardNo].old_pos_X) + 1); else //00xxx -> 65xxx delta_X = -(int)((65535-card[cardNo].pos_X) + 1 + card[cardNo].old_pos_X); } else { //0 ~ 65535 delta_X = (int)(card[cardNo].pos_X - card[cardNo].old_pos_X); } //---Y axis encoder ---------------------- if (((card[cardNo].pos_Y ^ card[cardNo].old_pos_Y) & 0xC000) == 0xC000) { if ((card[cardNo].pos_Y & 0xC000) != 0xC000) //65xxx -> 00xxx delta_Y = (int) (card[cardNo].pos_Y + (65535 - card[cardNo].old_pos_Y) + 1); else //00xxx -> 65xxx delta_Y = -(int)((65535-card[cardNo].pos_Y) + 1 + card[cardNo].old_pos_Y); } else { //0 ~ 65535 delta_Y = (int)(card[cardNo].pos_Y - card[cardNo].old_pos_Y); } //---Z axis encoder ---------------------- if (((card[cardNo].pos_Z ^ card[cardNo].old_pos_Z) & 0xC000) == 0xC000) { if ((card[cardNo].pos_Z & 0xC000) != 0xC000) //65xxx -> 00xxx delta_Z = (int) (card[cardNo].pos_Z + (65535 - card[cardNo].old_pos_Z) + 1); else //00xxx -> 65xxx delta_Z = -(int)((65535-card[cardNo].pos_Z) + 1 + card[cardNo].old_pos_Z); } else { //0 ~ 65535 delta_Z = (int)(card[cardNo].pos_Z - card[cardNo].old_pos_Z); } card[cardNo].old_pos_X = card[cardNo].pos_X; card[cardNo].old_pos_Y = card[cardNo].pos_Y; card[cardNo].old_pos_Z = card[cardNo].pos_Z; card[cardNo].X += delta_X; card[cardNo].Y += delta_Y; card[cardNo].Z += delta_Z; } //---------------------------------------------------------------------------- void i8090_RESET_ENCODER32(unsigned char cardNo, unsigned char axis) { card[cardNo].old_pos_X=i8090_GET_ENCODER(cardNo, X_axis); card[cardNo].old_pos_Y=i8090_GET_ENCODER(cardNo, Y_axis); card[cardNo].old_pos_Z=i8090_GET_ENCODER(cardNo, Z_axis); switch (axis) { case X_axis: card[cardNo].X=0; break; case Y_axis: card[cardNo].Y=0; break; case Z_axis: card[cardNo].Z=0; break; } } //----------------------------------------------------------------------- long i8090_GET_ENCODER32(unsigned char cardNo, unsigned char axis) { disable(); i8090_ENCODER32_ISR(cardNo); enable(); switch (axis) { case X_axis: return card[cardNo].X; case Y_axis: return card[cardNo].Y; case Z_axis: return card[cardNo].Z; } return 0; }