先のエントリでチップ型の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にしてたら動かなかったし。