====== 簡易多チャネルロガー(複数PIC/35チャネル) ====== ===== 概要 ===== 以前に製作した、アナログデータロガー(複数PIC使用)は、多チャネルロガーを複数のPICをデイジーチェーンで接続する方式で実現しました。 今回は、1個のPICからシリアル通信(ソフトウエア方式)が複数可能かどうかを確認する意味も含めて、スター接続する方式で動作確認してみました。 {{:imgpaste:202004:htmikan-20200430-155232.png?500}} ===== 動作原理 ===== 1個のマスターPICに5個のスレーブPICをスター接続し、最大35チャネルのアナログデータを測定し、その結果を、マスターに接続したパソコンにデータ転送(9600bps)します。 ===== 動作原理(ハードウェア) ===== ◎マスターPIC * パソコンとの接続\\ PIC内蔵のUSARTモジュールを使用して、パソコンとの通信を行います。(9600bps、8ビット、ノンパリティ) * スレーブPICとの接続\\ I/Oポートを使用して、ソフトウエア的にUSART通信を行います。(9600bps、8ビット、ノンパリティ)\\ スレーブPICを5個接続するために、10個のI/Oポートを使用します。(Rx1~Rx5、Tx1~Tx5) ◎スレーブPIC * アナログ入力\\ 内蔵のA/D変換モジュールのAN0~AN6までの、7チャネルを使用します。\\ 入力電圧範囲は、0V~5Vで、分解能は、約4.9mVになります。 * マスターPICとの接続\\ PIC内蔵のUSARTモジュールを使用して、マスターPICとの通信を行います。(9600bps、8ビット、ノンパリティ) ===== 動作原理(ソフトウェア) ===== ◎マスターモードとスレーブモードの切り替え * 起動時に、スイッチ(SW_MODE)をオンにするとマスターモードとなり、オフにするとスレーブモードとなります。 ◎マスター処理 * パソコン接続用にUSARTモジュールを初期化します。 * アナログチャネルを全て未使用に設定します。 * スイッチ(SW_START_STOP)が押下されるのを待ちます。 * スレーブ接続用のポートをシリアルポートとして初期化します。 * スレーブ(1)にデータ‘!'を送信します。 * スレーブ(1)からのデータを受信します。(データの終端は、0x00です) * 受信したデータをパソコン側にデータ転送します。 * スレーブ(2)~(5)も、(1)同様の処理を行います。 {{:imgpaste:202004:htmikan-20200430-155525.png}} ◎スレーブ処理 * マスター接続用にUSARTモジュールを初期化します。 * アナログチャネルを全て使用に設定します。 * マスターからのデータ‘!'を受信します。 * 全てのアナログチャネルのデータをA/D変換して取り込み、電圧値に換算し、文字列変換します。 * 文字列変換されたデータをマスターに送信します。 ===== 回路図 ===== {{:imgpaste:202004:htmikan-20200430-155542.png}} ===== ソースコード ===== //********************************************************************** /*   <簡易多チャネルロガー(複数PIC/35チャネル)> */ //********************************************************************** sbit SW_MODE at RA5_bit; sbit SW_START_STOP at RA6_bit; sbit LED at RA7_bit; #define CR 0x0D #define LF 0x0A //********************************************************************** extern void main(); extern void master(); extern void slave(); extern void UART1_Write_Text_Ex(char * UART_text); extern void collection(char *msg); //********************************************************************** char error, rdt, sdt, buf[40]; //********************************************************************** //■メイン関数 void main() { short cnt; // OSCCON = 0b01110000; TRISA = 0b01111111; TRISB = 0b11111111; // UART1_Init(9600); if (SW_MODE == 1) { ANSEL = 0b00000000; } else { ANSEL = 0b01111111; ADC_Init(); } // for (cnt = 0; cnt < 10; cnt++) { LED = 1; Delay_ms(50); LED = 0; Delay_ms(50); } // while (1) { if (SW_MODE == 1) { master(); } else { slave(); } } } //********************************************************************** void master() { short mode; // mode = 0; while (1) { if ((SW_START_STOP == 0) && (mode == 0)) { mode = 1; LED = 1; while (SW_START_STOP == 0) { Delay_ms(100); } } // if ((SW_START_STOP == 0) && (mode == 1)) { mode = 0; LED = 0; while (SW_START_STOP == 0) { Delay_ms(100); } } // if (mode == 0) { continue; } // error = Soft_UART_Init(&PORTA, 0, 1, 9600, 0); collection(buf); UART1_Write_Text(buf); // error = Soft_UART_Init(&PORTA, 2, 3, 9600, 0); collection(buf); UART1_Write_Text(buf); // error = Soft_UART_Init(&PORTB, 0, 1, 9600, 0); collection(buf); UART1_Write_Text(buf); // error = Soft_UART_Init(&PORTB, 3, 4, 9600, 0); collection(buf); UART1_Write_Text(buf); // error = Soft_UART_Init(&PORTB, 6, 7, 9600, 0); collection(buf); UART1_Write_Text(buf); UART1_Write_Text("\r\n"); } } //********************************************************************** void slave() { short cnt; int ad; // while (1) { if (UART1_Data_Ready() != 1) { continue; } rdt = UART1_Read(); if (rdt != '!') { continue; } LED = 1; for (cnt = 0; cnt < 7; cnt++) { ad = ADC_Get_Sample(cnt); ad *= 4.8828125; WordToStr(ad, &buf[cnt * 5]); } LED = 0; buf[35] = 0x00; UART1_Write_Text_Ex(buf); } } //********************************************************************** void UART1_Write_Text_Ex(char * UART_text) { while (*UART_text != 0x00) { UART1_Write(*UART_text); UART_text++; Delay_ms(10); } UART1_Write(0x00); } //********************************************************************** void collection(char *msg) { short cnt; // Soft_UART_Write('!'); cnt = 0; while (1) { msg[cnt] = Soft_UART_Read(&error); if (msg[cnt] == 0x00) { break; } cnt++; } } //********************************************************************** ===== 動作確認 ===== 中央のPICがマスターです。下部の5個のPICがスレーブです。 上側の小さな基板(トランジスタ+抵抗)でRS232Cのレベル変換を行いパソコンに接続します。 {{:imgpaste:202004:htmikan-20200430-155640.png?500}} Windows標準の通信ソフト(ハイパーターミナル)でデータを受信します。 1件分のデータが長いので、ハイパーターミナル上は、1件3行で表示されます。 テキストキャプチャしたログファイル上は、1件1行になります。 {{:imgpaste:202004:htmikan-20200430-155651.png?500}} 受信したデータを、Excelでグラフ表示させて見ました。 {{:imgpaste:202004:htmikan-20200430-155700.png?500}} このページは稲崎様の閉鎖した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]]