目次
前
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)
目次
前