PIC16F1827のシリアル通信のテストをします。
PIC16F1827では、シリアル通信に使うピンを選ぶことができます。
TXピンの選択は、APFCON1レジスタのTXCKSELで行い、TXCKSEL=0でRB2が、TXCKSEL=1でRB5が選択されます。
RXピンの選択は、APFCON0レジスタのRXDTSELで行い、RXDTSEL=0でRB1が、RXDTSEL=1でRB2が選択されます。
今回は、TXCKSEL=0,RXFTSEL=0として、TX=RB2,RX=RB1とします。
回路です。
Image may be NSFW.
Clik here to view.
Clik here to view.

USBシリアル変換モジュールFT234Xを接続して、パソコンの通信ソフトTeraTermとの間での通信をテストします。
ブレッドボードです。
Image may be NSFW.
Clik here to view.
Clik here to view.

クロックは最高速度32MHzで動作させ、Baud Rate Generatorの設定は、BRGH=1,BRG16=1としました。
TeraTermとの通信テストでは、300bps~230400bpsで通信可能でした。
Image may be NSFW.
Clik here to view.
Clik here to view.

プログラムです。
TeraTermから送られた文字を受信し、同じ文字を送り返す、いわゆるエコーバックのプログラムです。
-------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdlib.h>
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
// CONFIG2
#pragma config WRT = OFF
#pragma config PLLEN = ON
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
#pragma config WRT = OFF
#pragma config PLLEN = ON
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
#define _XTAL_FREQ 32000000 //クロック32MHz
/* TX=RB2,RX=RB1に設定
*
*/
*
*/
void serial_init(unsigned long BR){
TXSTA = 0x24; //SYNC=0 TXEN = 1 BRGH = 1
BRG16 = 1; //BRG 16bit mode
RCSTA = 0x90; //非同期、継続受信可
unsigned int X= _XTAL_FREQ/BR/4 - 1;
SPBRGH = X / 256;
SPBRGL = X % 256;
}
TXSTA = 0x24; //SYNC=0 TXEN = 1 BRGH = 1
BRG16 = 1; //BRG 16bit mode
RCSTA = 0x90; //非同期、継続受信可
unsigned int X= _XTAL_FREQ/BR/4 - 1;
SPBRGH = X / 256;
SPBRGL = X % 256;
}
void putch(unsigned char byte){
while(!TXIF);
TXREG = byte;
}
while(!TXIF);
TXREG = byte;
}
unsigned char getch(){
while(!RCIF);
return RCREG;
}
while(!RCIF);
return RCREG;
}
unsigned char getche(){
unsigned char c;
c = getch();
putch(c);
return c;
}
unsigned char c;
c = getch();
putch(c);
return c;
}
void main() {
OSCCON = 0b01110000 ; // 内部クロック8MHz PLL ONで8×4=32MHz
ANSELA = 0b00000000 ; // AN0-AN4は使用しない
ANSELB = 0b00000000 ; // AN5-AN11は使用しない
TRISA = 0b00000000 ; // PORTAは全て出力(RA5は入力)
TRISB = 0b00000010 ; // RB1(RX) 入力 他は出力
PORTA = 0b00000000 ; // PORTA初期化
PORTB = 0b00000000 ; // PORTB初期化
/* USARTの設定 */
TXCKSEL = 0; // TX=RB2
RXDTSEL = 0; // RX=RB1
serial_init(9600); // Serial通信初期化とBaud Rateの設定
OSCCON = 0b01110000 ; // 内部クロック8MHz PLL ONで8×4=32MHz
ANSELA = 0b00000000 ; // AN0-AN4は使用しない
ANSELB = 0b00000000 ; // AN5-AN11は使用しない
TRISA = 0b00000000 ; // PORTAは全て出力(RA5は入力)
TRISB = 0b00000010 ; // RB1(RX) 入力 他は出力
PORTA = 0b00000000 ; // PORTA初期化
PORTB = 0b00000000 ; // PORTB初期化
/* USARTの設定 */
TXCKSEL = 0; // TX=RB2
RXDTSEL = 0; // RX=RB1
serial_init(9600); // Serial通信初期化とBaud Rateの設定
while(1){
getche();
}
getche();
}
}