FT232RL USBシリアル変換モジュールを使ってPICのデバッグ

先のエントリでチップ型のFT232RLを使った変換器を完成できなかったので
秋月のモジュールを使って再度試します。

ピンアサインは以下のように。
http://amahime.main.jp/ft232rl/main.php?name=ft232rl


PIC16F628Aのピンアサインは以下。
シリアル(TX/RX)はそれぞれRB2とRB1

以下はPIC16F628Aを使った時のコード

#include<htc.h>
//#define _LEGACY_HEADERS
__CONFIG(
        MCLRE_OFF  //内部リセット回路を使用
        & PWRTE_ON  //パワーアップタイマを使用
        & BOREN_OFF  //ブラウンアウトリセットを使用しない
        & CP_OFF  //プログラムをプロテクトしない
        & WDTE_OFF  //ウォッチドッグタイマを使わない
        & FOSC_INTOSCCLK //内部クロック生成器を使用
        & LVP_OFF //低電圧モードをオフ(これをしないとリセットがかかる)
                      //→RB4/PGMをGNDにつなぐと何故か解決
        );

    __IDLOC(628A);

#define SCI_PINIT() TRISB |= 0b00000010
#define SCI_SPBRG 51 //BRGH = 1 高速 Fosc = 8MHz
//#define SCI_SPBRG 25 //BRGH = 1 高速 Fosc = 4MHz
//#define SCI_SPBRG 5.5 //BRGH = 0 低速 Fosc = 4MHz
#define XON 17
#define XOFF 19



unsigned char xf;
unsigned char rbuf[16];
unsigned char wp;
unsigned char rp;
unsigned char dc;

void interrupt entry(void) {
    unsigned char c;
    if(RCIF){
        c = RCREG;
        if(c==XON || c == XOFF) {
            xf = c;
            return;
        }
        if(dc=16) return;
        rbuf[wp] = c;
        wp++;
        wp &= 15;
        dc ++;
        if(dc == 12) {
            while(TXIF == 0);
            TXREG = XOFF;
        }
    }
}

void sci_init(void) {
    wp = 0;
    rp = 0;
    dc = 0;
    xf = XON;

    SCI_PINIT();

    SPBRG = SCI_SPBRG;
    TXSTA = 0b00100100;
    RCSTA = 0b10010000;
    RCIE = 1;
}

unsigned char getch(void){
    unsigned char c;
    while(dc == 0);
    RCIE = 0;
    c = rbuf[rp];
    rp++;
    rp &+ 15;
    dc --;
    if(dc == 12) {
        while(TXIF == 0);
        TXREG = XON;
    }
    RCIE = 1;
    return(c);
}

void putch(unsigned char c) {
    while(xf == XOFF);
    while(TXIF == 0);
    TXREG = c;
}

void main(void){
    //OSCCON = 0b01110000;
    //OSCTUNE = 0;

    PCON = 0b00001000; //内部クロックを4MHzに指定
    sci_init();
    PEIE = 1;
    ei();

    while(1)
        putch(getch());
}

『PICとC言語の電子工作』から改変したところは以下

(1)TRISBの設定は、TX(RB2)を0,RX(RB1)を1に設定する。

つまり、

#define SCI_PINIT() TRISB |= 0b00000010

本によればTXとRXを両方とも1にしてたけど、
TXは出力だからゼロだと思う。1にしてたら動かなかったし。

(2)OSCCONとOSCTUNEの設定はコメントアウト

代わりに

PCON = 0b00001000;

を設定。
(1のビット(OSCFビット)で内部クロックの周波数を4MHzに設定している。
デフォルトは48kHz)
※(参考)PCONレジスタ