/**************************************************************/
/* Hardware Function Library */
/* */
/* ver 1.0 Oct. 15 1996 */
/* 1.1 Nov. 24 1996 */
/* 1.2 Dec. 15 1996 */
/* */
/* developed by N.Hayashi */
/**************************************************************/
#include"iodef.h"
#include"hard.h"
int pit1=0;
void pit1_clk_init();
void pit1_clk_init()
{
outportb(TCR1,0x00); /* clear TCR1 */
outportl(CPR1,0x000001); /* TOUT 125kHz */
/* 0x01 = (1/125kHz)/2 /(1/8MHz)/32 prescaler */
outportb(TCR1,0x41); /* square wave */
}
/* Infrared sensor functions */
void irs_init()
{
if(pit1!=1)
{
pit1_clk_init();
pit1=1;
}
outportb(PGCR2,0x08); /* clear PGCR2 */
outportb(PSRR2,0x1c);
outportb(PBCR2,0xA0); /* submode 1x */
outportb(PBDDR2,0x00); /* all input */
outportb(PBCR2,0xAA); /* submode 00 , int enable */
outportb(PIVR2,72+2 ); /* infrared ray sensor interrupt causes by H3 */
irs_disable_int();
}
void irs_disable_int()
{
outportb(PSR2,0x04); /* clear H3S */
outportb(PBCR2,0xA0); /* submode 00 , int disable */
}
void irs_enable_int()
{
outportb(PBCR2,0xAA); /* submode 00 , int enable */
}
int irs_data()
{
return(inportb(PBDR2)&0xff);
}
/* Rotary encoder and Touch sensor functions */
void re_ts_init()
{
re_counter_reset();
}
void re_counter_reset()
{
outportb(CRST,0x03); /* counter reset */
}
int ts_data()
{
return((inportb(EDRH)&0xf0)/16);
}
RE_TS_DATA re_ts_data()
{
int _data_rl,_data_rh,_data_ll,_data_lh;
RE_TS_DATA _data;
_data_rl = inportb(EDRL) & 0xff;/* read count data */
_data_rh = inportb(EDRH) ;
_data_ll = inportb(EDLL) & 0xff;
_data_lh = inportb(EDLH) & 0x0f;
re_counter_reset();
_data.ts =( _data_rh & 0x70)/16;
_data_rh = _data_rh & 0x0f;
_data.r = ( _data_rh << 8 ) + _data_rl;
if ((_data.r & 0x800) != 0) _data.r = (_data.r | 0xfffff000);
_data.l = ( _data_lh << 8 ) + _data_ll;
if ((_data.l & 0x800) != 0) _data.l = (_data.l | 0xfffff000);
return(_data);
}
void ts_enable_int()
{
outportb(TSIE,0x01); /* touch sensor interrupt enable */
sys11(4); /* IRQ4 enable */
}
void ts_disable_int()
{
sys10(4); /* IRQ4 disable */
outportb(TSIE,0x00); /* touch sensor interrupt disable */
}
/* Ultra sonic sensor functions */
void uss_init(_task)
int _task;
{
outportb(PACR2,0x20); /* submode 00 ,int disable */
outportb(PADDR2,0x03);
outportb(PGCR2,0x38); /* mode 0 and H1,H3 enable */
outportb(TCR2,0x00); /* clear TCR2 */
outportl(CPR2,USS_LIMIT); /* count for us-wave to go & return 3 meter */
outportb(TCR2,0xb2); /* device watchdog */
outportb(PIVR2,72+0); /* uss interrupt caused by H1 */
outportb(TIVR2,72+0); /* uss interrupt caused by tout */
}
void uss_start(_sensor_ch)
int _sensor_ch;
{
outportb(TCR2,0xb3); /* Timer enable */
outportb(PADR2,_sensor_ch); /* sensor select */
outportb(PACR2,0x28); /* H2 asert */
outportb(PACR2,0x22); /* H2 negate and H1 interrupt enable */
}
void uss_stop()
{
outportb(TCR2,0xb2); /* Timer disable */
outportb(PACR2,0x20); /* interrupt disable */
}
int uss_data()
{
int _h,_m,_l;
_h = inportb(CNTR2 +2) & 0xff; /* read count data */
_m = inportb(CNTR2 +4) & 0xff;
_l = inportb(CNTR2 +6) & 0xff;
return((USS_LIMIT - ( (_h<<16) + (_m<<8) +_l ) ) * 32/(double)80000 * 340 /2);
}
int uss_chk_int() /* interrupt type check (under flow) */
{
return(inportb(PSR2) & 0x01);
}
int uss_chk_conect()
{
return((inportb(PADR2) & 0x04)>>2);
}
/* PWM functions */
#define DUTY_MAX (128-1)
#define CW 0
#define CCW 1
#define PWM_R PADR1
#define PWM_L PBDR1
void pwm_init()
{
if (pit1 !=1)
{
pit1_clk_init();
pit1 = 1;
}
outportb(PGCR1,0x00); /* clear PGCR1 */
outportb(PSRR1,0x00);
outportb(PACR1,0x80); /* submode 1x */
outportb(PADDR1,0xff); /* all output */
outportb(PBCR1,0x80); /* submode 1x */
outportb(PBDDR1,0xff); /* all output */
outportb(PGCR1,0x00); /* mode 0 */
}
void pwm_data(_duty_r,_duty_l)
int _duty_r,_duty_l;
{
int _dir_r,_dir_l;
if(_duty_r > 100)_duty_r=100;
if(_duty_l > 100)_duty_l=100;
if(_duty_r < -100)_duty_r=-100;
if(_duty_l < -100)_duty_l=-100;
_dir_r = _dir_l = CW; /* set direction of rotation */
if(_duty_r < 0)
{
_dir_r = CCW;
_duty_r *= -1;
}
if(_duty_l < 0)
{
_dir_l = CCW;
_duty_l *= -1;
}
outportb(PWM_R,(((_duty_r * DUTY_MAX / 100) << 1) + _dir_r));
outportb(PWM_L,(((_duty_l * DUTY_MAX / 100) << 1) + _dir_l));
}
/* MMI functions */
int dipsw_data()
{
return(inportb(PBDR0)&0xf);
}
int _led[LED_NO],_red,_green;
void mmi_init()
{
outportb(PGCR0,0x00); /* clear PGCR0 */
outportb(PSRR0,0x1e);
outportb(PACR0,0xa0); /* submode 1x */
outportb(PADDR0,0xff); /* all output */
outportb(PBCR0,0x80); /* submode 1x */
outportb(PBDDR0,0x10);
outportb(PGCR0,0x22); /* mode 0 */
outportb(TCR0,0x00); /* clear TCR0 */
outportl(CPR0,0x00003f); /* TOUT 2kHz */
/* 0x3f = (1/2000)/2 sec /(1/8MHz) /32 prescaler */
outportb(TCR0,0x41); /* square wave */
led_set(0,0);
led_set(1,0);
led_set(2,0);
led_set(3,0);
led_on(OFF);
}
void led_set(_led_no,_data)
int _led_no,_data;
{
if(((_data >=0) && (_data <=9))&&((_led_no >=0) && (_led_no <= 3)))
{
_led[_led_no] = _data;
outportb(PADR0,_green*0x80+_red*0x40+_led_no*0x10+_data);
outportb(PACR0,0xa0); /*making latch enable pulse*/
outportb(PACR0,0xa8);
outportb(PACR0,0xa0);
}
}
void led_on(_data)
int _data;
{
_green=_red=0;
if((_data & GREEN)!=0)
{
_green=1;
}
if((_data & RED)!=0)
{
_red=1;
}
}
void btn_disable_int()
{
outportb(PBCR0, 0x80);
}
void btn_enable_int()
{
outportb(PSR0, 0x08);
outportb(PBCR0, 0x84);
}
int pow_chk()
{
return((inportb(PBDR0)&0x40)>>6);
}