PIC16f690とMAX232でシリアル通信
2009年9月27日
PCとPICとの間で通信ができれば、マイクロコントローラを用いた回路の可能性が広がる。今時のコンピューターでは外部回路との通信にはUSBがメインだが、PIC18f14k50などを用いれば、これができるらしい。他には、FT232Rなどを用いた方法があるようだ。これらの方法は、USB用のドライバを用意する必要があるという点で、少し敷居が高い。少し勉強して、後ほどトライすることにしたい。
今やろうとしているのは、MAX232を用いてRS232Cで通信する方法。今使っているノートパソコンにはRS232Cの端子は無いのだが、USB→RS232C変換機を用いてRS232Cのシリアル通信を行うことができる。

MAX232を久しぶりに使うので、上記の回路図で試す前に色々とテストを行った。

通信には、PuTTYを使用。左の回路図は、単に入力をそのままコールバックするもの。これが正常に働くことを確認して、右の回路を組んだ。これも、正常に動作。
つづけて、PIC16f690をつなげてみた(記事の始めの回路図)。MicrochipのAN774を参考に組んだプログラムが、次のとおり。とりあえず、クロック4Mhzでボーレートを9600に指定して実行している。
ちゃんとPICを介してコールバックしているかどうかの確認として、アルファベット大文字のA-YはB-Zに変換して(一文字ずつ、ずらして)返すようにしてある。この変換もちゃんと動いた。意外とすんなり動いたので、ちょっとびっくり。マイクロコントローラが安くて便利なのにも、驚きだ。
AN774のサンプルコードでは、入出力用のバッファの使い方なども記述されている。スピードの速いデータのやり取りの場合は、そういったコードを参考にしてすこし書き換えすることが必要のようだ。
さあ、これでオシロスコープができるかな。
今やろうとしているのは、MAX232を用いてRS232Cで通信する方法。今使っているノートパソコンにはRS232Cの端子は無いのだが、USB→RS232C変換機を用いてRS232Cのシリアル通信を行うことができる。

MAX232を久しぶりに使うので、上記の回路図で試す前に色々とテストを行った。

通信には、PuTTYを使用。左の回路図は、単に入力をそのままコールバックするもの。これが正常に働くことを確認して、右の回路を組んだ。これも、正常に動作。
つづけて、PIC16f690をつなげてみた(記事の始めの回路図)。MicrochipのAN774を参考に組んだプログラムが、次のとおり。とりあえず、クロック4Mhzでボーレートを9600に指定して実行している。
#include <pic.h>
__CONFIG(INTIO & WDTDIS & PWRTDIS & MCLRDIS & UNPROTECT & BORDIS & IESODIS & FCMDIS);
unsigned char changeChar(unsigned char org){
if (0x41<=org && org<=0x59) return org+1;
return org;
}
void interrupt int_function (void) {
static unsigned char data;
static unsigned char data_received=0;
static unsigned char write_ok=0;
if (RCIF && RCIE) {
if (OERR) { // test overrun error flag
CREN=0; // reset the receiver logic
CREN=1; // enable reception again
return;
}
if (FERR) { // test framing error flag
data=RCREG; //discard received data that has error
data_received=0;
return;
}
if (write_ok) {
TXREG=changeChar(RCREG);
write_ok=0;
data_received=0;
} else {
data=changeChar(RCREG);
data_received=1;
}
} else if (TXIF && TXIE) {
if (data_received) {
TXREG=data;
data_received=0;
write_ok=0;
} else write_ok=1;
}
}
void main(){
// Disable all interrupt events
INTCON=0;
// all output except for RA4 and RB5
TRISA=0x10;
TRISB=0x20;
TRISC=0;
// Non-analog mode
ANSEL=0x00;
ANSELH=0x00;
// Serial settins follow
OSCCON=0x60;// CLK=4 MHz
SPBRG=25; // 4000000/(16x9600)-1=25.04
TXSTA=0x24; // enable transmission and high baud rate
RCSTA=0x90; // enable serial port and reception
// Intterupt settings follow
INTCON=0xc0; //enable global and peripheral ints
PIE1=0x30; //enable TX and RX interrupts
}ちゃんとPICを介してコールバックしているかどうかの確認として、アルファベット大文字のA-YはB-Zに変換して(一文字ずつ、ずらして)返すようにしてある。この変換もちゃんと動いた。意外とすんなり動いたので、ちょっとびっくり。マイクロコントローラが安くて便利なのにも、驚きだ。
AN774のサンプルコードでは、入出力用のバッファの使い方なども記述されている。スピードの速いデータのやり取りの場合は、そういったコードを参考にしてすこし書き換えすることが必要のようだ。
さあ、これでオシロスコープができるかな。