目次

74LS90動作

 74LS90は、JKタイプフリップフロップを4個1パッケージ
 にした、14ピンICです。

 2進カウンタと5進カウンタをTタイプフリップフロップで構成。
 トリガー、非同期リセットを用意しています。

 2進カウンタは、次のようにJK入力を'H'として、トリガーを
 入力するたびに、出力を反転。



 5進カウンタは、3個のJKフリップフロップを従属接続して構成
 ブロック図でみると、以下。




 0から3までは、将棋倒しのように動作させて5になったら
 リセットをかけます。0から4を繰り返し、5進カウンタと
 してます。

 トリガーはINA、INBと独立で、非同期リセットも独立で用意
 されています。

 電源は、対角線上の配置にはなっていないので、基板に実装
 するときには、注意が必要。




 ブレッドボードに74LS90を入れて、ワイヤーを出しておきます。



 ピン接続は、次のようにします。




 Arduinoでは、D8からD13をデジタル出力とし
 A0からA5(D14からD19)をデジタル入力での
 利用なので、D8からクロックに相当する論理
 値を出力すればカウンタ動作を観察できます。

 74LS90のトリガーは負論理で、HからLに変化すると
 出力が反転するか+1の動作になることに注意して
 おきます。

 INAに何度かパルスを送信し、4ビットの出力を
 すべてゼロにしておいてから、動作確認していく
 ことに。

 INA、INBに対して、1パルス出力する関数を用意。

#define INA 8
#define INB 14

void send_ina_pulse()
{
  digialWrite( INA , HIGH );
  digialWrite( INA , LOW  );
}

void send_inb_pulse()
{
  digialWrite( INB , HIGH );
  digialWrite( INB , LOW  );
}

 1パルス出力するためのコマンドを用意して
 それをコマンドインタプリタで扱えるように
 すれば、次のスケッチを作れます。

#define OFF 0
#define ON  OFF+1

#define INA 8
#define INB 14

char sbuf[8] ;
char sindex ;
char uflag ;
char cmd ;
char loopx ;
unsigned char tmp ;
char val ;

void serialEvent();

void crlf()
{
  Serial.write('\r');
  Serial.write('\n');
}

void show_help()
{
  Serial.println("? help");
  Serial.println("a send pulse to INA");
  Serial.println("b send pulse to INB");
  Serial.println("o put bit pattern");
  Serial.println("i get bit pattern");
}

void send_ina_pulse()
{
  digialWrite( INA , HIGH );
  digialWrite( INA , LOW  );
}

void send_inb_pulse()
{
  digialWrite( INB , HIGH );
  digialWrite( INB , LOW  );
}

/* initialize */
void setup()
{
  /* initialize serial port */
  Serial.begin(9600);
  /* */
  PORTB = 0xff ;
  PORTB = 0xff ;
  /* data direction */
  DDRB = 0xff ;
  DDRC = 0x00 ;
  /* initialize variables */
  sindex = 0 ;
  uflag = OFF ;
  cmd = 0 ;
  loopx = 0 ;
  tmp = 0 ;
  val = 0 ;
}

/* main */
void loop()
{
  /* command intepreter */
  if ( uflag == ON ) {
    /* clear flag */
    uflag = OFF ;
    /* new line */
    crlf() ;
    /* get command */
    cmd = sbuf[0] ;
    /* judge */
    if ( cmd == '?' ) { show_help() ; }
    if ( cmd == 'a' ) { send_ina_pulse() ; }
    if ( cmd == 'b' ) { send_inb_pulse() ; }
    if ( cmd == 'o' ) {
      tmp = 0 ;
      for ( loopx = 1 ; loopx <= 6 ; loopx++ ) {
        /* shift */
        tmp <<= 1 ;
        /* judge */
        if ( sbuf[loopx] == '\r' ) break ;
        /* add */
        if ( sbuf[loopx] == '1' ) { tmp |= ON ; }
      }
      /* impress */
      PORTB = tmp ;
    }
    if ( cmd == 'i' ) {
      /* get value */
      tmp = PINC ;
      /* show */
      Serial.write(' ') ;
      for ( loopx = 0 ; loopx < 6 ; loopx++ ) {
        /* default */
        val = '0' ;
        /* judge */
        if ( tmp & 0x20 ) { val++ ; } 
        /* show */
        Serial.write(val) ;
        /* shift */
        tmp <<= 1 ;
      }
      /* new line */
      crlf();
    }
  }
}

/* receive interrupt */
void serialEvent()
{
  char ch;
  if ( Serial.available() > 0 ) {
    /* get 1 charactor */
    ch = Serial.read();
    /* store */
    sbuf[sindex] = ch ;
    /* increment */
    sindex++ ;
    /* judge */
    if ( ch == '\r' ) {
      sindex = 0 ; 
      uflag = ON ;
    }
  }
}

 コマンドを用意したので、INAにパルスを送って
 QAからQDの内容を都度、確認すればよいでしょう。

 次のように、1文字コマンドをタイプしていきます。

(under construction)

目次

inserted by FC2 system