====== ビットスコープ(簡易デジアナ) ====== ===== 概要 ===== アナログデータのロガーは、今迄何種類か製作してきました。 今回は、デジタル信号(“1"“0")を記録表示する簡易デジアナ(デジタルアナライザ)を製作してみました。 <仕様> * 入力は、1ポート(1ビット)とする。 * 測定周期は、連続、100usec、1msec、10msec、100msecの5パターンとする。 * 480ビット(60バイト)分を記録する。 * LCDへの表示は、1ページあたり48ビット(6バイト)、スイッチで10ページ分スクロール可能とする。 * 測定は、連続モード/トリガモードの2種類とする。 * トリガモードは、Hi/Lowの2種類とする。 ===== 動作原理 ===== ビットデータ(入力ポート)を、指定された周期で測定し、480ビット(60バイト)分のデータ(“1"“0")を記録し、表示します。LCDへの表示は、ページ単位(48ビット)で表示し、スイッチでページ間をアップ/ダウンさせます。 尚、LCDへの表示では、LCDの1文字(5×8)を使って3ビット分(8パターン)を表示します。従って、1行が16文字のLCDでは、48ビット(16×3)を表示させることが可能となります。 また、8種の表示パターンは、LCDのCGRAMを8バイト使用して表現します。 ※CGRAMの詳細な使い方については、CGRAM活用(キャラクタ表示LCD)を参照してください。 <メモリ構造> {{:imgpaste:202004:htmikan-20200430-103923.png}} {{:imgpaste:202004:htmikan-20200430-103934.png}} <1バイト(8ビット)とLCDの関係> {{:imgpaste:202004:htmikan-20200430-103937.png}} <測定周期と時間の関係> |<150px>| ^ 測定周期 ^ 測定時間 ^ | 連続 | - | | 100usec | 40msec | | 1msec | 480msec | | 10msec | 4.8sec | | 100msec | 48sec | ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200430-104057.png}} ===== ソースコード ===== //********************************************************************** /*   <ビットスコープ> */ //********************************************************************** #define SW_START PORTA.F2 #define SW_UP PORTA.F3 #define SW_DOWN PORTA.F4 #define SW_TRIGGER PORTA.F5 #define SW_CYCLE PORTB.F0 #define SW_MODE PORTB.F1 #define SIGNAL PORTB.F2 #define LED PORTB.F3 //********************************************************************** const char character1[] = {0,0,0,0,0,0,21,0}; const char character2[] = {1,1,1,1,1,1,21,0}; const char character3[] = {4,4,4,4,4,4,21,0}; const char character4[] = {5,5,5,5,5,5,21,0}; const char character5[] = {16,16,16,16,16,16,21,0}; const char character6[] = {17,17,17,17,17,17,21,0}; const char character7[] = {20,20,20,20,20,20,21,0}; const char character8[] = {21,21,21,21,21,21,21,0}; void RegistCustomChar() { short i; // Lcd_Custom_Cmd(64); for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character1[i]); } for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character2[i]); } for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character3[i]); } for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character4[i]); } for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character5[i]); } for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character6[i]); } for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character7[i]); } for (i = 0; i <= 7; i++) { Lcd_Custom_Chr_Cp(character8[i]); } Lcd_Custom_Cmd(LCD_RETURN_HOME); } //********************************************************************** static unsigned short cycleTime; void cycleTimeProc() { if (cycleTime == 0) return; // switch (cycleTime) { case 1: Delay_us(100); break; case 2: Delay_us(1000); break; case 3: Delay_ms(10); break; case 4: Delay_ms(100); break; } } //********************************************************************** static unsigned short data[60]; void measurement() { static short i, j, k; // for (i = 0; i < 60; i++) { k = 0x00; for (j = 0; j < 8; j++) { k |= SIGNAL; if (j < 7) k = k << 1; cycleTimeProc(); } data[i] = k; } } //********************************************************************** void display(short page) { static unsigned short i, j, k, tmp, dat[6]; // Lcd_Custom_Chr(2, 6, page + '0'); // dat[0] = data[(page * 6) + 0]; dat[1] = data[(page * 6) + 1]; dat[2] = data[(page * 6) + 2]; dat[3] = data[(page * 6) + 3]; dat[4] = data[(page * 6) + 4]; dat[5] = data[(page * 6) + 5]; // Lcd_Custom_Cmd(LCD_RETURN_HOME); tmp = 0x00; k = 0; for (i = 0; i < 6; i++) { for (j = 0; j < 8; j++) { tmp |= (dat[i] & 0b10000000) != 0 ? 1 : 0; k++; if (k == 3) { Lcd_Custom_Chr_Cp(tmp); tmp = 0x00; k = 0; } dat[i] = dat[i] << 1; tmp = tmp << 1; } } } //********************************************************************** void main() { static short cnt, page; // OSCCON = 0b01110000; // クロックを8Mhzに設定する。 ANSEL = 0b00000000; // A/D変換は使用しない。 //ポートの設定 TRISA = 0b11111111; TRISB = 0b11110111; // Lcd_Custom_Config(&PORTA,1,0,7,6,&PORTB,5,6,7); Lcd_Custom_Cmd(LCD_CURSOR_OFF); Lcd_Custom_Cmd(LCD_CLEAR); RegistCustomChar(); // Lcd_Custom_Out(1, 1, "BitScope V1"); Delay_ms(1000); Lcd_Custom_Cmd(LCD_CLEAR); // for (cnt = 0; cnt < 60; cnt++) { data[cnt] = 0x00; } page = 0; LED = 0; cycleTime = 0; // Lcd_Custom_Out(2, 1, "page=0"); Lcd_Custom_Out(2, 10, " 0usec"); // while (1) { //測定 if (SW_START == 0) { while (Button(&PORTA, 2, 1, 1) == 0) ; // LED = 1; if (SW_MODE == 0) { //トリガーモード切替 while (SIGNAL != SW_TRIGGER) ; } measurement(); LED = 0; // page = 0; display(page); } //ページ表示(ページアップ) if (SW_UP == 0) { while (Button(&PORTA, 3, 1, 1) == 0) ; // if (page < 9) page++; else page = 0; display(page); } //ページ表示(ページダウン) if (SW_DOWN == 0) { while (Button(&PORTA, 4, 1, 1) == 0) ; // if (page > 0) page--; else page = 9; display(page); } //測定周期切替 if (SW_CYCLE == 0) { while (Button(&PORTB, 0, 1, 1) == 0) ; // if (cycleTime < 4) cycleTime++; else cycleTime = 0; // switch (cycleTime) { case 0: Lcd_Custom_Out(2, 10, " 0usec"); break; case 1: Lcd_Custom_Out(2, 10, "100usec"); break; case 2: Lcd_Custom_Out(2, 10, " 1msec"); break; case 3: Lcd_Custom_Out(2, 10, " 10msec"); break; case 4: Lcd_Custom_Out(2, 10, "100msec"); break; } } } } //********************************************************************** ===== 動作確認 ===== {{:imgpaste:202004:htmikan-20200430-104257.png?500}} 入力をオープン状態(60Hzのノイズ)で、測定周期1msecで測定してみました。 その時の、ページ0~9までの測定結果です。 HiとLowの線を数えると、16~17本あるので、60Hz(17msec)をちゃんと測定していることが分かります。 {{:imgpaste:202004:htmikan-20200430-104320.png}}{{:imgpaste:202004:htmikan-20200430-104323.png}}{{:imgpaste:202004:htmikan-20200430-104327.png}}{{:imgpaste:202004:htmikan-20200430-104330.png}}{{:imgpaste:202004:htmikan-20200430-104334.png}}{{:imgpaste:202004:htmikan-20200430-104337.png}}{{:imgpaste:202004:htmikan-20200430-104342.png}}{{:imgpaste:202004:htmikan-20200430-104346.png}}{{:imgpaste:202004:htmikan-20200430-104351.png}}{{:imgpaste:202004:htmikan-20200430-104355.png}} 左側:10msec周期で測定してみました。(1msecよりも粗くなります) 右側:100usec周期で測定してみました。(1msecよりも細かくなります) {{:imgpaste:202004:htmikan-20200430-104434.png}}{{:imgpaste:202004:htmikan-20200430-104437.png}} このページは稲崎様の閉鎖したHPのコピーで、著作権は稲崎様にあります。[[elechobby:picdic:picdic|詳細]] This page is a copy of Mr. Inasaki's closed website, and the copyright is held by him.[[elechobby:picdic:picdic|Details]]