目次
前
次
ワンホットコーディング
ワンホットコーディングとは、フラグを見て、セットされた
ときに、該当する処理を実行するようなプログラムです。
LSI内部では、複数のブロックが同時並行で動作しているので
指定フラグがセットされているときだけ、回路を動かす仕組み
が欲しいときに使います。
フラグは1ビット単位で処理するので、ステートマシンを使う
プログラムでは、次のようなコードを使います。
/* sequencer */
if ( eflag.F1 == ON ) {
/* run */
plc(1);
plc(2);
plc(4);
plc(8);
/* exit */
eflag.F1 = OFF ;
}
変数をひとつのシフトレジスタと見なして、各々のビットを
フラグで使います。
呼ばれた関数は、次コードで、指定動作を実行。
void plc(UBYTE x)
{
/* judge */
if ( x > 8 ) return ;
/* default */
xf = XCNTMAX ;
/* clear 74HC139 control bits */
GPIO = GPIO & 0xfc ;
/* turn on LED_3 */
if ( x.F0 == ON ) { GPIO = GPIO | 3 ; }
/* turn on LED_2 */
if ( x.F1 == ON ) { GPIO = GPIO | 2 ; }
/* enable LED_1 */
if ( x.F2 == ON ) { GPIO = GPIO | 1 ; }
/* judge */
if ( x.F3 == ON ) { xf = YCNTMAX ; }
/* calculate */
TMR1L = xf & 0xff ;
TMR1H = xf / 256 ;
/* enable decoder */
XENA = OFF ;
/* send sound 500ms */
T1CON.TMR1ON = ON ;
delay_ms(500);
T1CON.TMR1ON = OFF ;
/* disable decoder */
XENA = ON ;
/* delay */
delay_ms(250);
}
変数中の0、1、2、3ビット目をフラグと見なして
該当フラグがセットされていたときに、何をするのか
記述すれば、状態遷移図に示された動作を実行可能に。
ワンホットコーディングを適用すると、switch case を
利用する多方向分岐の処理を、if文だけで記述できます。
プログラムで変数は8ビット、16ビット、32ビットと
ビット数を指定できるので、最大で利用するフラグ数
を考えてコーディングすると、ループ処理や多方向の
分岐を書きやすくなります。
目次
前
次