PIC

PIC16f690とMAX232でシリアル通信

2009年9月27日

PCとPICとの間で通信ができれば、マイクロコントローラを用いた回路の可能性が広がる。今時のコンピューターでは外部回路との通信にはUSBがメインだが、PIC18f14k50などを用いれば、これができるらしい。他には、FT232Rなどを用いた方法があるようだ。これらの方法は、USB用のドライバを用意する必要があるという点で、少し敷居が高い。少し勉強して、後ほどトライすることにしたい。

今やろうとしているのは、MAX232を用いてRS232Cで通信する方法。今使っているノートパソコンにはRS232Cの端子は無いのだが、USB→RS232C変換機を用いてRS232Cのシリアル通信を行うことができる。

PIC16f690とMAX232

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

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のサンプルコードでは、入出力用のバッファの使い方なども記述されている。スピードの速いデータのやり取りの場合は、そういったコードを参考にしてすこし書き換えすることが必要のようだ。

さあ、これでオシロスコープができるかな。

コメント

kat (2009年10月9日 16:27:31)

8000000/(16*38400)-1=12.02
だから、CLK=8MHz, SPBRG=12で、38.4kbpsで使えるのかな?あとで実験してみよう。

Kat (2009年10月10日 13:24:29)

あと、消費電力との兼ね合いで
500000/(16*1200)-1=25.04
とか、
125000/(16*300)-1=25.04
とかで使えそう。

コメント送信