以前に製作した、アナログデータロガー(複数PIC使用)は、多チャネルロガーを複数のPICをデイジーチェーンで接続する方式で実現しました。
今回は、1個のPICからシリアル通信(ソフトウエア方式)が複数可能かどうかを確認する意味も含めて、スター接続する方式で動作確認してみました。
1個のマスターPICに5個のスレーブPICをスター接続し、最大35チャネルのアナログデータを測定し、その結果を、マスターに接続したパソコンにデータ転送(9600bps)します。
◎マスターPIC
◎スレーブPIC
◎マスターモードとスレーブモードの切り替え
◎マスター処理
◎スレーブ処理
//********************************************************************** /* <簡易多チャネルロガー(複数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++; } } //**********************************************************************