HDTƂ͉łȂKv
=======================

HDT̓n[hEFA[Lqe[uiHardware Description Tablej
̗ŁAn[hEFA[EhCo[ȒPɌoAT[{ADC
[^[AZT[̂悤ȑuEyebotvbgtH[Ɏ
tĎgƂ\ɂ邽߂̈̍\złB

HDT͂Q̕\Ă܂B
1.) HDTANZX֐
2.) HDTf[^\

@HDTANZX֐
---------------------
֐RoBiOS̈ꕔłAhCo[n[hEFA[
̏ꏊڑ̗L𔻒f̂Ɏg܂BŐVłɂ͂S
̊{֐A/mc/robios/hdt.cŊmF邱Ƃł܂B

int HDT_Validate(void);
@RobiOSHDTf[^\`FbN菉̂Ɏg
@܂B

void *HDT_FindEntry(TypeID typeid,DeviceSemantics semantics);
@foCXhCo[AevAf[^\ɑΉ
@|C^[Ԃ߂̓o^T̂Ɏg܂B

DeviceSemantics HDT_FindSemantics(TypeID typeid, int x);
@xԖڂ̓o^TA̓eԂ̂Ɏg܂B

int HDT_TypeCount(TypeID typeid);
@^ꂽ^̓o^񐔂JEg܂B

char *HDT_GetString(TypeID typeid,DeviceSemantics semantics)
@e\܂B

̊֐̓[U[vOgƂ͂ł܂I

@HDTf[^\
------------------
HDTf[^\͓Ɨf[^t@CłB(/mc/hdtdata)
eEyebot₻̑̑u̐ݒɂ͓ƎHDTf[^KvłB
̃f[^t@Cɂ́AuǂɎtĂ
ǂ̂悤ɐ䂷̂ƂׂĂ̏񂪋LĂ܂B

HDTf[^\͂Q̕\Ă܂B
1.) XHDTũf[^\
2.) HDTXg

1.) [^[Ȃǂ̑ũf[^\̓hCo[ɕKvȂׂ
@@̏܂ł܂B

Ⴆ΁F
motor_type motor0 = {0,  0, TIMER1, 8196, (void*)(OutBase+2), 6, 7, (BYTE*)&motconv0};
0               : the maximum driver version for which this entry is sufficient
0               : the tpu channel the motor is attached to
TIMER2          : the tpu timer that has to be used
8196            : pwm period in Hz
OutBase+2       : the I/O Port address the driver has to use
6               : the portbit for forward drive
7               : the portbit for backward drive
motconv0        : the pointer to a conversion table to adjust different motors

̂悤ȁuxxxx_typev\/mc/robios/include/hdt.h̒Œ`Ă܂B

2.) HDTXg͎tꂽuƂ̓eɂċLqĂ܂B

Ⴆ΁F
HDT_entry_type HDT[] =
{
    MOTOR,MOTOR_RIGHT,"RIGHT",(void *)&motor0,
    MOTOR,MOTOR_LEFT,"LEFT",(void *)&motor1,

    PSD,PSD_FRONT,"FRONT",(void *)&psd1,

    INFO,INFO,"INFO",(void *)&roboinfo,

    END_OF_HDT,UNKNOWN_SEMANTICS,"END",(void *)0
};

Ⴆ΍ŏ̍s
MOTOR           : it is a motor
MOTOR_LEFT      : its semantics
"LEFT"          : a readable string for testroutines
&motor0         : a pointer to the motor0 data structure


INFOEND_OF_HDTo^͕K{łI
̏⑼ׂ̂Ă̒萔ɂĂ/mc/robios/include/hdt.h̒
Œ`Ă܂B


ǂ̂悤Ɏĝ
------------------------
̓[^[Ef(/mc/demos/motor)̎łB
܂A[^[̃nhKvłBF

MotorHandle     leftmotor;

ɁAgp郂[^[̏gMOTORInitĂяoAnh
΂Ȃ܂B

MOTORInit֐͗^ꂽgă[^[TÂ
Ƀ[^[phCo[Ăяo܂B

leftmotor = MOTORInit(LEFTMOTOR);

ŁA]xݒ肷邱Ƃɂă[^[gƂł܂B
̊֐́A[^[phCo[ĂяoALŏꂽ[
^[ɗ^ꂽ]xݒ肵܂B

MOTORDrive (leftmotor,50);

[^[gpŁAĂщKv܂B
̊֐͉郂[^[Ăяo܂B

MOTORRelease (leftmotor);

ׂ̂Ă̑uɂĂlɎgp܂B
֐̏ڍׂɂĂ/mc/EXECLIBQƂĂB

[/_E[h
------------------------------

[݂ɂ@:

HDT\zgݎ菇͏قȂ܂B
HDTRoBiOSƂ͕ʂɏޕKv܂B

菇Flash-ROM̃[eʂɈˑ܂B

1 MrbgF
1 MrbgFlash[͕IɊe16KB̂WubNɕ
܂Bŏ̂VubNRoBiOSŎgp܂BŌ̃ubN
HDTf[^\ɗ\񂳂Ă܂BāÄ̗͍ő16KB
Ȃ\ȗeʂłB 

RoBiOSL̂悤ɏ݂܂BF
flash 11111110 robios.hex 0

HDT͉L̂悤ɂ܂BF
flash 00000001 hdtdata.hex $1c000 


4 MrbgF
4 MrbgFlash[͕IɊe64KB̂WubNɕ
āAeubNɑ΂ĕʁXɏ菑񂾂ł܂B
ŏ̂QubNRoBiOSHDTŎg܂BĉUubNɂ
RoBiOSUSRj[gĂR܂ł̃[U[vO
ނƂł܂B炩1Mrbg̏ꍇ̂悤ɕēʒu
HDTf[^\ނƂł܂BHDTƂɗe
64KB̃ubNiRubNj𖳑ʂɂȂ߂ɂ́A蓹
Kv܂Bő16KB̗eʂHDTRubN̍ŏ
̈ɏ݂܂B̑ɂāAɕۑĂ郆[U[
vOiXbgPj邱ƂɒӂĂB
EyebotċNRoBiOSVHDTFÂ悤ɂđQ
ubNɃf[^܂܂BF
܂AQubNɂRoBiOS̗̈48KB̃f[^RAMɃRs[
܂BāAVHDT̗̈łRubN̏߂16KB̃f
[^RAMɃRs[܂B̐V64KB̃f[^Flash-ROM
̑QubNɏ܂܂BRubN͏AVɃ[
U[vOނƂł悤ɂȂ܂B̑ɂ
āA1MrbgFlach-ROM̏ꍇƓf[^AhXɊi[
ƂɂȂ܂B

RoBiOSL̂悤ɏ݂܂BF
flash 11000000 robios.hex 0

HDT͉L̂悤ɂ܂BF
flash 00100000 hdtdata.hex $20000 


_E[hɂ@F

RoBiOSV.1.4ȍ~̃o[WłHDTRoBioSVAC^[tF
[X(1-3)oRŃ_E[h邱Ƃł܂BǂFlash[
̏ꍇɂႢ͂܂B[U[vO_E[h悤
'USR'j['LD'IAp\Ŕuhdtxxx.hexv܂
urobios.hexvt@C̓]Jn܂BRoBiOS͎IɐVHDT
܂RoBiOSoAK؂Ƀf[^݂܂B͏q̃[
݂ɂ@ĊȒPłB


HDTւ̓o^̋L@
---------------------------

obe[
-----------------
typedef struct
{
    int     version;
   	short   low_limit;
	short   high_limit;
}battery_type;

F
battery_type battery = {0,550,850};

int version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

short low_limit: 
@obe[ȂȂ钼OɂADRo[^[̂P`
@l̑lw肵܂Bɂ蓋ڂĂobe[
@̍ŏEdl`܂B

short   high_limit:
@Sɏ[dobe[tƂADRo[^[
@̂P`l̑lw肵܂Bɂ蓋ڂĂ
@obe[̍őEdl`܂B


op[
---------
typedef struct
{
    int     driver_version;
    int     tpu_channel;
    int     tpu_timer;
    short   transition;
}bump_type;

F
bump_type bumper0 = {0, 6, TIMER2, EITHER};

int driver_version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱@Ƃh~
@܂B

int tpu_channel:
@op[tĂTPŨ`lԍw肵
@܂B0`15̒lLłBeop[́uՓˁvM
@o邽߂ɂꂼTPU`lKvłB

int tpu_timer:
@TPU^C}[w肷Kv܂BݒĺATIMER1
@TIMER2LłBuՓˁvoǍvZp
@Ƀ^C}[li[܂B

@TIMER14MHz-8MHz͈̔͂Ŏgp܂B(CPUNbNɈˑ)
@TIMER2512Khz-1MHz͈̔͂Ŏgp܂B(CPUNbNɈˑ)

short transition:
@Mo@w肵܂BݒĺARISINGAFALLINGA
@EITHERLłBop[̍p@؂ւ邽߂ɁA
@TPȔ@I邱Ƃł܂B


RpX
----------
typedef struct
{
  short   version;
  short   channel;
  void*   pc_port;
  short   pc_pin;
  void*   cal_port;
  short   cal_pin;
  void*   sdo_port;
  short   sdo_pin;
}compass_type;

F
compass_type compass = {0,13,(void*)IOBase, 2,(void*)IOBase, 4, (BYTE*)IOBase, 0};

short version:
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

short channel: 
@f[^]̓Ƃ邽߂ɃRpXɐڑTPŨ`
@lԍw肵܂BݒĺA0`15LłB

void* pc_port:
@8rbg̃WX^[^b`iój\|C^[w
@܂BPCMRpX̑JnMɂȂ܂B

short pc_pin:
@pc_portŎw肵WX^[^b`ɂPCMp̃rbg
@ԍw肵܂BݒĺA0`7LłB

void* cal_port:
@8rbg̃WX^[^b`iój\|C^[w
@܂BCALMRpX̍ZJnMɂȂ܂B
@Z̕KvȂꍇɂNULLw肷邱Ƃł܂i
@̏ꍇɂ͍Zp֐ĂяoƂ͂ł܂jB

short cal_pin:
@cal_portŎw肵WX^[^b`ɂCALMp̃rb
@gԍw肵܂BݒĺA0`7LłB

void* sdo_port:
@8rbg̃WX^[^b`íj\|C^[w
@܂BSDOM̓RpX̃VAf[^o͒[qɐ
@܂BhCo[TPC`lMƓƂăV
@Af[^ǂݎ܂B

short sdo_pin:
@sdo_portŎw肵WX^[^b`ɂSDOMp̃rb
@gԍw肵܂BݒĺA0`7LłB


VXe
-------------
typedef struct
{
	int     version;
	int     id;
	int     serspeed;
	int     handshake;
	int     interface;
	int     auto_download;
	int     res1;
	int     cammode;
    int     battery_display;
    int     CPUclock;
    float   user_version;
    String10 name;
    unsigned char res2;    
}info_type;

F
info_type roboinfo0  = {0,VEHICLE,SER115200,RTSCTS,SERIAL2,AUTOLOAD,0,AUTOBRIGHTNESS,BATTERY_ON,16,VERSION,NAME,0};

int version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

int id:
@RoBiOSĂ錻݂̊w肵܂BݒĺAPLATFORM, 
@VEHICLE, WALKERLłBOSMachineType()֐gēǂݏo
@Ƃł܂B

int serspeed:
@ftHg̃VA|[gɂftHg̒ʐMx
@w肵܂BݒĺASER9600ASER19200ASER38400ASER57600A
@SER115200LłB

int handshake:
@ftHg̃VA|[gɂftHg̓@
@w肵܂BݒĺANONEARTSCTSLłB

int interface:
@[U[vO]邽߂̃ftHgVA|[
@g̔ԍw肵܂BݒĺASERIAL1ASERIAL2ASERIAL3
@LłB

int auto_download;
@RoBiOS̃Cj[Ɋւ_E[h[hw肵
@BAUTOLOAD[hɐݒ肳ĂƂɂ́ARoBiOSN
@ƁAftHg̃VA|[gXLA_E[h
@pt@CT܂Bt@CoƎIɃ_E
@[hĎs܂BNO_AUTOLOAD[hɐݒ肳ĂƂ
@̓XL͍s܂B

int res1:
@͗\̐ݒłBiĂ͖ȕԕϐƂ
@gpĂ܂B݂͓ƎHDTo^s܂B
@0ݒ肵܂Bj

int cammode:
@ftHg̃J[hw肵܂BݒĺAAUTOBRIGHTNESS
@NOAUTOBRIGHTNESSLłB

int battery_display:
@obe[ԕ\̗Lw肵܂BݒĺABATTERY_ON
@BATTERY_OFFLłB

int CPUclock:
@MC68332}CNvZbT[̃NbNg(MHz)w肵܂B
@OSMachineSpeed()֐gČĂяoƂł܂B

float user_version:
@[U[߂݂HDTo[Ww肵܂B̒l͒P
@ƂĎgpARoBiOSHRDj[ŕ\܂B

String10 name;
@[U[߂EyeBot̖Ow肵܂B̖O͒Pɏ
@ƂĎgpARoBiOS̃Cj[ŕ\܂B
@OSMachineName()֐gČĂяoƂł܂B

unsigned char robi_id;
@[U[߂EyeBotIDԍw肵܂BIDԍ
@PɏƂĎgpARoBiOS̃Cj[ŕ\܂B
@OSMachineID()֐gČĂяoƂł܂Bj[
@Hrd/Set/Rmtɑ삷邱ƂɂĈꎞIɕύX邱Ƃ
@ł܂B

unsigned char res2:
@͗\̐ݒłBiĂ͖ũ{bgIDƂ
@gpĂ܂B݂͓ƎHDTo^s܂B
@0ݒ肵܂Bj


ԊOZT[
---------------
typedef struct
{
    int     driver_version;
    int     tpu_channel;
}ir_type;

F
ir_type   ir0 = {0, 8};

int driver_version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

int tpu_channel:
@ԊOZT[̎tꂽTPŨ`lԍw
@܂BݒĺA0`15LłBeԊOZT[͏
@QFMo邽߂ɂꂼTPU`l
@KvłB


erpԊOR
-------------------------
typedef struct
{
  short   version;
  short   channel;
  short   priority;
  /* new in version 1: */
  short   use_in_robios;
  int     type;
  int     length;
  int     tog_mask;
  int     inv_mask;
  int     mode;
  int     bufsize;
  int     delay;
  int     code_key1;
  int     code_key2;
  int     code_key3;
  int     code_key4;
} irtv_type;

͐VKɊgꂽIRTV\łBRoBiOSł̓o[W0̌
ݒlgĂmLAVCN 620Wݒ舵Ƃł
܂BAVo[WgꍇAԊOR
RoBIOŜS̃L[𑀍삷邱Ƃł܂B

Âݒ(o[W 0̗l):
SoccerBot̗F
irtv_type irtv = {0, 11, TPU_HIGH_PRIO};  /* TPU 11 (=S10)ɃZT[ڑ */

EyeWalker̗F
irtv_type irtv = {0, 0, TPU_HIGH_PRIO};   /* TPU 0ɃZT[ڑ */

Vݒ (o[W 1̗lAmLAVCN620):
irtv_type irtv = {1, 11, TPU_HIGH_PRIO, REMOTE_ON, SPACE_CODE, 15, 0x0000, 0x03FF, DEFAULT_MODE, 1, -1, RC_RED, RC_GREEN, RC_YELLOW, RC_BLUE}; 


short version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

short channel:
@IRTVZT[tĂTPŨ`lԍw
@܂BݒĺA0`15LłBʏAZT[͋󂢂
@T[{pRlN^[ɐڑ܂BAEyeWalkerɂ
@Ă͋󂢂ĂT[{pRlN^[̂ŁADC[^[p
@RlN^[ɐڑĂ܂Bî߂ɂ͊ȒPȉKv
@łBڍׂ̓}jAĂBj

short priotity:
@ĂĂTPU`lIRQDxw肵܂B
@TPU_HIGH_PRIOݒ肷悤ɂĂBɂA
@R̎w肱ڂȂȂ܂B

short use_in_robios:
@REMOTE_ONݒ肷EyeBot̂S̃L[RobiosŎg
@ł܂BREMOTE_OFFݒ肷Ƃ̋@\ɂȂ܂B

int type:
int length:
int tog_mask:
int inv_mask:
int mode:
int bufsize:
int delay:
@͓̃R̂߂̐ݒlw肵܂BIRTVInit()
@֐ĂяoƂƊSɓp[^gKv܂B
@Lł̓ftHg̃mLAVCN620̂߂̗Ă܂B
@̐ݒ́uircavƂTvvO̒Ŏgp
@Ă܂B

int code_key1:
int code_key2:
int code_key3:
int code_key4:
@EyeBot̂S̃L[ƃR̂S̃{^Ή
@߂Ɏw肵܂BmLARp̃R[huIRnokia.hvƂ
@wb_[t@C̒ŎgpĂ܂B


b`
-------
@tĂo͗p̃b`̏ꏊƌw肵܂B

typedef struct
{
  short   version;
  BYTE*   out_latch_address;
  short   nr_out;
  BYTE*   in_latch_address;
  short   nr_in;
} latch_type;

F
latch_type latch = {0, (BYTE*)IOBase, 1 , (BYTE*)IOBase, 1};

int version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

BYTE*   out_latch_address:
@o͗pb`̊JnAhXw肵܂B

short   nr_out:
@Wrbgo͗pb`̌w肵܂B

BYTE*   in_latch_address;
@͗pb`̊JnAhXw肵܂B

short   nr_in;
@Wrbg͗pb`̌w肵܂B


DC[^[
-------------

typedef struct
{
	int     driver_version;
	int     tpu_channel;
	int     tpu_timer;
	int     pwm_period;
	BYTE*   out_pin_address;
	short   out_pin_fbit;
	short   out_pin_bbit;
    BYTE*   conv_table;     /* NULL if no conversion needed */
}motor_type;

F
motor_type motor0 = {1,  0, TIMER1, 8196, (void*)(OutBase+2), 6, 7, (BYTE*)&motconv0)};

int driver_version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

int tpu_channel:
@DC[^[tĂTPŨ`lԍw肵
@܂BݒĺA0`15LłBeDC[^[͗lXȉ]
@ŋ쓮邽߂ɁAꂼPWMipXϒjMKvłB
@MC68332ɓĂTPU16`l܂łPWMM𐶐
@邱Ƃł܂Bœ͂ĺAۂ̉HɊÂ
@߂܂B

int tpu_timer:
@TPU^C}[w肷Kv܂BwĺATIMER1
@TIMER2LłBPWMM͓^C}[ɊÂĐ
@܂BQނ̃^C}[APWMM̎߂̂
@gƂł܂BTIMER1CPUNbNgɈˑ
@4MHz8MHz܂ł̑xŋ@\AMCPU4MHz̏ꍇ
@ɂ128Hz`4MHzA8MHz̏ꍇɂ256Hz`8MHzɂȂ܂B
@TIMER2CPUNbNgɈˑ512KHz1MHz܂ł
@xŋ@\AMCPU512KHz̏ꍇɂ16Hz`512KHzA
@1MHz̏ꍇɂ32Hz`1MHzɂȂ܂B

@ۂTIMERx̑x肷ɂ͉L̎g܂BF
@@TIMER1[MHz] = 4MHZ * (16MHz + (CPUNbNg[MHz] % 16))/16
@@TIMER2[MHz] = 512KHZ * (16MHz + (CPUNbNg[MHz] % 16))/16

int pwm_period:
@PPWMM̎HzŎw肵܂B̒lCPUg
@Ƃ͓ƗĂ܂Bőg̓[^[100iK̑x
@Ő䂷邽߂TPUg1001ɂȂ܂BāA
@őgTIMER1ł40-80KHzATIMER2ł5-10KHzɂȂ
@܂iCPUNbNgɈˑ܂jBŏg̓^C
@}[̃NbNg32768ŊlAȂ킿ő
@ɑΉāA128-256Hz (Timer1)16-32Hz (Timer2)ɂȂ
@B[^[́u߂vh~邽߂ɂ́A܂x
@Ȃ悤ɐݒ肷Kv܂BA
@TPǓvZԂȂȂ܂B

BYTE* out_pin_address:
@o̓|[g̃AhXw肵܂BݒĺA32rbg
@AhXlłB[^[̉]𐧌䂷邽߂H^u
@bWg܂B̃^Cv̉Hł́AʏAP̃b`
@ɂQ̏o͒[qڑ܂BႦ΁AEyeBot̏o
@pb`OUTBASEƂɂÂAhXɂ܂BQ
@[q̂P͐]pɑ͔]pɐݒ肵܂B

short out_pin_fbit:
@]p|[g̃rbgԍw肵܂BݒĺA0`VL
@łBout_pin_addresŎw肵b`̃rbgԍ
@Ȃ܂B

short out_pin_bbit:
@]p|[g̃rbgԍw肵܂BݒĺA0`VL
@łBout_pin_addresŎw肵b`̃rbgԍ
@Ȃ܂B

BYTE* conv_table: 
@[^[̈Ⴂ␳邽߂̕ϊ\ւ̃|C^[w肵
@܂BݒĺANULL邢101oCg̕ϊ\ւ̃|C^[
@lLłBʏA悤ɓd͂ĂAQ̃[^[
@͂킸ɈقȂ]xɂȂ܂BႦ΁Aړ{bg
@OiĂȂĐiޏꍇɖ𗧂܂B1̃[^[
@1̃[^[ɑ΂ĒƂɁAP̕ϊ\Kv
@Ȃ܂Bݒ\Ȋex(0`100%)ɂāÃ[^[
@]ɂȂ悤ɕϊ\쐬Ȃ΂Ȃ܂B]
@x̑[^[𒲐̂͏ȂłB]̎
@x̃[^[x𑬂邱Ƃ͐ݒl100ȏɂȂ
@΂Ȃ炸s\łI

@qgFڑĂGR[_[gĕϊ\쐬邱
@@@@@ł܂B


oZT[ (PSD)
-------------------------------
typedef struct
{
	short   driver_version;
	short   tpu_channel;
	BYTE*   in_pin_address;
	short   in_pin_bit;
	short   in_logic;
	BYTE*   out_pin_address;
	short   out_pin_bit;
	short   out_logic;
	short*  dist_table;
}psd_type;

F
psd_type psd0 = {0, 14, (BYTE*)(Ser1Base+6), 5, AL, (BYTE*)(Ser1Base+4), 0, AL, (short*)&dist0};
psd_type psd1 = {0, 14, (BYTE*)InBase, 2, AH, (BYTE*)OutBase, 0, AH, (short*)&dist1};

int driver_version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

short tpu_channel:
@PSDZT[ƃVA̓Ƃ邽߂ɎgTPŨ`l
@ԍw肵܂BݒĺA0`15LłBTPU`
@l͓͂܂͏o͒[qƂĎg܂BmȓM
@邽߂ɕKvȍ\^C}[ƂĂ̂ݎg
@BQȏPSDZT[ڑꍇɂ́AePSDZ
@T[͓TPU`lgȂ΂Ȃ܂BׂĂ
@܂͑IꂽPSDZT[͓^C~Oő邱
@ł܂BPSDZT[̈ʒuɂ܂Af[
@^𓾂邽߂ɐڋ߂ĂZT[̑߂ÂȂ
@ɂĂB

BYTE* in_pin_address:
@PSDZT[̃f[^M8rbg̃WX^[^b`
@̃|C^[w肵܂B

short in_pin_bit:
@in_pin_addressŎw肵WX^[^b`ɂPSDM
@M|[g̃rbgԍw肵܂BݒĺA0`7LłB

short in_logic:
@MPSDf[^`w肵܂BݒĺAAHALLłB
@WX^[ɂĂ͓̓f[^ɂȂ̂܂B
@ꍇɂ̓ANeBuE[(AL)ݒĂB

BYTE* out_pin_address:
@PSDZT[֐M𑗐M邽߂8rbg̃WX^[^b`
@̃|C^[w肵܂BQȏPSDZT[ڑꍇ
@ɂ͓o͒[qgƂł܂BɂAWX^[̃r
@bgMLɎgƂł܂B

short out_pin_bit:
@out_pin_addressŎw肵WX^[^b`ɂPSDM
@M|[g̃rbgԍw肵܂BݒĺA0`7LłB

short out_logic:
@MPSDM`w肵܂BݒĺAAHALLłB
@WX^[ɂĂ͏o̓f[^ɂȂ̂܂B
@ꍇɂ̓ANeBuE[(AL)ݒĂB

short* dist_table:
@ϊ\̃|C^[w肵܂BPSDZT[8rbg̑
@l𐶐܂Bsm邽ߏ7rbǧʂg
@iɂȂ܂jBmmŋ\߂128̒l\
@KvɂȂ܂BǂPSDZT[킸ɑlɂ΂A
@lۏႷ邽߂ɂPSDZT[Ƃɂ̕ϊ\KvɂȂ
@܂B\͊euŁv쐬Ȃ΂Ȃ܂BRoBiOS̃eXg
@vOł́Aۂɑ肵\8rbg̐f[^\
@܂BZT[瑪ʂƉƁAɏ]
@f[^ω܂Bef[^ɑΉ鋗mmPʂő肵
@Lq邱Ƃŕϊ\邱Ƃł܂B


pXGR[_[
------------------
typedef struct
{
	int     driver_version;
	int     master_tpu_channel;
	int     slave_tpu_channel;
    DeviceSemantics motor;
    unsigned int clicksPerMeter;
    float   maxspeed;       /* (in m/s) only needed for VW-Interface */
}quad_type;

F
quad_type decoder0 = {0, 3, 2, MOTOR_LEFT, 1234, 2.34};

int driver_version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

int master_tpu_channel:
@pXGR[_[ŎgpPTPU`lԍw
@܂BݒĺA0`15LłB[^[̃GR[_[
@M邽߂ɁAQ̘ATPU`lg
@܂BgpQ̃`l̐ڑԂς邱Ƃɂ
@肵Ă]𔽓]邱Ƃł܂B

int slave_tpu_channel:
@pXGR[_[ŎgpQTPU`lԍw
@܂BݒĺAmaster_tpu_channelŐݒ肵ĺ}P
@LłB

DeviceSemantics motor:
@ڑĂ郂[^[̖Ow肵܂BRoBiOSɓ
@Ă֐ł̃GR[_[eXgƂɁA
@ڑĂ郂[^[̖OKvłB

unsigned int clicksPerMeter:
@̃p[^̓[^[Ŏԗւ쓮ꍇɂ̂ݎg
@܂B1m̋iނƂɓGR[_[̃JEg
@w肵܂B

float maxspeed:
@̃p[^̓[^[Ŏԗւ쓮ꍇɂ̂ݎg
@܂Bԗւ̍ő呬xm/s̒PʂŎw肵܂B


u
--------------
@u̐ݒŝɎg܂B

typedef struct
{
    int version;
    short robi_id;
    short remote_control;
    short interface;
    short serspeed;
    short imagemode;
} remote_type;

F
remote_type remote = {0, ID, REMOTE_ON, SERIAL2, SER115200, IMAGE_FULL};

int version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

short robi_id;
@EyeBotpɃ[U[߂ƎIDԍw肵܂Bݒ
@ĺA0`255LłBIDԍ͒PɏƂĎgp
@ARoBiOS̃Cj[ŕ\܂BOSMachineID()
@gČĂяoƂł܂Bj[Hrd/Set/Rmt
@ɑ삷邱ƂɂĈꎞIɕύX邱Ƃł܂B

short remote_control:
@EyeBotpɃftHg̐䃂[hw肵܂BݒĺA
@REMOTE_ON (ʂ]Aup\RL[R}h
@M܂jAREMOTE_OFF (ʏ탂[hł)AREMOTE_PC 
@(p\Rf[^]邾łBȂ킿A{^
@݂͂̂g܂BjAREMOTE_EYE (Eyebot݂̂f[^
@܂BȂ킿ʏ݂̂Ă܂B)L
@łB

short interface:
@ʐMp̃ftHg̃VAC^[tF[Xw肵
@܂BݒĺASERIAL1ASERIAL2ASERIAL3LłB

short serspeed:
@IꂽVAC^[tF[XɂftHg
@ʐMxw肵܂BݒĺASER9600ASER19200A
@SER38400ASER57600ASER115200LłB

short imagemode:
@J摜p\Rɓ]邽߂̃[hw肵܂B
@ݒĺAIMAGE_OFF(摜Ȃ)AIMAGE_REDUCED (掿ቺ
@摜)AIMAGE_FULL (Be܂܂̉摜)LłB


T[{[^[
-----------------
typedef struct
{
  int     driver_version;
  int     tpu_channel;
  int     tpu_timer;
  int     pwm_period;
  int     pwm_start;
  int     pwm_stop;
}servo_type;

F
servo_type servo0 = {1,  0, TIMER2, 20000, 700, 1700};

int driver_version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

int tpu_channel:
@T[{[^[tĂTPŨ`lԍ
@w肵܂BݒĺA0`15LłBeT[{[^[
@͉]pxς邽߂PWM(pulse width modulated)M
@KvłBMC68332`bvTPU16`l܂ł̐M
@邱Ƃł܂Bœ͂lhۂ̉H
@ÂČ߂܂B

int tpu_timer:
@TPU^C}[w肷Kv܂BwĺATIMER1
@TIMER2LłBPWMM͓^C}[ɊÂĐ
@܂BQނ̃^C}[APWMM̎߂̂
@gƂł܂BTIMER1CPUNbNgɈˑ
@4MHz8MHz܂ł̑xŋ@\AMCPU4MHz̏ꍇ
@ɂ128Hz`4MHzA8MHz̏ꍇɂ256Hz`8MHzɂȂ܂B
@TIMER2CPUNbNgɈˑ512KHz1MHz܂ł
@xŋ@\AMCPU512KHz̏ꍇɂ16Hz`512KHzA
@1MHz̏ꍇɂ32Hz`1MHzɂȂ܂B

@ۂTIMERx̑x肷ɂ͉L̎g܂BF
@@TIMER1[MHz] = 4MHZ * (16MHz + (CPUNbNg[MHz] % 16))/16
@@TIMER2[MHz] = 512KHZ * (16MHz + (CPUNbNg[MHz] % 16))/16

int pwm_period:
@PPWMM̎}CNb(s)Ŏw肵܂Bʏ
@T[{[^[20msȂ킿20000sPWMKvłB
@̈قȂT[{gpƂɂ́Aɂ킹Ă̒l
@ς邱Ƃł܂BT[{̐mȈʒuM𐶐邽
@ɏTIMER2gpĂB̒lCPUNbNg
@͕ʂ̂̊Ԋu\li[^[̐QƁjłB

int pwm_start:
@PWMMɂnCx̍ŏԊԊusŎw肵܂B
@ݒĺA0`pwm_periodŎw肵lLłBT[{
@ʒu߂s߂ɁAQ̋ɒ[Ȉʒu`Kv
@܂Bʏ̏ꍇAT[{0.7ms (700s)̃nCx
@̍ŏԊԊuePWMM̏߂ɕKvŁA̒l̋ɒ[
@ȈʒuM̈ɂȂ܂B

int pwm_stop:
@PWMMɂnCx̍ő厞ԊԊusŎw肵܂B
@ݒĺA0`pwm_periodŎw肵lLłBT[{
@]ɂāApwm_start菬Ȓl邢͑傫Ȓl
@I邱Ƃł܂BT[{̈ʒu߂s߂ɁA
@Q̋ɒ[Ȉʒu`Kv܂Bʏ̏ꍇA
@T[{1.7ms (1700s)̃nCx̍ő厞ԊԊuePWM
@M̏߂ɕKvŁA̒l̋ɒ[ȈʒuM̈ɂ
@܂Bɂ

@qgFT[{̂ő]͈͂𓮂Kv̂Ȃ
@@@@@ꍇɂ́Astartstopp[^𒲐邱
@@@@@ł܂BɂA1ms`1.5mŝ悤ɂ蕝
@@@@@PWMMA蕪\邱Ƃ
@@@@@ł܂BtɁȂ傫PWMMɂđ傫Ȕ͈
@@@@@̉]邱Ƃł܂BF
@@@@@Ⴆ΁A210x̉]͈͂T[{gĂ݂܂
@@@@@傤BPstop1.9msɐݒ肵܂BŁA0
@@@@@210̒lݒ肷ƁAۂ̊pxɑΉāAŒႩ
@@@@@őpx܂ŕω邱Ƃł܂B210ȏ̒l
@@@@@w肷ƁA210w肵ʂƓɂȂ܂B


X^[gAbv摜
--------------------
typedef BYTE image_type[16*64];

F
image_type startimage = {0xB7,0x70,0x1C,...0x00};

@oCgzf[^ɂāA[U[Ǝ̃X^[gAbv摜
@w肷邱Ƃł܂BݒĺAerbgfɑΉ
@128x64f̔摜f[^łB


X^[gAbvy
-------------------
no typedef

F
int startmelody[] = {1114,200, 2173,200, 1114,200, 1487,200, 1669,320, 0};

@X^[gAbvɉt郆[U[Ǝ̉yw肵܂B
@ݒĺAyAɂȂl̃XgłBŏ̒lgA
@QԖڂ̒l1/100s̒Pʂŕ\ێԂłBXg̍Ō
@̒l͂OPLȂ΂Ȃ܂B


ԗւ̋쓮
----------
typedef struct
{
	int     version;
    int     drive_type;
    drvspec drive_spec; /* -> diff_data */
}vw_type;

    typedef struct
    {
        DeviceSemantics quad_left;
        DeviceSemantics quad_right;
        float           wheel_dist; /* meters */
    }diff_data;

F
vw_type drive = {0, DIFFERENTIAL_DRIVE, {QUAD_LEFT, QUAD_RIGHT, 0.21}};

int driver_version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

int drive_type:
@쓮@w肵܂BݒĺADIFFERENTIAL_DRIVE (ACKERMAN_DRIVEA
@SYNCHRO_DRIVEATRICYCLE_DRIVE)LłBȉ̃p[^[
@Iꂽ쓮@ɂĕς܂B

DIFFERENTIAL_DRIVȄꍇF
@쓮쓮́Asŉ^S̒ԂɂƗ
@Q̎ԗւō\Ă܂B[^ɐڑ邽߂
@Q̃GR[_[KvɂȂ܂B

    DeviceSemantics quad_left:
@@@ԗւɎgĂGR[_[̖Ow肵܂B

    DeviceSemantics quad_right:
@@@EԗւɎgĂGR[_[̖Ow肵܂B

    float wheel_dist:
@@@^S肷邽߂ɂQ̎ԗւ̊Ԋu(m)w肵܂B


EFCg
--------------
typedef struct
{
	short     version;
	short     rom_ws;
	short     ram_ws;
	short     lcd_ws;
	short     io_ws;
	short     serpar_ws;
}waitstate_type;


F
waitstate_type waitstates = {0,3,0,1,0,2};

int version: 
@݊̂hCo[̍őo[Ww肵܂B
@VhCo[قǑ̏KvƂĂÃ^O
@ɂăhCo[Kvȏ̏ǂݎ邱Ƃh~
@܂B

short rom_ws:
@ROMANZX̃EFCgԂw肵܂BݒĺAL
@Lłĩp[^ɂĂlłjB
@@waitstates = 0`13A
@@Fast Termination = 14A
@@External = 15

short ram_ws:
@RAMANZX̃EFCgԂw肵܂B

short lcd_ws:
@LCDANZX̃EFCgԂw肵܂B

short io_ws:
@o͗pb`̃ANZX̃EFCgԂw肵܂B

short serpar_ws:
@16c552̃VA^p|[g̃ANZX̃EFCg
@Ԃw肵܂B


