目次

デバッグシステム開発

 H8には、以下のハードウエアを接続しています。

 これらのハードウエアをテストするために、コマンドを決めます。
 闇雲に決めるのではなく、アルファベットのA〜Zを使い、大文字と
 小文字を使い分け、最大52種利用できます。

 6種類のハードウエアをテストするため、1文字コマンドを決めます。
  1. B(Button) → ボタン
  2. G(Get image) → カメラ
  3. E(Eeprom) → シリアルEEPROM
  4. S(Sram) → SRAM
  5. M(Motor) → モータドライブ回路
  6. L(Lcd) → LCD
 デバッグ中か通常の処理を選択したり、コマンドの使い方を  忘れた場合も考え、デバッグ選択とヘルプを用意します。

デバッグ選択

 仕様を決めます。  コマンド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); }
目次

inserted by FC2 system