2014年12月14日日曜日

8pino(Trinket)でデバッグするには? How to debugging for 8pino(trinket)

8pinoでは、シリアルモニターが使えません。シリアルモニターはデバッグするのにとても
大事な機能です。
せめて、大昔のマイコンボードの様に7SEGで内部データを16進表示させる事が出来れば
何とかなります。
手元にあった、7SEG表示器1個とHC4040バイナリカウンタで内部データを表示できる様
にしてみました。
8pino(Trinket) does not have a Serial port connection for debugging. 
Serial port monitor is the function important to do debugging.
An 7SEG LED display attached to an old microcomputer board. 
It indicated the inner data. 
I have one 7SEG LED and HC4040 binary counter. 
I made an 7SEG display using those.

HC4040はバイナリの12bitカウンタで、CLK入力の立ち下がりでカウント、RES入力の
立ち上がりでカウンタをリセットします。
これを使って7SEGLEDを点灯させるアイデアは大昔からあると思うので割愛します。例えば、
HC4040 is 12bit binary counter. It have CLK(clock) input and RESET input.
The idea that LED drive using it existed in that from the past. For example...

このプログラムは、アナログ入力1に取り付けた可変抵抗器の値(0〜3.3V、数値は0〜1023)
を16進にして、7SEGLEDに表示します。
但し一桁しか無いので、一桁ずつ、ゆっくりと表示させます。
例えば、可変抵抗器を最大にした時は1023=0x03FFとなりますので、
0 3 3 F - - - - 
と表示されます。- - - - と言うのは、データの区切りを示しています。
This program is display an analog input ch1 encoding hex data.  
It's indicated each one digit slowly.
For example in case of maximum voltage, it's indicate as follows,
0 3 3 F - - - - 
"- - - -" is data delimiter.

これを使えば、"少しは" デバッグが楽になります。
When this is used, debugging becomes easy. 
(Very little)



// 8pino 7segment drive test /w MC14040BCP
// Analogdata display
//
// [回路図 Circuit diagram]
// [8Pino]      [4040]         [LA-301VL]
// GPIO(1) ---> CLK
// GPIO(0) ---> CLR
//              Q0     -470R-> SEG a
//              Q1     -470R-> SEG b
//              Q2     -470R-> SEG c
//              Q3     -470R-> SEG d
//              Q4     -470R-> SEG e
//              Q5     -470R-> SEG f
//              Q6     -470R-> SEG g
// A/D(1)  ---> Triimer register
//
// バイナリカウンタを使った7セグメントLEDの駆動実験
// 指定のパルスを出す事により、各セグメントをスタティック点灯させる。
// 例えば、"1" を点灯させるには、SEG b と SEG c を点灯させる為に、2+4=6回パルス発生する。
// パルスを送る前に、CLRをHにしてカウンタをクリアしておく事。 
// A 7segment LED drive test with binaly counter.
// Drive on each segment at static state with several pulse signal.
// For example,When you'd like display a "1", you turn on SEG b and SEG c.
// Before sending a data pulse, you send a pulse to CLR.
// Define bacic binaly data
#define seg_A 1    //0000 0001
#define seg_B 2    //0000 0010
#define seg_C 4    //0000 0100
#define seg_D 8    //0000 1000
#define seg_E 16   //0001 0000
#define seg_F 32   //0010 0000
#define seg_G 64   //0100 0000
// Define 7 segment charactor
#define CHR_0 seg_A + seg_B + seg_C + seg_D + seg_E + seg_F + 0
#define CHR_1         seg_B + seg_C
#define CHR_2 seg_A + seg_B         + seg_D + seg_E         + seg_G
#define CHR_3 seg_A + seg_B + seg_C + seg_D                 + seg_G
#define CHR_4         seg_B + seg_C                 + seg_F + seg_G
#define CHR_5 seg_A         + seg_C + seg_D         + seg_F + seg_G
#define CHR_6 seg_A         + seg_C + seg_D + seg_E + seg_F + seg_G
#define CHR_7 seg_A + seg_B + seg_C
#define CHR_8 seg_A + seg_B + seg_C + seg_D + seg_E + seg_F + seg_G
#define CHR_9 seg_A + seg_B + seg_C                 + seg_F + seg_G
#define CHR_A seg_A + seg_B + seg_C         + seg_E + seg_F + seg_G
#define CHR_B                 seg_C + seg_D + seg_E + seg_F + seg_G
#define CHR_C seg_A                 + seg_D + seg_E + seg_F
#define CHR_D         seg_B + seg_C + seg_D + seg_E         + seg_G
#define CHR_E seg_A                 + seg_D + seg_E + seg_F + seg_G
#define CHR_F seg_A                         + seg_E + seg_F + seg_G
#define CHR_BAR seg_G
// Variable settings
int led = 1;  // On board LED (pin 1)
int vol = 1;  // Analog input 1(pin 2)
unsigned int vol_num;  // Analog value
int cnt;      // Counter
int res = 0;  // reset = #0
int value;    // output value
int max_value;
// Character dimensions
int CHR[] = {CHR_0,CHR_1,CHR_2,CHR_3,CHR_4,CHR_5,CHR_6,CHR_7,CHR_8,CHR_9,CHR_A,CHR_B,CHR_C,CHR_D,CHR_E,CHR_F,CHR_BAR};
int i;
// GPIO direction
void setup() {
   pinMode(led, OUTPUT); //4040 CLK pin(/w onboard LED)
   pinMode(res, OUTPUT); //4040 CLR pin
   //pinMode(vol, INPUT); // An analog input is default.
}
// 7segment drive
// 引数:キャラクタ配列の順番(0=0,1=1,2=2,....F=15,...)
// 戻り:なし
// 動作: 1)CLRパルスを出す。
//       2)キャラクタ配列の数値を取り出し、その回数のCLKパルスを出す。
//       3)500ms表示する。
// Arg:Number of character dimension.
// Ret:non
// Function:1)Send CLR pulse.
//          2)Read number of character dimension, and send pulse.
//          3)Display character between 500ms.
void disp_7seg( int disp_num){
   int max;                      //Quantity of the pulse
   max = CHR[disp_num];          //Set Q'ty of the pulse
   digitalWrite(res,HIGH);       //CLR on pulse
   delayMicroseconds(3);         //CLR on pulse time.
   digitalWrite(res,LOW);        //CLR off
   delayMicroseconds(3);         //CLR off time.
   delay(200);                   //Time of the turn off the light.
   for (cnt=0;cnt < max;cnt++){  //Loop on max times.
     digitalWrite(led,HIGH);     //Pulse on
     delayMicroseconds(3);       //Pulse on time.
     digitalWrite(led,LOW);      //Pulse off
     delayMicroseconds(3);       //Pulse off time.
   }
   delay(300);                   //Time of the display charactor.
}
// Divide data to 4 figure
// Arg:hex_data
// Ret:4th digit number
unsigned int dec2hex_4(unsigned int num){
   unsigned int result;
   result = num/0x1000;
   return result;
}
// Arg:hex_data
// Ret:3rd digit number
unsigned int dec2hex_3(unsigned int num){
   unsigned int result;
   result = (num-dec2hex_4(num)*0x1000)/0x100;
   return result;
}
// Arg:hex_data
// Ret:2nd digit number
unsigned int dec2hex_2(unsigned int num){
   unsigned int result;
   result = (num-dec2hex_4(num)*0x1000-dec2hex_3(num)*0x100)/0x10;
   return result;
}
// Arg:hex_data
// Ret:1st digit number
unsigned int dec2hex_1(unsigned int num){
   unsigned int result;
   result = num-dec2hex_4(num)*0x1000-dec2hex_3(num)*0x100-dec2hex_2(num)*0x10;
   return result;
}
// 7Segment Display 4 digit number.
// Arg:hex_data
// Ret:non
void seg_Display(unsigned int num){
   disp_7seg(dec2hex_4(num));        // Display 4th char.
   disp_7seg(dec2hex_3(num));        // Display 3rd char.
   disp_7seg(dec2hex_2(num));        // Display 2nd char.
   disp_7seg(dec2hex_1(num));        // Display 1st char.
   disp_7seg(16);       // Display ---
   disp_7seg(16);       // Display ---
   disp_7seg(16);       // Display ---
   disp_7seg(16);       // Display ---
}
void loop() {
// The 4 character display demonstration.
   vol_num = analogRead(1);    // Trrimer volume read.
   seg_Display(vol_num);        // Display 4 degit
   delay(1000);               // Wait
}

Evernote はあなたがすべてを記憶し、手間をかけずに整理できるようにお手伝いします。Evernote をダウンロードする

0 件のコメント:

コメントを投稿

コメントをどうぞ