目次
前
次
デバッグシステム開発
H8には、以下のハードウエアを接続しています。
- ボタン
- カメラ
- シリアルEEPROM
- SRAM
- モータドライブ回路
- LCD
これらのハードウエアをテストするために、コマンドを決めます。
闇雲に決めるのではなく、アルファベットのA〜Zを使い、大文字と
小文字を使い分け、最大52種利用できます。
6種類のハードウエアをテストするため、1文字コマンドを決めます。
- B(Button) → ボタン
- G(Get image) → カメラ
- E(Eeprom) → シリアルEEPROM
- S(Sram) → SRAM
- M(Motor) → モータドライブ回路
- L(Lcd) → LCD
デバッグ中か通常の処理を選択したり、コマンドの使い方を
忘れた場合も考え、デバッグ選択とヘルプを用意します。
- D(Debug) → デバッグ
- ?(Help) → ヘルプ
デバッグ選択
仕様を決めます。
コマンド1文字'D'に続けて、'1'か'0'を入力します。
"D1\r" か "D0\r"
'1'を入力すると、デバッグモードにします。
'0'を入力すると、通常モードにします。
デバッグモードか通常モードを示すために、以下の仕様で
LCDに文字列を返します。
'1' → "DBG ON" 表示
'0' → "DBG OFF"表示
ヘルプ
仕様を決めます。
コマンドを入力すると、ホストに文字列を返送します。
文字列は、以下とします。
"C => control bit test"
" CW0 => nWE = 1 CW1 => nWE = 0"
" CR0 => nOE = 1 CR1 => nOE = 0"
" CS00 => nCS0 = 1 CS01 => nCS0 = 0"
" CS10 => nCS1 = 1 CS11 => nCS1 = 0"
" CS20 => nCS2 = 1 CS21 => nCS2 = 0"
" CS30 => nCS3 = 1 CS31 => nCS3 = 0"
"E => EEPROM access"
" EA => get 128 word data"
" ESaadddd => set 1 word data"
"D => debug"
" D1 => debug in"
" D0 => debug out"
"G => get image"
"R => read SRAM"
" Raaaa : aaaa <= address"
"L => test LCD"
" Lnstr => n:line number 0 or 1"
"M => test motor"
" Mllrrtt => ll : left ratio rr : right ratio tt:time"
"S => test memory"
"B => get button state"
"? => help"
ボタン
仕様を決めます。
コマンドを入力すると、MODE、STARTのボタンの状態を1、0
でホストに返送します。
次のようにホストに表示します。
MODE:1
START:0
カメラ
仕様を決めます。
コマンドは、GとRにします。
Gの場合は、カメラから画像データを入力し
SRAMに保存します。
Rの場合は、アドレスを指定して1バイトずつ
データをホストに転送します。
1バイトを16進2けたとします。
シリアルEEPROM
仕様を決めます。
サブの1文字を付加し、ホストから1ワードライトか
ホストへの64ワード表示にします。
サブの1文字は、ホストから1ワードライトはSとします。
サブの1文字は、ホストへの64ワード表示はAとします。
64ワード表示は、以下の入力とします。
"EA\r"
1ワードライトは、アドレスを16進2けた、データを
16進4けたで指定します。
"ES12abcd\r"
SRAM
仕様を決めます。
コマンドは、CとSにします。
Cの場合は、サブの1文字を付加して、SRAMのnWE、nOE、nCS0、
nCS1、nCS2、nCS3にHかLを印加します。
Sの場合は、0x55あるいは0xaaを32kバイトライト後
読出し比較します。OKかNGをLCDに表示します。
Cコマンドの場合は、次の組み合わせになります。
"CW1\r" → nWE = L "CR1\r" → nOE = L
"CW0\r" → nWE = H "CR0\r" → nOE = H
"CS01\r" → nCS0 = L "CS00\r" → nCS0 = L
"CS11\r" → nCS1 = H "CC10\r" → nCS1 = H
"CS21\r" → nCS2 = L "CS20\r" → nCS2 = L
"CS31\r" → nCS3 = H "CC30\r" → nCS3 = H
Sコマンドは、次のように指定します。
"S\r"
モータドライブ回路
仕様を決めます。
コマンドは、Mとします。
左、右の順でDuty比を10進2けたとします。
さらに、回転している時間を10進2けたの秒単位で指定します。
左45%、右10%のDuty比で5秒回転させる場合、以下とします。
"M451005\r"
LCD
仕様を決めます。
コマンド1文字に続けて、行番号と文字列を入力します。
LCDの指定行に、文字列を表示します。
入力は、次の仕様とします。
"L0Hello\r"
"L1 mugen\r"
次のようにLCDに表示します。
Hello
mugen
ソースコード
関数tsk0_procに入れたソースコードは、以下です。
void tsk0_proc(void)
{
UBYTE eadr ;
UWORD edat ;
UBYTE cmd ;
UBYTE tmp[10] ;
UWORD i ;
/* check flag */
if ( SFLAG == OFF ) return ;
/* clear flag */
SFLAG = OFF ;
/* branch */
cmd = *(sbuf+0) ;
/* control debug mode */
if ( cmd == 'D' ) {
DFLAG = OFF ; xcopy(tmp,(UBYTE *)"DBG OFF");
if ( *(sbuf+1) == '1' ) { DFLAG = ON ; xcopy(tmp,(UBYTE *)"DBG ON"); }
/* clear line */
put_lcd_clear(0);
/* indicate */
put_lcd_str(0,0,tmp);
}
/* show help */
if ( cmd == '?' ) { show_help(); }
/* debug code */
if ( DFLAG == OFF ) return ;
/* test control bit */
if ( cmd == 'C' ) {
*(tmp+0) = *(sbuf+1) ; /* get sub command character */
/* judge */
if ( *(tmp+0) == 'W' || *(tmp+0) == 'R' ) {
/* default */
SRAM_WE = ON ; SRAM_OE = ON ;
/* get logical value */
*(tmp+1) = get_hex( *(sbuf+2) ) ;
if ( *(tmp+1) ) {
if ( *(tmp+0) == 'W' ) { SRAM_WE = OFF ; }
if ( *(tmp+0) == 'R' ) { SRAM_OE = OFF ; }
}
}
if ( *(tmp+0) == 'S' ) {
/* default */
SRAM_CS0 = ON ; SRAM_CS1 = ON ; SRAM_CS2 = ON ; SRAM_CS3 = ON ;
/* get channel number */
*(tmp+1) = get_hex( *(sbuf+2) ) ;
/* get logical value */
*(tmp+2) = get_hex( *(sbuf+3) ) ;
if ( *(tmp+2) ) {
if ( *(tmp+1) == 0 ) { SRAM_CS0 = OFF ; }
if ( *(tmp+1) == 1 ) { SRAM_CS1 = OFF ; }
if ( *(tmp+1) == 2 ) { SRAM_CS2 = OFF ; }
if ( *(tmp+1) == 3 ) { SRAM_CS3 = OFF ; }
}
}
}
/* EEPROM access */
if ( cmd == 'E' ) {
/* get sub command */
*(tmp+0) = *(sbuf+1) ;
/* show data */
if ( *(tmp+0) == 'A' ) {
for ( i = 0 ; i < 64 ; i++ ) {
/* get data */
edat = read_epa( eadr );
/* separate */
for ( i = 3 ; i >= 0 ; i-- ) {
*(tmp+i) = conv_hexdigit( edat & MASK0F ) ;
edat >>= 4 ;
}
/* show */
for ( i = 0 ; i < 4 ; i++ ) { sci1_putchar( *(tmp+i) ) ; }
sci1_putchar( ' ' ) ;
/* new line */
if ( (i % 8) == 7 ) { sci1_crlf() ; }
}
}
/* set data */
if ( *(tmp+0) == 'S' ) {
/* get 1 byte data */
eadr = get_hex2( sbuf+2 ) ;
/* get 1 word data */
edat = get_hex4( sbuf+4 ) ;
/* store data */
write_epa( eadr , edat );
}
}
/* get image */
if ( cmd == 'G' ) { tsk2_proc(); }
/* read image data */
if ( cmd == 'R' ) {
/* get data */
eadr = get_hex4( sbuf+1 ) ;
/* get data */
edat = get_sram( eadr ) ;
/* separate */
for ( i = 3 ; i >= 0 ; i-- ) {
*(tmp+i) = conv_hexdigit( edat & MASK0F ) ;
edat >>= 4 ;
}
/* show */
for ( i = 0 ; i < 4 ; i++ ) { sci1_putchar( *(tmp+i) ) ; }
/* new line */
sci1_crlf() ;
}
/* test LCD */
if ( cmd == 'L' ) {
/* get line number */
*(tmp+0) = get_hex( *(sbuf+1) ) ;
/* show */
put_lcd_str(*(tmp+0),0,sbuf+2);
}
/* test motor */
if ( cmd == 'M' ) {
/* get left duty ratio */
*(tmp+0) = get_dec2( sbuf+1 ) ;
/* get left duty ratio */
*(tmp+1) = get_dec2( sbuf+3 ) ;
/* get time ratio */
*(tmp+2) = get_dec2( sbuf+5 ) ;
/* set duty ratio */
update_motor( *(tmp+0) , *(tmp+1) );
start_pwm();
delay_ms( *(tmp+2) * 1000 );
stop_pwm();
}
/* test memory */
if ( cmd == 'S' ) {
put_lcd_clear(0);
/* set and verify 0x55 */
xcopy(tmp,(UBYTE *)"0x55");
put_lcd_str(0,0,tmp);
/* verify */
verify_sram( 0x55 );
/* set and verify 0xaa */
xcopy(tmp,(UBYTE *)"0xaa");
put_lcd_str(0,0,tmp);
/* verify */
verify_sram( 0xaa );
/* exit */
put_lcd_clear(1);
put_lcd_str(1,0,(UBYTE *)"M:fine");
}
/* get button state */
if ( cmd == 'B' ) {
/* get button state and judge */
*(tmp+0) = '0' ; if ( PB.DR.BIT.B5 ) { *(tmp+0) = '1' ; }
*(tmp+1) = '0' ; if ( PB.DR.BIT.B4 ) { *(tmp+1) = '1' ; }
/* show information */
sci1_puts((UBYTE *)"MODE:") ; sci1_putchar( *(tmp+0) ); sci1_crlf();
sci1_puts((UBYTE *)"START:"); sci1_putchar( *(tmp+1) ); sci1_crlf();
}
}
void show_help(void)
{
sci1_puts((UBYTE *)"C => control bit test");
sci1_puts((UBYTE *)" CW0 => nWE = 1 CW1 => nWE = 0");
sci1_puts((UBYTE *)" CR0 => nOE = 1 CR1 => nOE = 0");
sci1_puts((UBYTE *)" CS00 => nCS0 = 1 CS01 => nCS0 = 0");
sci1_puts((UBYTE *)" CS10 => nCS1 = 1 CS11 => nCS1 = 0");
sci1_puts((UBYTE *)" CS20 => nCS2 = 1 CS21 => nCS2 = 0");
sci1_puts((UBYTE *)" CS30 => nCS3 = 1 CS31 => nCS3 = 0");
sci1_puts((UBYTE *)"E => EEPROM access");
sci1_puts((UBYTE *)" EA => get 128 word data");
sci1_puts((UBYTE *)" ESaadddd => set 1 word data");
sci1_puts((UBYTE *)"D => debug");
sci1_puts((UBYTE *)" D1 => debug in");
sci1_puts((UBYTE *)" D0 => debug out");
sci1_puts((UBYTE *)"G => get image");
sci1_puts((UBYTE *)"R => read SRAM");
sci1_puts((UBYTE *)" Raaaa : aaaa <= address");
sci1_puts((UBYTE *)"L => test LCD");
sci1_puts((UBYTE *)" Lnstr => n:line number 0 or 1");
sci1_puts((UBYTE *)"M => test motor");
sci1_puts((UBYTE *)" Mllrrtt => ll:left ratio,rr:right ratio,tt:delay time");
sci1_puts((UBYTE *)"N => show status");
sci1_puts((UBYTE *)"S => test memory");
sci1_puts((UBYTE *)"B => get button state");
sci1_puts((UBYTE *)"? => help");
}
void verify_sram(UBYTE x)
{
UWORD i ;
UBYTE edat,tmp[8],flag;
/* set data */
for ( i = 0 ; i < 32768 ; i++ ) { put_sram( i , x ); }
/* verify */
flag = OFF ;
for ( i = 0 ; < 32768 ; i++ ) {
edat = get_sram( i ) ;
if ( edat != x ) { flag = ON ; }
}
put_lcd_clear(0);
xcopy(tmp,(UBYTE *)"M:OK!");
if ( flag ) { xcopy(tmp,(UBYTE *)"M:NG!"); }
put_lcd_str(0,5,tmp);
}
目次
前
次